dever 3 years ago
parent
commit
d0663032fb
100 changed files with 27177 additions and 17 deletions
  1. 4 16
      App.vue
  2. 69 0
      lib/GraceUI5/components/gui-action-sheet.vue
  3. 126 0
      lib/GraceUI5/components/gui-area-picker.vue
  4. 177 0
      lib/GraceUI5/components/gui-article-info.vue
  5. 68 0
      lib/GraceUI5/components/gui-article-list.vue
  6. 206 0
      lib/GraceUI5/components/gui-audio-player.vue
  7. 79 0
      lib/GraceUI5/components/gui-box-banner.vue
  8. 563 0
      lib/GraceUI5/components/gui-calendar.js
  9. 203 0
      lib/GraceUI5/components/gui-calendar.vue
  10. 192 0
      lib/GraceUI5/components/gui-car-number.vue
  11. 102 0
      lib/GraceUI5/components/gui-choose-images.vue
  12. 151 0
      lib/GraceUI5/components/gui-count-down.vue
  13. 59 0
      lib/GraceUI5/components/gui-coupons.vue
  14. 164 0
      lib/GraceUI5/components/gui-date-between.vue
  15. 100 0
      lib/GraceUI5/components/gui-datetime-between.vue
  16. 167 0
      lib/GraceUI5/components/gui-datetime-bt-base.vue
  17. 339 0
      lib/GraceUI5/components/gui-datetime.vue
  18. 26 0
      lib/GraceUI5/components/gui-demo-banner.vue
  19. 22 0
      lib/GraceUI5/components/gui-demo-desc.vue
  20. 11 0
      lib/GraceUI5/components/gui-demo-header.vue
  21. 31 0
      lib/GraceUI5/components/gui-demo-list.vue
  22. 236 0
      lib/GraceUI5/components/gui-editor.vue
  23. 11 0
      lib/GraceUI5/components/gui-empty.vue
  24. 61 0
      lib/GraceUI5/components/gui-face-group.vue
  25. 47 0
      lib/GraceUI5/components/gui-header-leading.vue
  26. 169 0
      lib/GraceUI5/components/gui-im-input.vue
  27. 159 0
      lib/GraceUI5/components/gui-im-message.vue
  28. 56 0
      lib/GraceUI5/components/gui-image.vue
  29. 135 0
      lib/GraceUI5/components/gui-interval-slider.vue
  30. 42 0
      lib/GraceUI5/components/gui-iphone-bottom.vue
  31. 51 0
      lib/GraceUI5/components/gui-link.vue
  32. 86 0
      lib/GraceUI5/components/gui-loadmore.vue
  33. 58 0
      lib/GraceUI5/components/gui-modal.vue
  34. 26 0
      lib/GraceUI5/components/gui-mp-menu-spacing.vue
  35. 53 0
      lib/GraceUI5/components/gui-number-animate.vue
  36. 120 0
      lib/GraceUI5/components/gui-number-keyboard.vue
  37. 74 0
      lib/GraceUI5/components/gui-order.vue
  38. 154 0
      lib/GraceUI5/components/gui-page-loading.vue
  39. 419 0
      lib/GraceUI5/components/gui-page.vue
  40. 92 0
      lib/GraceUI5/components/gui-pk.vue
  41. 111 0
      lib/GraceUI5/components/gui-popup-menu.vue
  42. 245 0
      lib/GraceUI5/components/gui-popup.vue
  43. 45 0
      lib/GraceUI5/components/gui-product-list.vue
  44. 108 0
      lib/GraceUI5/components/gui-progress-scrollview.vue
  45. 83 0
      lib/GraceUI5/components/gui-radio.vue
  46. 125 0
      lib/GraceUI5/components/gui-refresh.vue
  47. 74 0
      lib/GraceUI5/components/gui-right-menus.vue
  48. 213 0
      lib/GraceUI5/components/gui-schedule.vue
  49. 70 0
      lib/GraceUI5/components/gui-scroll-message.vue
  50. 113 0
      lib/GraceUI5/components/gui-scrollitems-y.vue
  51. 102 0
      lib/GraceUI5/components/gui-scrollitems.vue
  52. 95 0
      lib/GraceUI5/components/gui-search.vue
  53. 47 0
      lib/GraceUI5/components/gui-segmented-control.vue
  54. 103 0
      lib/GraceUI5/components/gui-select-list.vue
  55. 168 0
      lib/GraceUI5/components/gui-select-menu.vue
  56. 132 0
      lib/GraceUI5/components/gui-single-slider.vue
  57. 36 0
      lib/GraceUI5/components/gui-skeleton.vue
  58. 136 0
      lib/GraceUI5/components/gui-slide-list.vue
  59. 95 0
      lib/GraceUI5/components/gui-slide-to-unlock.vue
  60. 44 0
      lib/GraceUI5/components/gui-speaker.vue
  61. 62 0
      lib/GraceUI5/components/gui-spread.vue
  62. 115 0
      lib/GraceUI5/components/gui-stags.vue
  63. 50 0
      lib/GraceUI5/components/gui-star.vue
  64. 117 0
      lib/GraceUI5/components/gui-step-box.vue
  65. 202 0
      lib/GraceUI5/components/gui-submit-button.vue
  66. 106 0
      lib/GraceUI5/components/gui-submit-comment.vue
  67. 157 0
      lib/GraceUI5/components/gui-swiper.vue
  68. 113 0
      lib/GraceUI5/components/gui-switch-navigation.vue
  69. 101 0
      lib/GraceUI5/components/gui-switch-navigation2.vue
  70. 52 0
      lib/GraceUI5/components/gui-tags.vue
  71. 96 0
      lib/GraceUI5/components/gui-top-message.vue
  72. 61 0
      lib/GraceUI5/components/gui-totop.vue
  73. 130 0
      lib/GraceUI5/components/gui-touch.vue
  74. 138 0
      lib/GraceUI5/components/gui-tree.vue
  75. 173 0
      lib/GraceUI5/components/gui-turntable.vue
  76. 248 0
      lib/GraceUI5/components/gui-upload-images.vue
  77. 0 0
      lib/GraceUI5/css/animate.css
  78. 168 0
      lib/GraceUI5/css/colors.css
  79. 307 0
      lib/GraceUI5/css/graceUI.css
  80. 4 0
      lib/GraceUI5/css/iconsforbaidu.css
  81. 12548 0
      lib/GraceUI5/data/city-data/area.js
  82. 434 0
      lib/GraceUI5/data/city-data/city.js
  83. 38 0
      lib/GraceUI5/data/city-data/province.js
  84. 742 0
      lib/GraceUI5/data/cityData.js
  85. 106 0
      lib/GraceUI5/demoData/article.js
  86. 100 0
      lib/GraceUI5/demoData/cateChange.js
  87. 65 0
      lib/GraceUI5/demoData/data.js
  88. 70 0
      lib/GraceUI5/demoData/immessages.js
  89. 1265 0
      lib/GraceUI5/js/WeCropper.js
  90. 410 0
      lib/GraceUI5/js/barcode.js
  91. 113 0
      lib/GraceUI5/js/checker.js
  92. 391 0
      lib/GraceUI5/js/grace.js
  93. 385 0
      lib/GraceUI5/js/md5.js
  94. 252 0
      lib/GraceUI5/js/parserHTML.js
  95. 262 0
      lib/GraceUI5/js/qrcode.js
  96. 57 0
      lib/GraceUI5/js/request/config.js
  97. 312 0
      lib/GraceUI5/js/request/request.js
  98. 44 0
      lib/GraceUI5/js/string.js
  99. 130 0
      lib/GraceUI5/skin/black.css
  100. 0 1
      lib/colorui/main.css

+ 4 - 16
App.vue

@@ -47,23 +47,11 @@ export default {
 	onShow: function() {},
 	onHide: function() {}
 };
-</script>
-<style lang="scss">
-/*每个页面公共css */
-@import './static/styles/app.scss';
-</style>
+</script>
 <style>
-@import './static/layer/theme/default/layer.css';
-@import './lib/colorui/main.css';
-@import './lib/colorui/icon.css';
-@import './lib/colorui/animation.css';
-/* #ifndef APP-PLUS-NVUE */
-@import './lib/graceUI/graceUI.css';
-@import './lib/graceUI/graceIcons.css';
-/* #endif */
-/* #ifdef APP-PLUS-NVUE */
-@import './lib/graceUI/graceWeex.css';
-/* #endif */
+@import '@/static/dreamland/css/core.css';
+@import "./lib/GraceUI5/css/graceUI.css";
+@import "./lib/GraceUI5/skin/black.css";
 @import './lib/dever/dever.css';
 /*body {font-family:"NSimSun"}*/
 page{background-color: #ffffff;}

+ 69 - 0
lib/GraceUI5/components/gui-action-sheet.vue

@@ -0,0 +1,69 @@
+<template>
+	<gui-popup ref="guipopupforacsheet" 
+	position="bottom" :canCloseByShade="canCloseByShade">
+		<view  
+		:style="{'margin-bottom':'25rpx','margin-left':((750-width)/2)+'rpx'}"
+		@tap.stop.prevent="stopfun">
+			<view class="gui-bg-white"
+			:style="{width:width+'rpx', height:(height+100)+'rpx', borderRadius:borderRadius}">
+				<text class="gui-action-sheet-title gui-block-text gui-border-b" 
+				:style="{color:titleColor}">{{title}}</text>
+				<scroll-view scroll-y="true" class="gui-border-box" 
+				:style="{width:width+'rpx', height:height+'rpx', paddingTop:'20rpx', paddingBottom:'20rpx'}">
+					<text class="gui-text-center gui-block-text gui-border-b" 
+					v-for="(item, index) in items" :key="index" 
+					@tap.stop="selected" :data-index="index" 
+					:style="{ color:listColor, lineHeight:listLineHeight, fontSize:listFontSize}">{{item}}</text>
+					<text class="gui-text-center gui-block-text" 
+					:style="{color:cancelBtnColor, lineHeight:listLineHeight, fontSize:listFontSize, marginTop:'10rpx'}" 
+					v-if="isCancelBtn" @tap.stop="cancel">{{cancelBtnName}}</text>
+				</scroll-view>
+			</view>
+			<!-- iphone 底部操作按钮躲避 -->
+			<gui-iphone-bottom></gui-iphone-bottom>
+		</view>
+	</gui-popup>
+</template>
+<script>
+export default{
+	name  : "gui-action-sheet",
+	props : {
+		width           : { type : Number,  default : 680},
+		height          : { type : Number,  default : 500},
+		borderRadius    : { type : String,  default : '10rpx'},
+		title           : { type : String,  default : ''},
+		titleColor      : { type : String,  default : '#2B2E3D'},
+		items           : { type : Array,   default : function(){return [];}},
+		listColor       : { type : String,  default : '#008AFF'},
+		listLineHeight  : { type : String,  default : '95rpx'},
+		listFontSize    : { type : String,  default : '28rpx'},
+		isCancelBtn     : { type : Boolean, default : true},
+		cancelBtnName   : { type : String,  default : '取消'},
+		cancelBtnColor  : { type : String,  default : 'rgba(69, 90, 100, 0.6)'},
+		canCloseByShade : { type : Boolean, default : false}
+	},
+	methods:{
+		open  : function(){
+			this.$refs.guipopupforacsheet.open();
+		},
+		close : function(){
+			this.$refs.guipopupforacsheet.close();
+		},
+		stopfun : function(e){
+			e.stopPropagation();
+			return null;
+		},
+		cancel : function () {
+			this.$emit('cancel');
+			this.close();
+		},
+		selected:function (e) {
+			this.$emit('selected', e.currentTarget.dataset.index);
+			this.close();
+		},
+	}
+}
+</script>
+<style scoped>
+.gui-action-sheet-title{text-align:center; font-size:26rpx; line-height:100rpx; height:100rpx; font-weight:bold;}
+</style>

+ 126 - 0
lib/GraceUI5/components/gui-area-picker.vue

@@ -0,0 +1,126 @@
+<template>
+	<gui-popup ref="guipopupforareapicker" position="bottom">
+		<view class="gap-body gui-bg-white" @tap.stop.prevent="stopfun">
+			<view class="gap-header gui-flex gui-rows gui-space-between">
+				<text class="gap-header-btn gui-block-text" :class="[cancelClass]" 
+				@tap="close">{{cancelText}}</text>
+				<text class="gap-header-btn gui-block-text" :class="[confirmClass]" 
+				style="text-align:right;" @tap="confirm">{{confirmText}}</text>
+			</view>
+			<picker-view :indicator-style="indicatorStyle" 
+			class="gap-main" :value="defaultVal" @change="change">
+				<picker-view-column v-if="level >= 1">
+					<text class="gap-item gui-block-text" v-for="(item, index) in province" 
+					:key="index">{{item.label}}</text>
+				</picker-view-column>
+				<picker-view-column v-if="level >= 2">
+					<text class="gap-item gui-block-text" v-for="(item, index) in city[defaultVal[0]]" 
+					:key="index">{{item.label}}</text>
+				</picker-view-column>
+				<picker-view-column v-if="level >= 3">
+					<text class="gap-item gui-block-text" v-for="(item, index) in area[defaultVal[0]][defaultVal[1]]" 
+					:key="index">{{item.label}}</text>
+				</picker-view-column>
+			</picker-view>
+		</view>
+	</gui-popup>
+</template>
+<script>
+import provinceData from '../data/city-data/province.js';
+import cityData     from '../data/city-data/city.js';
+import areaData     from '../data/city-data/area.js';
+export default{
+	name  : "gui-area-picker",
+	props : {
+		cancelText     : { type : String, default : '取消' },
+		cancelClass    : { type : String, default : 'gui-color-gray' },
+		confirmText    : { type : String, default : '确定' },
+		confirmClass   : { type : String, default : 'gui-primary-color' },
+		value          : { type : Array , default () { return ['', '', ''] }},
+		level          : { type : Number, default : 3}
+	},
+	data() {
+		return {
+			indicatorStyle : 'height:35px',
+			province       : provinceData,
+			city           : cityData,
+			area           : areaData,
+			defaultVal     : [0,0,0],
+			realshow       : false
+		}
+	},
+	watch:{
+		value      : function(nv, ov){this.setDefault();},
+		defaultVal : function(nv, ov){
+			if(ov[0] != nv[0]){
+				this.defaultVal.splice(1,1,0);
+				this.defaultVal.splice(2,1,0);
+			}else if(ov[1] != nv[1]){
+				this.defaultVal.splice(2,1,0);
+			}
+		}
+	},
+	created() {
+		this.setDefault();
+	},
+	methods:{
+		setDefault:function(){
+			if(this.value[0] == ''){return ;}
+			this.$nextTick(() => {
+				this.defaultVal.splice(0, 1, this.arrayIndexOf(this.province, this.value[0]));
+				if(this.value[1] == ''){return ;}
+				this.$nextTick(() => {
+					this.defaultVal.splice(1,1, this.arrayIndexOf(this.city[this.defaultVal[0]], this.value[1]));
+					if(this.value[2] == ''){return ;}
+					this.$nextTick(() => {
+						this.defaultVal.splice(2,1, this.arrayIndexOf(this.area[this.defaultVal[0]][this.defaultVal[1]], this.value[2]));
+					})
+				})
+			});
+		},
+		arrayIndexOf : function(arr, needFind){
+			var index = 0;
+			for(let i = 0; i < arr.length; i++){if(arr[i].label == needFind){index = i; return i;}}
+			return index;
+		},
+		change : function (e) {
+			var res = e.detail.value;
+			if(!res[0]){res[0] = 0;}
+			if(!res[1]){res[1] = 0;}
+			if(!res[2]){res[2] = 0;}
+			this.defaultVal    = res;
+		},
+		confirm:function () {
+			var codes = [
+				provinceData[this.defaultVal[0]].value,
+				cityData[this.defaultVal[0]][this.defaultVal[1]].value,
+				areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].value ? areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].value : 0
+			];
+			var names = [
+				provinceData[this.defaultVal[0]].label,
+				cityData[this.defaultVal[0]][this.defaultVal[1]].label,
+				areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].label ? areaData[this.defaultVal[0]][this.defaultVal[1]][this.defaultVal[2]].label : ''
+			];
+			codes = codes.splice(0, this.level);
+			names = names.splice(0, this.level);
+			var res = {codes : codes, names : names, indexs : this.defaultVal};
+			this.$emit('confirm', res);
+			this.$refs.guipopupforareapicker.close();
+		},
+		open : function () {
+			this.$refs.guipopupforareapicker.open();
+		},
+		close : function () {
+			this.$refs.guipopupforareapicker.close();
+		},
+		stopfun : function(e){e.stopPropagation(); return null;}
+	}
+}
+</script>
+<style scoped>
+.gap-body{height:500rpx;}
+.gap-header{padding:25rpx;}
+.gap-header-btn{width:200rpx; line-height:38rpx; height:38rpx; font-size:28rpx;}
+.gap-main{width:750rpx; height:500rpx;}
+.gap-item{height:35px; font-size:12px; line-height:35px; overflow:hidden; text-align:center;}
+</style>

+ 177 - 0
lib/GraceUI5/components/gui-article-info.vue

@@ -0,0 +1,177 @@
+<template>
+	<view 
+	class="gui-editor-show gui-border-box" 
+	:style="{
+		paddingLeft:padding+'rpx', 
+		paddingRight:padding+'rpx', 
+		width:'750rpx'
+	}">
+		<view 
+		v-for="(item, index) in article" :key="index">
+		
+			<!-- 文本 -->
+			<text class="gui-block-text" 
+			:decode="true" 
+			:selectable="true" 
+			:user-select="true" 
+			:style="textStyle" 
+			v-if="item.type == 'txt'">{{item.content}}</text>
+			
+			<!-- 居中 -->
+			<text class="gui-block-text gui-text-center" 
+			:selectable="true" 
+			:user-select="true" 
+			:decode="true" 
+			:style="centerStyle" 
+			v-if="item.type == 'center'">{{item.content}}</text>
+			
+			<!-- 图片 -->
+			<view class="gui-img-in" 
+			v-else-if="item.type == 'img'" 
+			:data-url="item.content" @tap="showImgs">
+				<gui-image :src="item.content" :height="0" 
+				:borderRadius="imgRadius"
+				:width="(750-padding*2)"></gui-image>
+			</view>
+			
+			<!-- 引用 源码 -->
+			<text class="gui-block-text" 
+			:selectable="true" 
+			:user-select="true" 
+			:style="quoteStyle" 
+			:decode="true" 
+			v-else-if="
+			item.type == 'quote' || item.type == 'pre'
+			">{{item.content}}</text>
+			
+			<!-- 加粗 -->
+			<text class="gui-block-text gui-bold" 
+			:selectable="true" 
+			:user-select="true" 
+			:style="strongStyle" 
+			:decode="true" 
+			v-else-if="item.type == 'strong'">{{item.content}}</text>
+			
+			<!-- 链接 -->
+			<view v-else-if="item.type == 'link'">
+				<gui-link :url="item.content" :title="item.content"></gui-link>
+			</view>
+			
+			<!-- 分割符 -->
+			<text class="gui-block-text gui-text-center" 
+			:selectable="true" 
+			:user-select="true" 
+			:style="splineStyle" 
+			v-else-if="item.type == 'spline'">● ● ●</text>
+			
+			<!-- h1 -->
+			<text class="gui-block-text gui-h1" 
+			:decode="true" 
+			:selectable="true" 
+			:user-select="true" 
+			v-else-if="item.type == 'h1'">{{item.content}}</text>
+			
+			<!-- h2 -->
+			<text class="gui-block-text gui-h2" 
+			:selectable="true" 
+			:user-select="true" 
+			:decode="true" 
+			v-else-if="item.type == 'h2'">{{item.content}}</text>
+			
+			<!-- h3 -->
+			<text class="gui-block-text gui-h3" 
+			:selectable="true" 
+			:user-select="true" 
+			:decode="true" 
+			v-else-if="item.type == 'h3'">{{item.content}}</text>
+			
+			<!-- h4 -->
+			<text class="gui-block-text gui-h4" 
+			:selectable="true" 
+			:user-select="true" 
+			:decode="true" 
+			v-else-if="item.type == 'h4'">{{item.content}}</text>
+			
+			<!-- h5 -->
+			<text class="gui-block-text gui-h5" 
+			:selectable="true" 
+			:user-select="true" 
+			:decode="true" 
+			v-else-if="item.type == 'h5'">{{item.content}}</text>
+			
+			<!-- h6 -->
+			<text class="gui-block-text gui-h6" 
+			:selectable="true" 
+			:user-select="true" 
+			:decode="true" 
+			v-else-if="item.type == 'h6'">{{item.content}}</text>
+			
+			<!-- 间距 -->
+			<view :style="{height:itemMargin}"></view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-article-info",
+	props : {
+		article      : {
+			type     : Array,  
+			default  : function(){return new Array();}
+		},
+		itemMargin   : {
+			type     : String, 
+			default  : '20rpx',
+		},
+		padding      : {
+			type     : Number, 
+			default  : 30,
+		},
+		textStyle    : {
+			type     : String, 
+			default  : 'line-height:58rpx; font-size:30rpx; color:#2B2E3D; text-align:justify;'
+		},
+		centerStyle  : {
+			type     : String, 
+			default  : 'line-height:58rpx; font-size:30rpx; color:#2B2E3D;'
+		},
+		imgRadius    : {
+			type     : String, 
+			default  : '6rpx',
+		},
+		quoteStyle   : {
+			type     : String, 
+			default  : 'line-height:58rpx; font-size:30rpx; color:#2B2E3D; padding:20rpx; background-color:#F8F8F8;'
+		},
+		strongStyle  : {
+			type     : String, 
+			default  : 'line-height:58rpx; font-size:30rpx; color:#2B2E3D;'
+		},
+		splineStyle  : {
+			type     : String, 
+			default  : 'line-height:58rpx; font-size:30rpx; color:rgba(69, 90, 100, 0.6);'
+		}
+	},
+	methods: {
+		showImgs:function(e){
+			var currentUrl = e.currentTarget.dataset.url;
+			var imgs       = [];
+			var items      = this.article;
+			for(let i = 0; i < items.length; i++){
+				if(items[i].type ==  'img'){
+					imgs.push(items[i].content);
+				}
+			}
+			uni.previewImage({
+				urls:imgs,
+				current:currentUrl
+			})
+		}
+	}
+}
+</script>
+<style scoped>
+/* #ifndef APP-NVUE */
+.gui-block-text{word-break: break-all;}
+/* #endif */
+</style>

+ 68 - 0
lib/GraceUI5/components/gui-article-list.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="gui-article-list">
+		<view class="gui-article-list-item" hover-class="gui-tap" 
+		:style="itemStyle" 
+		v-for="(item, index) in articles" :key="index" 
+		@tap="newstap(item.id)">
+			<view>
+				<text class="gui-article-list-title gui-block-text" 
+				:style="titleStyle">{{item.title}}</text>
+			</view>
+			<view class="gui-article-list-img1" 
+			v-if="item.imgs.length == 1">
+				<gui-image :src="item.imgs[0]" :width="440" :height="280"></gui-image>
+			</view>
+			<view class="gui-flex gui-rows gui-nowrap gui-space-between" 
+			v-if="item.imgs.length == 2">
+				<view class="gui-article-list-img2-in">
+					<gui-image :src="item.imgs[0]" :width="335" :height="200"></gui-image>
+				</view>
+				<view class="gui-article-list-img2-in">
+					<gui-image :src="item.imgs[1]" :width="335" :height="200"></gui-image>
+				</view>
+			</view>
+			<view class="gui-flex gui-rows gui-nowrap gui-space-between" 
+			v-if="item.imgs.length >= 3">
+				<view class="gui-article-list-img3-in">
+					<gui-image :src="item.imgs[0]" :width="220" :height="150"></gui-image>
+				</view>
+				<view class="gui-article-list-img3-in">
+					<gui-image :src="item.imgs[1]" :width="220" :height="150"></gui-image>
+				</view>
+				<view class="gui-article-list-img3-in">
+					<gui-image :src="item.imgs[2]" :width="220" :height="150"></gui-image>
+				</view>
+			</view>
+			<view class="gui-article-list-footer gui-flex gui-rows gui-space-between gui-align-items-center">
+				<text class="gui-article-list-footer-items gui-ellipsis gui-color-gray gui-block-text gui-icons">&#xe69e; {{item.author}}</text>
+				<text class="gui-article-list-footer-items gui-ellipsis gui-color-gray gui-block-text gui-icons gui-text-center">&#xe609; {{item.views}}</text>
+				<text class="gui-article-list-footer-items gui-ellipsis gui-color-gray gui-block-text gui-icons gui-text-right">&#xe64c; {{item.createTime}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-article-list",
+	props : {
+		articles   : { type : Array , default : function(){return [];}},
+		titleStyle : { type : String, default : 'lineHeight:44rpx;font-size:32rpx;color:#2B2E3D;'},
+		itemStyle  : { type : String, default : 'background-color:#FFFFFF;'}
+	},
+	methods : {
+		newstap : function(id){
+			this.$emit('newstap', id);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-article-list{}
+.gui-article-list-item{margin-bottom:30rpx; padding:20rpx 30rpx;}
+.gui-article-list-title{overflow:hidden;}
+.gui-article-list-img1{margin-top:22rpx;}
+.gui-article-list-img2-in{width:335rpx; height:200rpx; margin-top:22rpx;}
+.gui-article-list-img3-in{width:220rpx; height:150rpx; margin-top:22rpx;}
+.gui-article-list-footer{margin-top:20rpx;}
+.gui-article-list-footer-items{width:220rpx; height:50rpx; line-height:50rpx; font-size:26rpx; overflow:hidden;}
+</style>

+ 206 - 0
lib/GraceUI5/components/gui-audio-player.vue

@@ -0,0 +1,206 @@
+<template>
+	<view class="gui-player">
+		<view class="gui-player-title" 
+		:style="{color:color}">{{list[index].title}}</view>
+		<view class="gui-player-poster">
+			<image class="gui-player-poster-img" 
+			:class="[playStatus == 1 ? 'gui-playing' : '']" 
+			:src="list[index].coverImgUrl" mode="aspectFill"></image>
+		</view>
+		<!-- 播放进度 -->
+		<view style="padding:25rpx;">
+			<gui-single-slider ref="graceSingleSlider" 
+			@change="progressChange" :barWidth="100" 
+			:barText="playTime" barColor="#36395A" 
+			barBgColor="linear-gradient(to right, #FFFFFF,#FFFFFF)" 
+			bglineColor="rgba(255,255,255,0.5)" 
+			bglineAColor="#FFFFFF"></gui-single-slider>
+		</view>
+		<!-- 播放控制 -->
+		<view class="gui-player-console">
+			<!-- 循环模式 -->
+			<view class="gui-player-tool" 
+			@tap="changeType">
+				<text class="gui-player-tool gui-icons" 
+				v-if="dotype == 1">&#xe677;</text>
+				<text class="gui-player-tool gui-icons" 
+				v-if="dotype == 2" style="font-size:40rpx;">&#xe64a;</text>
+			</view>
+			<view class="gui-player-console-c">
+				<text class="gui-player-tool gui-icons" @tap="prev">&#xe659;</text>
+				<text class="gui-player-tool gui-icons" style="font-size:66rpx;" 
+				@tap="pause" v-if="playStatus == 1">&#xe64b;</text>
+				<text class="gui-player-tool gui-icons" style="font-size:66rpx;" 
+				@tap="playi" v-if="playStatus == 2">&#xe649;</text>
+				<text class="gui-player-tool gui-icons" @tap="next">&#xe65a;</text>
+			</view>
+			<text class="gui-player-tool gui-icons" @tap="openList">&#xe648;</text>
+		</view>
+		<!-- 歌曲列表 -->
+		<view class="gui-shade" :style="{left:listShow?'0':'-2000px'}" 
+		@tap.stop.parent="hideList" @touchmove.stop.parent="">
+			<scroll-view scroll-y="true" class="graceplayer-list" 
+			:style="{background:listBg, height:listHeight}">
+				<view class="graceplayer-list-item">歌曲列表</view>
+				<view class="graceplayer-list-item" 
+				:class="[index == idx ? 'graceplayer-list-item-this' : '']" 
+				v-for="(item, idx) in list" :key="idx" 
+				@tap="playList" :data-index="idx">{{item.title}}<text class="graceplayer-list-item-singer"> - {{item.singer}}</text></view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-audio-player",
+	props : {
+		color      : {type:String, default:'#FFFFFF'},
+		list       : {type:Array , default:function(){return [];}},
+		listBg     : {type:String, default:'#292E35'},
+		listHeight : {type:String, default:'880rpx'},
+		autoplay   : {type:Boolean, default:true}
+	},
+	data(){
+		return {
+			playStatus  : 1,
+			player      : null,
+			playTime    : '00:00',
+			timer       : null,
+			dotype      : 1,
+			index       : 0,
+			listShow    : false,
+			audioLength : 1
+		}
+	},
+	mounted:function(){
+		if(this.autoplay){
+			this.play();
+		}
+	},
+	created:function(){
+		// #ifdef H5
+		return ;
+		// #endif
+		this.player = uni.getBackgroundAudioManager();
+		this.player.onTimeUpdate(()=>{
+			try{
+				if(this.playStatus != 1){return ;}
+				this.audioLength = this.player.duration;
+				// 调整进度
+				var progress = this.player.currentTime / this.audioLength;
+				progress     = Math.round(progress * 100);
+				var ref      = this.$refs.graceSingleSlider;
+				if(ref){
+					ref.setProgress(progress);
+				}
+				this.playTime = this.timeFormat(this.player.currentTime);
+			}catch(e){};
+		});
+		this.player.onPlay(()=>{
+			this.playStatus  = 1;
+			this.audioLength = this.player.duration;
+		});
+		this.player.onPause(()=>{
+			this.playStatus = 2;
+		});
+		this.player.onEnded(()=>{
+			switch(this.dotype){
+				case 1 :
+				this.index++;
+				if(this.index + 1 > this.list.length){this.index = 0;}
+				this.play();
+				break;
+				case 2 :
+				this.player.seek(0);
+				this.play();
+				break;
+			}
+		});
+		if(this.player.currentTime < 1){
+			this.play();
+		}
+	},
+	methods:{
+		play:function () {
+			var audio               = this.list[this.index];
+			this.player.title       = audio.title;
+			this.player.singer      = audio.singer;
+			this.player.coverImgUrl = audio.coverImgUrl;
+			this.player.src         = audio.src;
+			this.player.play();
+		},
+		progressChange : function(e){
+			if(this.timer != null){ clearTimeout(this.timer); }
+			this.player.pause();
+			var needTime  = this.audioLength * e / 100;
+			needTime      = Math.round(needTime);
+			this.playTime = this.timeFormat(needTime);
+			this.timer = setTimeout(()=>{
+				this.player.seek(needTime);
+				this.player.play();
+			}, 800);
+		},
+		timeFormat : function (s){
+			s = Math.round(s);
+			if(s < 60){
+				if(s < 10){return '00:0'+s;}
+				return '00:'+s;
+			}else{
+				var second = s % 60;
+				s = s - second;
+				var minute = s / 60;
+				if(minute < 10){minute = '0'+minute;}
+				if(second < 10){second = '0'+second;}
+				return minute+':'+second;
+			}
+			
+		},
+		changeType : function () {
+			switch(this.dotype){
+				case 1 :
+				this.dotype = 2;
+				break;
+				case 2 :
+				this.dotype = 1;
+				break;
+			}
+		},
+		pause :function () {this.player.pause();},
+		playi :function () {this.player.play();},
+		next : function () {
+			if(this.index + 1 >= this.list.length){uni.showToast({title:"已经到底了 (:", icon:"none"}); return ;}
+			this.index++;
+			this.play();
+		},
+		prev : function () {
+			if(this.index -1 < 0){uni.showToast({title:"已经到头了 (:", icon:"none"}); return ;}
+			this.index--;
+			this.play();
+		},
+		openList : function () { this.listShow = true; },
+		hideList : function () { this.listShow = false; },
+		playList : function (e) {
+			var idx = e.currentTarget.dataset.index;
+			this.index = idx;
+			this.play();
+		},
+		setIndex : function (idx) { this.index = idx; }
+	}
+}
+</script>
+<style scoped>
+.gui-player{padding:30rpx;}
+.gui-player-title{text-align:center; line-height:50rpx; font-size:30rpx; font-weight:bold;}
+.gui-player-poster{padding:30px; line-height:0; text-align:center;}
+.gui-player-poster-img{width:380rpx; height:380rpx; border-radius:300rpx; box-shadow:0rpx 2rpx 2rpx #323232;}
+@keyframes gui-rotate360{0%{transform:rotate(0deg);} 50%{transform:rotate(180deg);} 100%{transform:rotate(360deg);}}
+.gui-playing{animation:gui-rotate360 6000ms infinite linear;}
+.gui-player-console{padding:20rpx 10rpx; display:flex; flex-direction:row; align-items:center; justify-content:space-between;}
+.gui-player-tool{width:100rpx; line-height:100rpx; text-align:center; font-size:50rpx; display:block; flex-shrink:0; color:#FFFFFF;}
+.gui-player-console-c{width:400rpx; display:flex; flex-direction:row; justify-content:space-between;}
+.graceplayer-list{width:100%; height:1000rpx; background-color:#FFFFFF; position:absolute; left:0; bottom:0; z-index:9999;}
+.gui-shade{position:fixed; width:100%; height:100%; left:0; top:0; background-color:rgba(0,0,0,0.5); bottom:0; overflow:hidden; z-index:9998; display:flex; justify-content:center; align-items:center;}
+.graceplayer-list-item{padding:25rpx 0rpx; margin:5rpx 30rpx; border-bottom:1px solid #373A3F; line-height:50rpx; font-size:30rpx; color:#FFFFFF;}
+.graceplayer-list-item-singer{color:#888888; font-size:26rpx; margin-left:50rpx;}
+.graceplayer-list-item-this{color:#64CDA5 !important; font-weight:bold;}
+</style>

+ 79 - 0
lib/GraceUI5/components/gui-box-banner.vue

@@ -0,0 +1,79 @@
+<template>
+	<view class="grace-box-banner gui-flex gui-rows gui-nowrap" 
+	:style="{backgroundColor:background, 
+		paddingTop:padding, 
+		paddingBottom:padding, 
+		borderRadius:borderRadius}">
+	    <view class="grace-box-items gui-border-r" 
+		v-for="(item, index) in items" 
+		:key="index" @tap.stop="taped(index)" 
+		:style="{
+			borderRightWidth : index+1 >= items.length ? '0rpx':'1px',
+			borderColor : borderColor
+		}">
+		<view class="gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center">
+			<text class="gui-block-text" 
+			:style="{
+				lineHeight:lineHeight, 
+				color:color[0],
+				fontSize:fontSize[0]
+			}">{{item[0]}}</text>
+			<text class="gui-block-text" 
+			:style="{color:color[1], fontSize:fontSize[1], marginLeft:'5rpx'}">{{item[1]}}</text>
+		</view>
+		<text class="gui-block-text gui-text-center" 
+		:style="{color:color[2],fontSize:fontSize[2]}">{{item[2]}}</text>
+	    </view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-box-banner",
+	props : {
+		items:{
+			type : Array,
+			default : function () {
+				return []
+			}
+		},
+		color:{
+			type : Array,
+			default : function () {
+				return ['#333333', 'rgba(69, 90, 100, 0.5)', 'rgba(69, 90, 100, 0.5)']
+			}
+		},
+		fontSize:{
+			type : Array,
+			default : function () {
+				return ['36rpx', '24rpx', '24rpx']
+			}
+		},
+		background : {
+			type : String,
+			default : ''
+		},
+		padding:{
+			type : String,
+			default : '20rpx'
+		},
+		borderRadius:{
+			type : String,
+			default : '10rpx'
+		},
+		lineHeight:{
+			type : String,
+			default : '60rpx'
+		},
+		borderColor : {type:String, default:'#F1F1F1'}
+	},
+	methods:{
+		taped:function (index) {
+			this.$emit('taped', index);
+		}
+	}
+}
+</script>
+<style scoped>
+.grace-box-banner{overflow:hidden;}
+.grace-box-items{width:100rpx; flex:1;}
+</style>

+ 563 - 0
lib/GraceUI5/components/gui-calendar.js

@@ -0,0 +1,563 @@
+/* eslint-disable */
+/**
+ * @公历转农历:this.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+ * @农历转公历:this.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+ */
+module.exports = {
+
+  /**
+   * 农历1900-2100的润大小信息表
+   * @Array Of Property
+   * @return Hex
+   */
+  lunarInfo:[0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909
+    0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919
+    0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929
+    0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939
+    0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949
+    0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959
+    0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969
+    0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979
+    0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989
+    0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999
+    0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009
+    0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019
+    0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029
+    0x05aa0,0x076a3,0x096d0,0x04afb,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039
+    0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049
+    /**Add By JJonline@JJonline.Cn**/
+    0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059
+    0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069
+    0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079
+    0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089
+    0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099
+    0x0d520],//2100
+
+  /**
+   * 公历每个月份的天数普通表
+   * @Array Of Property
+   * @return Number
+   */
+  solarMonth:[31,28,31,30,31,30,31,31,30,31,30,31],
+
+  /**
+   * 天干地支之天干速查表
+   * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+   * @return Cn string
+   */
+  Gan:["\u7532","\u4e59","\u4e19","\u4e01","\u620a","\u5df1","\u5e9a","\u8f9b","\u58ec","\u7678"],
+
+  /**
+   * 天干地支之地支速查表
+   * @Array Of Property
+   * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+   * @return Cn string
+   */
+  Zhi:["\u5b50","\u4e11","\u5bc5","\u536f","\u8fb0","\u5df3","\u5348","\u672a","\u7533","\u9149","\u620c","\u4ea5"],
+
+  /**
+   * 天干地支之地支速查表<=>生肖
+   * @Array Of Property
+   * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+   * @return Cn string
+   */
+  Animals:["\u9f20","\u725b","\u864e","\u5154","\u9f99","\u86c7","\u9a6c","\u7f8a","\u7334","\u9e21","\u72d7","\u732a"],
+
+  /**
+   * 24节气速查表
+   * @Array Of Property
+   * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+   * @return Cn string
+   */
+  solarTerm:["\u5c0f\u5bd2","\u5927\u5bd2","\u7acb\u6625","\u96e8\u6c34","\u60ca\u86f0","\u6625\u5206","\u6e05\u660e","\u8c37\u96e8","\u7acb\u590f","\u5c0f\u6ee1","\u8292\u79cd","\u590f\u81f3","\u5c0f\u6691","\u5927\u6691","\u7acb\u79cb","\u5904\u6691","\u767d\u9732","\u79cb\u5206","\u5bd2\u9732","\u971c\u964d","\u7acb\u51ac","\u5c0f\u96ea","\u5927\u96ea","\u51ac\u81f3"],
+
+  /**
+   * 1900-2100各年的24节气日期速查表
+   * @Array Of Property
+   * @return 0x string For splice
+   */
+  sTermInfo:['9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f',
+    '97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e',
+    '97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa',
+    '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f',
+    'b027097bd097c36b0b6fc9274c91aa','9778397bd19801ec9210c965cc920e','97b6b97bd19801ec95f8c965cc920f',
+    '97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2','9778397bd197c36c9210c9274c91aa',
+    '97b6b97bd19801ec95f8c965cc920e','97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2',
+    '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec95f8c965cc920e','97bcf97c3598082c95f8e1cfcc920f',
+    '97bd097bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e',
+    '97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa',
+    '97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722',
+    '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f',
+    '97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e',
+    '97bcf97c359801ec95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa',
+    '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f','97bd097bd07f595b0b6fc920fb0722',
+    '9778397bd097c36b0b6fc9210c8dc2','9778397bd19801ec9210c9274c920e','97b6b97bd19801ec95f8c965cc920f',
+    '97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e',
+    '97b6b97bd19801ec95f8c965cc920f','97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2',
+    '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e','97bd07f1487f595b0b0bc920fb0722',
+    '7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e',
+    '97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa',
+    '97b6b97bd19801ec9210c965cc920e','97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722',
+    '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf7f1487f531b0b0bb0b6fb0722',
+    '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e',
+    '97bcf7f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa',
+    '97b6b97bd19801ec9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722',
+    '9778397bd097c36b0b6fc9210c91aa','97b6b97bd197c36c9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722',
+    '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e',
+    '97b6b7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2',
+    '9778397bd097c36b0b70c9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722',
+    '7f0e397bd097c35b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721',
+    '7f0e27f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa',
+    '97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722',
+    '9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722',
+    '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721',
+    '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9274c91aa',
+    '97b6b7f0e47f531b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722',
+    '9778397bd097c36b0b6fc9210c91aa','97b6b7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722',
+    '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','977837f0e37f149b0723b0787b0721',
+    '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c35b0b6fc9210c8dc2',
+    '977837f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722',
+    '7f0e397bd097c35b0b6fc9210c8dc2','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721',
+    '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','977837f0e37f14998082b0787b06bd',
+    '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722',
+    '977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722',
+    '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721',
+    '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd',
+    '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722',
+    '977837f0e37f14998082b0723b06bd','7f07e7f0e37f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722',
+    '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b0721',
+    '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f595b0b0bb0b6fb0722','7f0e37f0e37f14898082b0723b02d5',
+    '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f531b0b0bb0b6fb0722',
+    '7f0e37f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721',
+    '7f0e37f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd',
+    '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35',
+    '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722',
+    '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f149b0723b0787b0721',
+    '7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0723b06bd',
+    '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722','7f0e37f0e366aa89801eb072297c35',
+    '7ec967f0e37f14998082b0723b06bd','7f07e7f0e37f14998083b0787b0721','7f0e27f0e47f531b0723b0b6fb0722',
+    '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14898082b0723b02d5','7f07e7f0e37f14998082b0787b0721',
+    '7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66aa89801e9808297c35','665f67f0e37f14898082b0723b02d5',
+    '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66a449801e9808297c35',
+    '665f67f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721',
+    '7f0e36665b66a449801e9808297c35','665f67f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd',
+    '7f07e7f0e47f531b0723b0b6fb0721','7f0e26665b66a449801e9808297c35','665f67f0e37f1489801eb072297c35',
+    '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'],
+
+  /**
+   * 数字转中文速查表
+   * @Array Of Property
+   * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+   * @return Cn string
+   */
+  nStr1:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341"],
+
+  /**
+   * 日期转农历称呼速查表
+   * @Array Of Property
+   * @trans ['初','十','廿','卅']
+   * @return Cn string
+   */
+  nStr2:["\u521d","\u5341","\u5eff","\u5345"],
+
+  /**
+   * 月份转农历称呼速查表
+   * @Array Of Property
+   * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+   * @return Cn string
+   */
+  nStr3:["\u6b63","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u51ac","\u814a"],
+
+  /**
+   * 返回农历y年一整年的总天数
+   * @param lunar Year
+   * @return Number
+   * @eg:var count = this.lYearDays(1987) ;//count=387
+   */
+  lYearDays:function(y) {
+    var i, sum = 348;
+    for(i=0x8000; i>0x8; i>>=1) { sum += (this.lunarInfo[y-1900] & i)? 1: 0; }
+    return(sum+this.leapDays(y));
+  },
+
+  /**
+   * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+   * @param lunar Year
+   * @return Number (0-12)
+   * @eg:var leapMonth = this.leapMonth(1987) ;//leapMonth=6
+   */
+  leapMonth:function(y) { //闰字编码 \u95f0
+    return(this.lunarInfo[y-1900] & 0xf);
+  },
+
+  /**
+   * 返回农历y年闰月的天数 若该年没有闰月则返回0
+   * @param lunar Year
+   * @return Number (02930)
+   * @eg:var leapMonthDay = this.leapDays(1987) ;//leapMonthDay=29
+   */
+  leapDays:function(y) {
+    if(this.leapMonth(y))  {
+      return((this.lunarInfo[y-1900] & 0x10000)? 30: 29);
+    }
+    return(0);
+  },
+
+  /**
+   * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+   * @param lunar Year
+   * @return Number (-12930)
+   * @eg:var MonthDay = this.monthDays(1987,9) ;//MonthDay=29
+   */
+  monthDays:function(y,m) {
+    if(m>12 || m<1) {return -1}//月份参数从1至12,参数错误返回-1
+    return( (this.lunarInfo[y-1900] & (0x10000>>m))? 30: 29 );
+  },
+
+  /**
+   * 返回公历(!)y年m月的天数
+   * @param solar Year
+   * @return Number (-128293031)
+   * @eg:var solarMonthDay = this.leapDays(1987) ;//solarMonthDay=30
+   */
+  solarDays:function(y,m) {
+    if(m>12 || m<1) {return -1} //若参数错误 返回-1
+    var ms = m-1;
+    if(ms==1) { //2月份的闰平规律测算后确认返回28或29
+      return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28);
+    }else {
+      return(this.solarMonth[ms]);
+    }
+  },
+
+  /**
+   * 农历年份转换为干支纪年
+   * @param  lYear 农历年的年份数
+   * @return Cn string
+   */
+  toGanZhiYear:function(lYear) {
+    var ganKey = (lYear - 3) % 10;
+    var zhiKey = (lYear - 3) % 12;
+    if(ganKey == 0) ganKey = 10;//如果余数为0则为最后一个天干
+    if(zhiKey == 0) zhiKey = 12;//如果余数为0则为最后一个地支
+    return this.Gan[ganKey-1] + this.Zhi[zhiKey-1];
+
+  },
+
+  /**
+   * 公历月、日判断所属星座
+   * @param  cMonth [description]
+   * @param  cDay [description]
+   * @return Cn string
+   */
+  toAstro:function(cMonth,cDay) {
+    var s   = "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf";
+    var arr = [20,19,21,21,21,22,23,23,23,23,22,22];
+    return s.substr(cMonth*2 - (cDay < arr[cMonth-1] ? 2 : 0),2) + "\u5ea7";//座
+  },
+
+  /**
+   * 传入offset偏移量返回干支
+   * @param offset 相对甲子的偏移量
+   * @return Cn string
+   */
+  toGanZhi:function(offset) {
+    return this.Gan[offset%10] + this.Zhi[offset%12];
+  },
+
+  /**
+   * 传入公历(!)y年获得该年第n个节气的公历日期
+   * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+   * @return day Number
+   * @eg:var _24 = this.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+   */
+  getTerm:function(y,n) {
+    if(y<1900 || y>2100) {return -1;}
+    if(n<1 || n>24) {return -1;}
+    var _table = this.sTermInfo[y-1900];
+    var _info = [
+      parseInt('0x'+_table.substr(0,5)).toString() ,
+      parseInt('0x'+_table.substr(5,5)).toString(),
+      parseInt('0x'+_table.substr(10,5)).toString(),
+      parseInt('0x'+_table.substr(15,5)).toString(),
+      parseInt('0x'+_table.substr(20,5)).toString(),
+      parseInt('0x'+_table.substr(25,5)).toString()
+    ];
+    var _calday = [
+      _info[0].substr(0,1),
+      _info[0].substr(1,2),
+      _info[0].substr(3,1),
+      _info[0].substr(4,2),
+
+      _info[1].substr(0,1),
+      _info[1].substr(1,2),
+      _info[1].substr(3,1),
+      _info[1].substr(4,2),
+
+      _info[2].substr(0,1),
+      _info[2].substr(1,2),
+      _info[2].substr(3,1),
+      _info[2].substr(4,2),
+
+      _info[3].substr(0,1),
+      _info[3].substr(1,2),
+      _info[3].substr(3,1),
+      _info[3].substr(4,2),
+
+      _info[4].substr(0,1),
+      _info[4].substr(1,2),
+      _info[4].substr(3,1),
+      _info[4].substr(4,2),
+
+      _info[5].substr(0,1),
+      _info[5].substr(1,2),
+      _info[5].substr(3,1),
+      _info[5].substr(4,2),
+    ];
+    return parseInt(_calday[n-1]);
+  },
+
+  /**
+   * 传入农历数字月份返回汉语通俗表示法
+   * @param lunar month
+   * @return Cn string
+   * @eg:var cnMonth = this.toChinaMonth(12) ;//cnMonth='腊月'
+   */
+  toChinaMonth:function(m) { // 月 => \u6708
+    if(m>12 || m<1) {return -1} //若参数错误 返回-1
+    var s = this.nStr3[m-1];
+    s+= "\u6708";//加上月字
+    return s;
+  },
+
+  /**
+   * 传入农历日期数字返回汉字表示法
+   * @param lunar day
+   * @return Cn string
+   * @eg:var cnDay = this.toChinaDay(21) ;//cnMonth='廿一'
+   */
+  toChinaDay:function(d){ //日 => \u65e5
+    var s;
+    switch (d) {
+      case 10:
+        s = '\u521d\u5341'; break;
+      case 20:
+        s = '\u4e8c\u5341'; break;
+        break;
+      case 30:
+        s = '\u4e09\u5341'; break;
+        break;
+      default :
+        s = this.nStr2[Math.floor(d/10)];
+        s += this.nStr1[d%10];
+    }
+    return(s);
+  },
+
+  /**
+   * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+   * @param y year
+   * @return Cn string
+   * @eg:var animal = this.getAnimal(1987) ;//animal='兔'
+   */
+  getAnimal: function(y) {
+    return this.Animals[(y - 4) % 12]
+  },
+
+  /**
+   * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+   * @param y  solar year
+   * @param m  solar month
+   * @param d  solar day
+   * @return JSON object
+   * @eg:console.log(this.solar2lunar(1987,11,01));
+   */
+  solar2lunar:function (y,m,d) { //参数区间1900.1.31~2100.12.31
+    if(y<1900 || y>2100) {return -1;}//年份限定、上限
+    if(y==1900&&m==1&&d<31) {return -1;}//下限
+    if(!y) { //未传参  获得当天
+      var objDate = new Date();
+    }else {
+      var objDate = new Date(y,parseInt(m)-1,d)
+    }
+    var i, leap=0, temp=0;
+    //修正ymd参数
+    var y = objDate.getFullYear(),m = objDate.getMonth()+1,d = objDate.getDate();
+    var offset   = (Date.UTC(objDate.getFullYear(),objDate.getMonth(),objDate.getDate()) - Date.UTC(1900,0,31))/86400000;
+    for(i=1900; i<2101 && offset>0; i++) { temp=this.lYearDays(i); offset-=temp; }
+    if(offset<0) { offset+=temp; i--; }
+
+    //是否今天
+    var isTodayObj = new Date(),isToday=false;
+    if(isTodayObj.getFullYear()==y && isTodayObj.getMonth()+1==m && isTodayObj.getDate()==d) {
+      isToday = true;
+    }
+    //星期几
+    var nWeek = objDate.getDay(),cWeek = this.nStr1[nWeek];
+    if(nWeek==0) {nWeek =7;}//数字表示周几顺应天朝周一开始的惯例
+    //农历年
+    var year = i;
+
+    var leap = this.leapMonth(i); //闰哪个月
+    var isLeap = false;
+
+    //效验闰月
+    for(i=1; i<13 && offset>0; i++) {
+      //闰月
+      if(leap>0 && i==(leap+1) && isLeap==false){
+        --i;
+        isLeap = true; temp = this.leapDays(year); //计算农历闰月天数
+      }
+      else{
+        temp = this.monthDays(year, i);//计算农历普通月天数
+      }
+      //解除闰月
+      if(isLeap==true && i==(leap+1)) { isLeap = false; }
+      offset -= temp;
+    }
+
+    if(offset==0 && leap>0 && i==leap+1)
+      if(isLeap){
+        isLeap = false;
+      }else{
+        isLeap = true; --i;
+      }
+    if(offset<0){ offset += temp; --i; }
+    //农历月
+    var month   = i;
+    //农历日
+    var day     = offset + 1;
+
+    //天干地支处理
+    var sm      =   m-1;
+    var gzY     =   this.toGanZhiYear(year);
+
+    //月柱 1900年1月小寒以前为 丙子月(60进制12)
+    var firstNode   = this.getTerm(year,(m*2-1));//返回当月「节」为几日开始
+    var secondNode  = this.getTerm(year,(m*2));//返回当月「节」为几日开始
+
+    //依据12节气修正干支月
+    var gzM     =   this.toGanZhi((y-1900)*12+m+11);
+    if(d>=firstNode) {
+      gzM     =   this.toGanZhi((y-1900)*12+m+12);
+    }
+
+    //传入的日期的节气与否
+    var isTerm = false;
+    var Term   = null;
+    if(firstNode==d) {
+      isTerm  = true;
+      Term    = this.solarTerm[m*2-2];
+    }
+    if(secondNode==d) {
+      isTerm  = true;
+      Term    = this.solarTerm[m*2-1];
+    }
+    //日柱 当月一日与 1900/1/1 相差天数
+    var dayCyclical = Date.UTC(y,sm,1,0,0,0,0)/86400000+25567+10;
+    var gzD = this.toGanZhi(dayCyclical+d-1);
+    //该日期所属的星座
+    var astro = this.toAstro(m,d);
+
+    return {'lYear':year,'lMonth':month,'lDay':day,'Animal':this.getAnimal(year),'IMonthCn':(isLeap?"\u95f0":'')+this.toChinaMonth(month),'IDayCn':this.toChinaDay(day),'cYear':y,'cMonth':m,'cDay':d,'gzYear':gzY,'gzMonth':gzM,'gzDay':gzD,'isToday':isToday,'isLeap':isLeap,'nWeek':nWeek,'ncWeek':"\u661f\u671f"+cWeek,'isTerm':isTerm,'Term':Term,'astro':astro};
+  },
+
+  /**
+   * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+   * @param y  lunar year
+   * @param m  lunar month
+   * @param d  lunar day
+   * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+   * @return JSON object
+   * @eg:console.log(this.lunar2solar(1987,9,10));
+   */
+	lunar2solar:function(y,m,d,isLeapMonth) {
+		//参数区间1900.1.31~2100.12.1
+		var isLeapMonth = !!isLeapMonth;
+		var leapOffset  = 0;
+		var leapMonth   = this.leapMonth(y);
+		var leapDay     = this.leapDays(y);
+		if(isLeapMonth&&(leapMonth!=m)) {return -1;}//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+		if(y==2100&&m==12&&d>1 || y==1900&&m==1&&d<31) {return -1;}//超出了最大极限值
+		var day  = this.monthDays(y,m);
+		var _day = day;
+		//bugFix 2016-9-25
+		//if month is leap, _day use leapDays method
+		if(isLeapMonth) {
+		  _day = this.leapDays(y,m);
+		}
+		if(y < 1900 || y > 2100 || d > _day) {return -1;}//参数合法性效验
+
+		//计算农历的时间差
+		var offset = 0;
+		for(var i=1900;i<y;i++) {
+		  offset+=this.lYearDays(i);
+		}
+		var leap = 0,isAdd= false;
+		for(var i=1;i<m;i++) {
+		  leap = this.leapMonth(y);
+		  if(!isAdd) {//处理闰月
+			if(leap<=i && leap>0) {
+			  offset+=this.leapDays(y);isAdd = true;
+			}
+		  }
+		  offset+=this.monthDays(y,i);
+		}
+		//转换闰月农历 需补充该年闰月的前一个月的时差
+		if(isLeapMonth) {offset+=day;}
+		//1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+		var stmap   =   Date.UTC(1900,1,30,0,0,0);
+		var calObj  =   new Date((offset+d-31)*86400000+stmap);
+		var cY      =   calObj.getUTCFullYear();
+		var cM      =   calObj.getUTCMonth()+1;
+		var cD      =   calObj.getUTCDate();
+
+		return this.solar2lunar(cY,cM,cD);
+	},
+	
+	defaultLunar : {
+	  '1y1': '春节',
+	  '1y15': '元宵节',
+	  '2y2': '龙头节',
+	  '5y5': '端午节',
+	  '7y7': '七夕节',
+	  '7y15': '中元节',
+	  '8y15': '中秋节',
+	  '9y9': '重阳节',
+	  '10y1': '寒衣节',
+	  '10y15': '下元节',
+	  '12y8': '腊八节',
+	  '12y23': '小年',
+	},
+	
+	defaultGregorian : {
+	  '1y1': '元旦',
+	  '2y14': '情人节',
+	  '3y8': '妇女节',
+	  '3y12': '植树节',
+	  '5y1': '劳动节',
+	  '5y4': '青年节',
+	  '6y1': '儿童节',
+	  '7y1': '建党节',
+	  '8y1': '建军节',
+	  '9y10': '教师节',
+	  '10y1': '国庆节',
+	  '12y24': '平安夜',
+	  '12y25': '圣诞节',
+	},
+	
+	getLunarInfo : function(y, m, d) {
+		// 匹配阳历节日
+		var glDay  = m+'y'+d;
+		if(this.defaultGregorian[glDay]){
+			return this.defaultGregorian[glDay];
+		}
+		var nlObj = this.solar2lunar(y, m, d);
+		// 阴历节日
+		var nlDay = nlObj.lMonth+'y'+nlObj.lDay;
+		if(this.defaultLunar[nlDay]){
+			return this.defaultLunar[nlDay]
+		}
+		return nlObj.IDayCn;
+	}
+}

+ 203 - 0
lib/GraceUI5/components/gui-calendar.vue

@@ -0,0 +1,203 @@
+<template>
+<gui-popup 
+	ref="guipopupforcalendar" 
+	position="bottom" 
+	:canCloseByShade="false" 
+	:zIndex="zIndex">
+	<view class="gui-calendar gui-bg-white gui-box-shadow" 
+	@tap.stop.prevent="stopfun">
+		<!-- 顶部日期及切换 -->
+		<view class="gui-calendar-header gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center">
+			<text class="gui-calendar-header-btn gui-icons" 
+			@click="prevYear">&#xe600;&#xe600;</text>
+			<text class="gui-calendar-header-btn gui-icons" 
+			@click="prevMonth">&#xe600;</text>
+			<text class="gui-calendar-header-btn gui-icons" 
+			style="margin:20rpx;">{{cYear}} 年 {{cMonth}} 月</text>
+			<text class="gui-calendar-header-btn gui-icons" 
+			@click="nextMonth">&#xe601;</text>
+			<text class="gui-calendar-header-btn gui-icons" 
+			@click="nextYear">&#xe601;&#xe601;</text>
+		</view>
+		<!-- 星期 -->
+		<view class="gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center">
+			<text class="gui-calendar-weeks gui-block-text" v-for="(item, index) in weeks" :key="index">{{item}}</text>
+		</view>
+		<!-- 日历列表 -->
+		<view class="gui-bg-gray gui-flex gui-rows gui-wrap gui-calendar-days">
+			<view class="gui-calendar-ditems gui-flex gui-columns gui-justify-content-center gui-align-items-center"
+			:style="{
+				backgroundColor: currentDayIn == cYear+'-'+cMonthStr+'-'+ item.date ? activeBgColor : bgColor, 
+			borderRadius:borderRadius}" 
+			@click="chooseDate(cYear+'-'+cMonthStr+'-'+item.date, item.date)" 
+			v-for="(item, index) in days" :key="index">
+				<text class="gui-date-day" 
+				:style="{color : currentDayIn == (cYear+'-'+cMonthStr+'-'+item.date) ? '#FFFFFF' : 'rgba(69, 90, 100, 0.6)'}">{{item.date}}</text>
+				<text class="gui-date-nl" v-if="isLunar" 
+				:style="{color : currentDayIn == (cYear+'-'+cMonthStr+'-'+item.date) ? '#FFFFFF' : 'rgba(69, 90, 100, 0.6)'}">{{item.nl}}</text>
+			</view>
+		</view>
+		<!-- 时间选择 -->
+		<view 
+		class="gui-flex gui-rows gui-justify-content-center gui-align-items-center gui-bg-gray " 
+		v-if="isTime">
+			<picker mode="time" @change="timechange" :value="currentTimeIn">
+				<text 
+				class="gui-date-time gui-border-b gui-border-t gui-block-text" 
+				style="border-color:#D1D1D1;" >时间 : {{currentTimeIn}}</text>
+			</picker>
+		</view>
+		<!-- 按钮 -->
+		<view class="gui-flex gui-rows gui-space-between gui-align-items-center">
+			<view class="gui-date-btns-text" hover-class="gui-tap" @tap="close">
+				<text class="gui-date-btns-text gui-block-text gui-color-gray">取消</text>
+			</view>
+			<view class="gui-date-btns-text" hover-class="gui-tap" @tap="submit">
+				<text class="gui-date-btns-text gui-block-text gui-primary-color">确认</text>
+			</view>
+		</view>
+	</view>
+</gui-popup>
+</template>
+<script>
+import guiCalendar from './gui-calendar.js';
+export default {
+	name  : "gui-calendar", 
+	props : {
+		currentDate   : { type : String,  default : "" },
+		isTime        : { type : Boolean, default : true },
+		bgColor       : {type  : String,  default : "#F7F8FA"},
+		activeBgColor : {type  : String,  default : "#008AFF"},
+		borderRadius  : {type  : String,  default : "6rpx"},
+		isLunar       : {type  : Boolean, default : true },
+		zIndex        : {type  : Number,  default : 9999}
+	},
+	data(){
+		return {
+			weeks         : ['一', '二', '三', '四', '五', '六', '日'],
+			cYear         : 2016,
+			cMonth        : 6,
+			cMonthStr     : "06",
+			cDay          : "01",
+			days          : '',
+			currentDayIn  : '',
+			currentTimeIn : ''
+		}
+	},
+	created:function(){
+		this.initTime();
+	},
+	watch:{
+		currentDate  : function(){this.initTime();},
+	},
+	methods: {
+		stopfun:function(e){e.stopPropagation(); return ;},
+		timechange : function(e){
+			this.currentTimeIn = e.detail.value;
+		},
+		getDaysInOneMonth : function (){
+			var d = new Date(this.cYear, this.cMonth, 0);
+			return d.getDate();
+		},
+		getDay : function (){
+			var d = new Date(this.cYear, this.cMonth - 1, 0);
+			return d.getDay();
+		},
+		prevYear : function(){
+			this.cYear = this.cYear - 1;
+			this.changeMonth();
+		},
+		prevMonth : function(){
+			this.cMonth =  this.cMonth - 1;
+			if (this.cMonth < 1) { this.cMonth = 12; this.cYear = this.cYear - 1; }
+			this.cMonthStr = this.cMonth < 10 ? '0' + this.cMonth : this.cMonth;
+			this.changeMonth();
+		},
+		nextMonth : function(){
+			this.cMonth = this.cMonth + 1;
+			if (this.cMonth > 12){this.cMonth = 1; this.cYear = this.cYear + 1;}
+			this.cMonthStr = this.cMonth < 10 ? '0' + this.cMonth : this.cMonth;
+			this.changeMonth();
+		},
+		nextYear : function(){
+			this.cYear = this.cYear + 1;
+			this.changeMonth();
+		},
+		changeMonth:function(){
+			var daysList  = [];
+			var days      = this.getDaysInOneMonth();
+			var startWeek = this.getDay();
+			var forSteps  = 0;
+			for (var i = (0 - startWeek); i < days; i++){
+				if(i >= 0){
+					daysList[forSteps] = {date : i >= 9 ? i + 1 : '0' + (i+1), nl : ''};
+					daysList[forSteps].nl = guiCalendar.getLunarInfo(this.cYear, this.cMonth, i + 1);
+				}else{
+					daysList[forSteps] = '';
+				}
+				forSteps++;
+			}
+			this.days    = daysList;
+		},
+		chooseDate: function (sedDate, isday) {
+			if(!isday){return ;}
+			this.currentDayIn = sedDate;
+			if(this.isTime){return ;}
+			this.$emit('changeDate', sedDate);
+		},
+		submit : function(){
+			if(this.isTime){
+				this.$emit('changeDate', this.currentDayIn + ' ' + this.currentTimeIn);
+				this.$emit('confirm'   , this.currentDayIn + ' ' + this.currentTimeIn);
+			}else{
+				this.$emit('changeDate', this.currentDayIn);
+				this.$emit('confirm'   , this.currentDayIn);
+			}
+			this.close();
+		},
+		//初始化时间
+		initTime : function(){
+			if(this.currentDate == ''){
+				var dateObj        = new Date();
+				this.cYear         = dateObj.getFullYear();
+				this.cMonth        = dateObj.getMonth() + 1;
+				this.cMonthStr     = this.cMonth < 10 ? '0' + this.cMonth : this.cMonth;
+				this.cDay          = dateObj.getDate();
+				this.cDay          = this.cDay < 10 ? '0' + this.cDay : this.cDay;
+				this.currentDayIn  = this.cYear + '-' + this.cMonthStr + '-' + this.cDay;
+				this.currentTimeIn = '00:00';
+				this.changeMonth();
+			}else{
+				var dates          = this.currentDate.split(' ');
+				if (!dates[1]) { dates[1] = '';}
+				var dayArr         = dates[0].split('-');
+				this.cYear         = Number(dayArr[0]);
+				this.cMonth        = dayArr[1];
+				this.cDay          = dayArr[2];
+				var reg            = new RegExp('^0[0-9]+$');
+				if(reg.test(this.cMonth)){this.cMonth = this.cMonth.substr(1,1);}
+				this.cMonth        = Number(this.cMonth);
+				this.cMonthStr     = this.cMonth < 10 ? '0'+this.cMonth : this.cMonth;
+				this.currentDayIn  = dates[0];
+				this.currentTimeIn = dates[1];
+				this.changeMonth();
+			}
+		},
+		open:function(){this.$refs.guipopupforcalendar.open();},
+		close:function(){this.$refs.guipopupforcalendar.close();}
+	}
+}
+</script>
+<style scoped>
+.gui-calendar{border-top-left-radius:10rpx; border-top-right-radius:10rpx; padding:10rpx 0;}
+.gui-calendar-header{height:80rpx;}
+.gui-calendar-header-btn{font-size:32rpx; padding:0 10rpx; color:rgba(69, 90, 100, 0.6);}
+.gui-calendar-weeks{width:100rpx; color:#2B2E3D; height:80rpx; text-align:center; font-size:30rpx; line-height:80rpx;}
+.gui-calendar-days{padding:25rpx;}
+.gui-calendar-ditems{width:96rpx; height:96rpx; margin:2rpx;}
+
+.gui-date-day{height:38rpx; line-height:38rpx; text-align:center; font-size:32rpx;}
+.gui-date-nl{height:26rpx; line-height:26rpx; font-size:20rpx; text-align:center;}
+.gui-date-btns-text{line-height:100rpx; font-size:28rpx; text-align:center; width:300rpx;}
+.gui-date-time{font-size:28rpx; line-height:80rpx; height:80rpx; margin-bottom:30rpx;}
+</style>

+ 192 - 0
lib/GraceUI5/components/gui-car-number.vue

@@ -0,0 +1,192 @@
+<template>
+	<gui-popup 
+	ref="guipopupforcarnumber" 
+	width="750rpx" 
+	position="bottom" 
+	:canCloseByShade="true">
+		<view 
+		@tap.stop.prevent="stopfun" 
+		class="gui-bg-white">
+			<view 
+			class="gui-flex gui-rows gui-space-between gui-align-items-center"
+			style="padding:20rpx;">
+				<!-- 类型 -->
+				<view style="width:320rpx;">
+				<gui-segmented-control 
+				:items="['普通车牌','新能源牌']" 
+				:current="carType" 
+				@change="changeType"></gui-segmented-control>
+				</view>
+				<text class="gui-car-number-submit gui-block-text gui-color-blue" 
+				@tap="confirm">确定</text>
+			</view>
+			<!-- 车牌展示 -->
+			<view 
+			class="gui-flex gui-rows gui-nowrap gui-justify-content-center" 
+			style="padding-top:20rpx; padding-bottom:20rpx;">
+				<text class="gui-car-number-item gui-block-text" 
+				:class="[
+					idx == inputIndex ? 'gui-bg-blue' : '',
+					idx == inputIndex ? 'gui-a-shade' : ''
+				]" 
+				v-for="(item, idx) in carNumberArray" :key="idx" 
+				@tap="numberTap(idx)">{{item}}</text>
+			</view>
+			<!-- 错误信息 -->
+			<view 
+			v-if="errorshow" 
+			style="padding:20rpx; margin-bottom:10rpx;">
+				<text class="gui-text gui-block-text gui-color-red gui-text-center">请输入完整车牌号码</text>
+			</view>
+			<view class="gui-bg-gray" 
+			style="padding:15rpx;">
+				<!-- 省份前缀键盘 -->
+				<view class="gui-flex gui-rows gui-wrap" 
+				v-if="inputIndex == 0">
+					<view class="gui-car-number-key" 
+					hover-class="gui-bg-blue" 
+					:hover-stay-time="50" 
+					v-for="(item, idx) in provinces" 
+					:key="idx" 
+					@tap="provinceTap(item)">
+						<text class="gui-car-number-key-txt gui-block-text">{{item}}</text>
+					</view>
+				</view>
+				<!-- 号码键盘 -->
+				<view class="gui-flex gui-rows gui-wrap gui-space-between" 
+				v-else>
+					<view class="gui-car-number-key" 
+					hover-class="gui-kd-tap" 
+					:hover-stay-time="50" 
+					v-for="(item, idx) in keyWords" 
+					:key="idx" 
+					@tap="keyTap(item)">
+						<text class="gui-car-number-key-txt gui-block-text">{{item}}</text>
+					</view>
+					<view class="gui-car-number-key"
+					hover-class="gui-kd-tap" 
+					@tap="deleteNumber">
+						<text class="gui-car-number-key-txt gui-block-text gui-icons">&#xe623;</text>
+					</view>
+				</view>
+			</view>
+			<gui-iphone-bottom></gui-iphone-bottom>
+		</view>
+	</gui-popup>
+</template>
+<script>
+export default{
+	name  : "gui-car-number",
+	props : {},
+	data() {
+		return {
+			carNumber      : '',
+			carNumberArray : [],
+			carType        : 0,
+			inputIndex     : 0,
+			provinces      : ['京','津','沪','渝','冀','豫','云',
+							  '辽','黑','湘','皖','鲁','新','苏',
+							  '浙','赣','鄂','桂','甘','晋','蒙',
+							  '陕','吉','闽','贵','粤','青','藏',
+							  '川','宁','琼','使','领','新'
+							],
+			keyWords       : ['1','2','3','4','5','6','7','8','9','0',
+							  'A','B','C','D','E','F','G','H',
+							  'J','K','L','M','N','P','Q','R',
+							  'S','T','U','V','W','X','Y','Z',
+							  '港','澳','学','领','警'],
+			errorshow      : false
+		}
+	},
+	mounted:function(){
+		this.showNumber();
+	},
+	methods:{
+		showError  : function () {
+			this.errorshow = true;
+			setTimeout(()=>{this.errorshow = false},2000)
+		},
+		confirm    : function () {
+			let carNumberLength = this.carType == 0 ? 7 : 8;
+			if(this.carNumber.length < carNumberLength){
+				this.showError();
+				return ;
+			}
+			this.$emit('confirm', this.carNumber);
+			this.$refs.guipopupforcarnumber.close();
+		},
+		numberTap  : function (idx) {
+			this.inputIndex = idx
+		},
+		provinceTap : function(key){
+			this.carNumberArray[0] = key;
+			this.carNumber = this.carNumberArray.join('');
+			this.showNumber();
+		},
+		keyTap     : function(key){
+			let carNumberLength = this.carType == 0 ? 7 : 8;
+			if(this.inputIndex >= carNumberLength){return ;}
+			this.carNumberArray[this.inputIndex] = key;
+			this.carNumber = this.carNumberArray.join('');
+			this.showNumber();
+		},
+		showNumber : function(){
+			let carNumberArray     = this.carNumber.split('');
+			let carNumberLength    = this.carType == 0 ? 7 : 8;
+			let carNumberArrLength = carNumberArray.length;
+			this.carNumberArray    = [];
+			var inputIndex        = 0;
+			for(let i = 0; i < carNumberLength; i++){
+				if(carNumberArrLength > i){
+					this.carNumberArray[i] = carNumberArray[i];
+					inputIndex++;
+				}else{
+					this.carNumberArray[i] = '';
+				}
+			}
+			this.carNumber  = this.carNumberArray.join('');
+			this.inputIndex = inputIndex;
+		},
+		changeType : function(e){
+			this.carType = e;
+			this.showNumber();
+		},
+		setType : function(carType){
+			this.carType   = carType;
+			this.showNumber();
+		},
+		setVal  : function(carNumber){
+			this.carNumber = carNumber;
+			this.showNumber();
+		},
+		deleteNumber : function(){
+			if(this.inputIndex < 0){return ;}
+			this.carNumberArray.splice((this.inputIndex -1), 1, '');
+			this.carNumber = this.carNumberArray.join('');
+			this.showNumber();
+		},
+		open : function(){
+			this.$refs.guipopupforcarnumber.open();
+		},
+		stopfun : function(e){
+			e.stopPropagation();
+			return ;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-car-number-item{width:70rpx; height:70rpx; font-size:30rpx; line-height:70rpx; text-align:center; border:1px solid #CECECE; border-radius:6rpx; margin-right:15rpx; font-weight:700;}
+.gui-car-number-key{width:76rpx; height:76rpx; border:1px solid #CECECE; border-radius:6rpx; margin:5rpx;}
+.gui-car-number-key-txt{font-size:30rpx; line-height:76rpx; text-align:center;}
+.gui-car-number-submit{width:100rpx; line-height:60rpx; text-align:center; font-size:30rpx;}
+.gui-bg-blue{color:#FFFFFF; border-color: #008AFF;}
+/* #ifndef APP-NVUE */
+@keyframes gui-a-shade{0%{opacity:1;} 25%{opacity:0.6;} 50%{opacity:0.6;} 75%{opacity:1;} 100%{opacity:1;}}
+.gui-a-shade{animation:gui-a-shade 1.5s ease infinite;}
+.gui-kd-tap{color:#FFFFFF; background-color:#008AFF; border-color:#008AFF;}
+/* #endif */
+/* #ifdef APP-NVUE */
+.gui-kd-tap{color:#FFFFFF; background-color:#CECECE; border-color:#CECECE;}
+/* #endif */
+</style>

+ 102 - 0
lib/GraceUI5/components/gui-choose-images.vue

@@ -0,0 +1,102 @@
+<template>
+	<view class="gui-flex gui-rows gui-wrap">
+		<view class="gui-add-list-items" :style="{borderRadius:borderRadius}" 
+		v-for="(item, index) in imgLists" :key="index">
+			<image :src="item.url" :data-imgurl="item.url" 
+			:style="{borderRadius:borderRadius}" 
+			@tap="showImgs" class="gui-add-list-img" :mode="imgMode"></image>
+			<text class="gui-add-list-remove gui-icons" 
+			:style="{color:removeBtnColor}" @tap="removeImg" 
+			:id="'gui-items-img-'+index">&#xe632;</text>
+		</view>
+		<view class="gui-add-list-items gui-flex gui-columns gui-justify-content-center gui-align-items-center" 
+		@tap="addImg" v-if="imgLists.length < maxFileNumber" 
+		:style="{borderRadius:borderRadius}">
+			<text class="gui-add-list-btn-icon gui-block-text gui-color-gray">+</text>
+			<text class="gui-add-list-btn-text gui-block-text gui-color-gray">{{btnName}}</text>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-choose-images",
+	props : {
+		maxFileNumber  : { type : Number, default : 9 },
+		btnName        : { type : String, default : "添加照片" },
+		items          : { type : Array,  default : function () {return []; }},
+		removeBtnColor : { type : String, default : "rgba(0, 0, 0, 0.8)" },
+		imgMode        : { type : String, default : 'widthFix' },
+		sourceType     : { type : Array,  default : function () {return ['album', 'camera'];}},
+		borderRadius   : { type : String, default : "10rpx" }
+	},
+	data() {
+		return {
+			imgLists : []
+		}
+	},
+	created:function () {
+		this.initImgs();
+	},
+	watch:{
+		items:function(){ this.initImgs(); }
+	},
+    methods:{
+		initImgs : function(){
+			var imgs = [];
+			for(let i = 0; i < this.items.length; i++){
+				imgs.push({url:this.items[i],  progress : 100});
+			}
+			this.imgLists = imgs;
+		},
+        addImg : function(){
+            var num = this.maxFileNumber - this.imgLists.length;
+            if(num < 1){return false;}
+            uni.chooseImage({
+                count      : num,
+                sizeType   : ['compressed'],
+				sourceType : this.sourceType,
+                success    : (res) => {
+					if(this.imgLists.length >= this.maxFileNumber){return ;}
+					for(let i = 0; i < res.tempFilePaths.length; i++){
+						if(this.imgLists.length >= this.maxFileNumber){break;}
+						this.imgLists.push({url:res.tempFilePaths[i], progress:0});
+					}
+                    this.$emit('change', this.imgLists);
+                },
+				complete   : function(){}
+            });
+        },
+        removeImg : function(e){
+            var index = e.currentTarget.id.replace('gui-items-img-', '');
+			var removeImg =  this.imgLists.splice(index, 1);
+			this.$emit('removeImg', removeImg[0]);
+			this.$emit('change'   , this.imgLists);
+        },
+        showImgs : function(e){
+            var currentImg = e.currentTarget.dataset.imgurl;
+			var imgs = [];
+			for(let i = 0; i < this.imgLists.length; i++){
+				imgs.push(this.imgLists[i].url);
+			}
+            uni.previewImage({
+              urls: imgs,
+              current : currentImg
+            })
+        },
+		setItems : function(items){
+			this.imgLists = [];
+			for(let i = 0; i < items.length; i++){
+				this.imgLists.push({url : items[i], progress : 100});
+			}
+			this.$emit('change', this.imgLists);
+		}
+    }
+}
+</script>
+<style scoped>
+.gui-add-list-btn-text{font-size:26rpx; line-height:36rpx; text-align:center;}
+.gui-add-list-btn-icon{font-size:80rpx; height:80rpx; line-height:80rpx; margin-bottom:20rpx;}
+.gui-add-list-items{width:212rpx; height:212rpx; overflow:hidden; margin:9rpx; background-color:#F8F8F8; font-size:0; position:relative;}
+.gui-add-list-remove{width:60rpx; height:60rpx; line-height:60rpx; text-align:center; font-size:44rpx; position:absolute; z-index:1; right:0; bottom:0;}
+.gui-add-list-img{width:212rpx;}
+</style>

+ 151 - 0
lib/GraceUI5/components/gui-count-down.vue

@@ -0,0 +1,151 @@
+<template name="gui-count-down">
+	<view class="gui-flex gui-rows gui-nowrap gui-align-items-center" 
+	v-if="show && timer != ''">
+		<text class="gui-countdown-numbers gui-border" 
+		:style="{
+		borderColor:borderColor, 
+		width:size*lineHeight+'rpx', marginRight:spacing, 
+		height:size*lineHeight+'rpx', lineHeight:size*lineHeight+'rpx', fontSize:size+'rpx', 
+		color:fontColor, backgroundColor:bgColor}" 
+		v-if="d > 0">{{d}}</text>
+		
+		<text class="gui-countdown-splitor" 
+		:style="{color:splitorColor, fontSize:size+'rpx', marginRight:spacing}" 
+		v-if="d > 0">{{splitorText[0]}}</text>
+		
+		<text class="gui-countdown-numbers gui-border" 
+		:style="{
+		borderColor:borderColor, 
+		width:size*lineHeight+'rpx', marginRight:spacing, 
+		height:size*lineHeight+'rpx', lineHeight:size*lineHeight+'rpx', fontSize:size+'rpx', 
+		color:fontColor, backgroundColor:bgColor}" 
+		v-if="(h != '00' || zeroShow)">{{h}}</text>
+		
+		<text class="gui-countdown-splitor" 
+		:style="{color:splitorColor, fontSize:size+'rpx', marginRight:spacing}" 
+		v-if="(h != '00' || zeroShow)">{{splitorText[1]}}</text>
+		
+		<text class="gui-countdown-numbers gui-border" 
+		:style="{
+		borderColor:borderColor, 
+		width:size*lineHeight+'rpx', marginRight:spacing, 
+		height:size*lineHeight+'rpx', lineHeight:size*lineHeight+'rpx', fontSize:size+'rpx', 
+		color:fontColor, backgroundColor:bgColor}">{{i}}</text>
+		
+		<text class="gui-countdown-splitor" 
+		:style="{color:splitorColor, fontSize:size+'rpx', marginRight:spacing}">{{splitorText[2]}}</text>
+		
+		<text class="gui-countdown-numbers gui-border" 
+		:style="{
+		borderColor:borderColor, 
+		width:size*lineHeight+'rpx', marginRight:spacing, 
+		height:size*lineHeight+'rpx', lineHeight:size*lineHeight+'rpx', fontSize:size+'rpx', 
+		color:fontColor, backgroundColor:bgColor}">{{s}}</text>
+		
+		<text class="gui-countdown-splitor" 
+		:style="{color:splitorColor, fontSize:size+'rpx'}">{{splitorText[3]}}</text>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-count-down",
+	props : {
+		bgColor       : { type: String, default : "#FFFFFF" },
+		borderColor   : { type:String,  default : "#FFFFFF"},
+		fontColor     : { type: String, default : "#2B2E3D" },
+		size          : { type: Number, default : 26},
+		lineHeight    : { type: Number, default : 1.8},
+		splitorColor  : { type: String, default : "rgba(69, 90, 100, 0.6)" },
+		timer         : { type:String,  default : "" },
+		splitorText   : { type : Array,
+			default : function () {
+				return ['天', '时', '分', '秒']
+			}
+		},
+		show          : {type:Boolean, default:true},
+		zeroShow      : {type:Boolean, default:true},
+		spacing       : {type:String, default:'0rpx'}
+	},
+	data() {
+		return {
+			d           : 0,
+			h           : "",
+			i           : "",
+			s           : "",
+			leftTime    : 0,
+			outTimer    : null,
+			timerIn     : '',
+			leftTimeNum : 0
+		}
+	},
+	created : function(){
+		this.timerIn = this.timer;
+		this.runbase();
+	},
+	watch   : {
+		timer : function(){
+			this.timerIn = this.timer;
+			this.runbase();
+		}
+	},
+	methods : {
+		runbase : function(){
+			var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
+			var res = this.timerIn.match(reg);
+			if (res == null){ return false;}
+			var year = parseInt(res[1]);
+			if (year < 1000) { return false; }
+			var month = parseInt(res[2]);
+			var day = parseInt(res[3]);
+			var h = parseInt(res[4]);
+			if (h < 0 || h > 24) { return false; }
+			var i = parseInt(res[5]);
+			if (i < 0 || i > 60) { return false; }
+			var s = parseInt(res[6]);
+			if (s < 0 || s > 60) { return false; }
+			var leftTime = new Date(year, month - 1, day, h, i, s);
+			this.leftTime = leftTime;
+			clearTimeout(this.outTimer);
+			this.countDown();
+		},
+		countDown: function (){
+			var leftTime     = this.leftTime - new Date();
+			this.leftTimeNum = leftTime;
+			if (leftTime > 0) {
+				var day     = parseInt(leftTime  / (1000 * 60 * 60 * 24));
+				var hours   = parseInt((leftTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+				var minutes = parseInt((leftTime % (1000 * 60 * 60)) / (1000 * 60));
+				var seconds = parseInt((leftTime % (1000 * 60)) / 1000);
+				if (hours   < 10) { hours   = '0' + hours;}
+				if (minutes < 10) { minutes = '0' + minutes; }
+				if (seconds < 10) { seconds = '0' + seconds; }
+				this.h = hours; 
+				this.i = minutes; 
+				this.s = seconds; 
+				this.d = day;
+				this.outTimer = setTimeout(()=>{this.countDown();}, 1000);
+			}else{
+				clearTimeout(this.outTimer);
+				this.h = '00'; 
+				this.i = '00'; 
+				this.s = '00'; 
+				this.d = 0;
+				this.$emit('endDo');
+			}
+		},
+		reSetTimer : function(timer){
+			clearTimeout(this.outTimer);
+			this.timerIn = timer;
+			this.runbase();
+		},
+		getTimeRemaining : function(){
+			if(this.leftTimeNum < 0){return 0;}
+			return parseInt(this.leftTimeNum / 1000);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-countdown-splitor{padding:0 5rpx;}
+.gui-countdown-numbers{border-radius:8rpx; text-align:center;}
+</style>

+ 59 - 0
lib/GraceUI5/components/gui-coupons.vue

@@ -0,0 +1,59 @@
+<template>
+	<view class="gui-coupons gui-flex gui-rows gui-nowrap">
+		<view class="gui-coupons-left gui-flex1 gui-flex gui-rows gui-nowrap gui-space-between gui-align-items-center" 
+		:style="{backgroundColor:coupon.ltBg, height:coupon.height}">
+			<view class="gui-coupons-left-number">
+				<view class="gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center">
+					<text class="gui-color-gray gui-h4">{{coupon.unit}}</text>
+					<text class="gui-h3 gui-bold" 
+					:style="{color:coupon.color}">{{coupon.number}}</text>
+				</view>
+				<text class="gui-text-small gui-block-text gui-text-center" 
+				:style="{color:coupon.color}">{{coupon.txt}}</text>
+			</view>
+			<view class="gui-coupons-left-body">
+				<text class="gui-block-text gui-h5 gui-primary-color">{{coupon.title}}</text>
+				<text class="gui-block-text gui-text-small gui-color-gray">{{coupon.desc}}</text>
+			</view>
+			<text class="gui-coupons-status"
+			v-if="coupon.drawed" 
+			:style="{backgroundColor:coupon.color}">{{coupon.drawed}}</text>
+		</view>
+		<text class="gui-coupons-right gui-color-white gui-text-center gui-block-text" 
+		:style="{
+			height:coupon.height, 
+			lineHeight:coupon.height, 
+			backgroundColor:coupon.color
+		}">{{coupon.btn}}</text>
+		<view class="gui-coupons-sawtooth" 
+		:style="{
+		height:coupon.height,
+		backgroundColor:coupon.color}">
+			<view class="gui-coupons-sawtooth-circular" 
+			v-for="(item, index) in 10" :key="index"></view>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-coupons",
+	props : {
+		coupon : {
+			type : Object,
+			default :  function  () {
+				return {}
+			}
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-coupons{border-top-left-radius:10rpx; border-bottom-left-radius:10rpx;}
+.gui-coupons-left{width:500rpx; height:150rpx; padding-right:10rpx; border-radius:8rpx; position:relative;}
+.gui-coupons-left-number{width:168rpx; border-right:1px dashed #D2D2D2;}
+.gui-coupons-left-body{width:320rpx;}
+.gui-coupons-status{color:#FFFFFF; padding:0 10px; height:36rpx; line-height:36rpx; font-size:20rpx; position:absolute; z-index:1; right:6px; top:8px; border-radius:36rpx;}
+.gui-coupons-right{width:150rpx; height:150rpx; font-size:32rpx;}
+.gui-coupons-sawtooth{width:8px; height:150rpx; overflow:hidden; position:relative;}
+.gui-coupons-sawtooth-circular{width:10px; margin:3px 5px; height:10px; border-radius:10px; background:#F8F8F8;}
+</style>

+ 164 - 0
lib/GraceUI5/components/gui-date-between.vue

@@ -0,0 +1,164 @@
+<template>
+	<view>
+		<view class="gui-flex gui-date-bt-block" 
+		:style="{backgroundColor:weekBg}">
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">一</text>
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">二</text>
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">三</text>
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">四</text>
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">五</text>
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">六</text>
+			<text class="gui-date-bt-item gui-date-bt-week gui-block-text">日</text>
+		</view>
+		<view v-for="(days, daysIndex) in daysData" :key="daysIndex">
+			<view class="gui-flex gui-date-bt-month-w">
+				<text class="gui-date-bt-month gui-block-text" 
+				:style="{backgroundColor:startBg}">{{days[0][0]}}{{unit[0]}}{{days[0][1]}}{{unit[1]}}</text>
+			</view>
+			<view class="gui-flex gui-date-bt-block">
+				<text class="gui-date-bt-item gui-date-bt-days" 
+				v-for="(item, index) in days[1]" :key="index" 
+				:style="{
+					backgroundColor:item[1] ? sedBg : itemBg, 
+					color:item[1] ? sedColor : color
+				}" 
+				:data-dt="item[0] == '' ? '' : days[0][0]+''+days[0][1]+''+item[0]" 
+				@tap.stop="selectDay">{{item[0]}}<text class="gui-date-bt-start" 
+				v-if="sedDays[0] == days[0][0]+''+days[0][1]+''+item[0] || sedDays[1] == days[0][0]+''+days[0][1]+''+item[0]" 
+				:style="{
+					backgroundColor : sedDays[1] == days[0][0]+''+days[0][1]+''+item[0] ? endBg : startBg, 
+					color:sedColor}">{{item[0]}}</text></text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+/* 组件百分百原创 拒绝任何代码抄袭及思路抄袭 */
+export default{
+	name  : "gui-date-between",
+	props : {
+		weekBg      : { type : String, default:'#F8F8F8'},
+		unit        : { type : Array,  default:function(){return [' 年 ',' 月'];}},
+		sedBg       : { type : String, default:'rgba(54,136,255,0.8)'},
+		itemBg      : { type : String, default:'#FFFFFF'},
+		color       : { type : String, default:'#323232'},
+		sedColor    : { type : String, default:'#FFFFFF'},
+		startBg     : { type : String, default:'rgba(54,136,255,1)'},
+		endBg       : { type : String, default:'rgba(54,136,255,1)'},
+		monthNumber : { type : Number, default:2}
+	},
+	data() {
+		return {
+			sedDays:[0,0],
+			btDays :[],
+			daysData : []
+		}
+	},
+	created:function(){
+		this.setMonth(this.currentMonth());
+	},
+	methods:{
+		setBetween:function(days){
+			if(days[1] == 0){days[1] = days[0];}
+			days[0]          = Number(days[0]);
+			days[1]          = Number(days[1]);
+			this.sedDays     = days;
+			var countNumber  = 0;
+			var daysNew      = [];
+			this.daysData.forEach((itm)=>{
+				var year     = itm[0][0];
+				var month    = itm[0][1];
+				var daysIn   = [];
+				itm[1].forEach((item)=>{
+					var cDay = year+''+month+''+item[0];
+					cDay = Number(cDay);
+					if(cDay >= days[0] && cDay <= days[1]){
+						item[1] = true; 
+						countNumber++;
+					}else{
+						item[1] = false;
+					}
+					daysIn.push(item);
+				});
+				daysNew.push([[year, month], daysIn]);
+			});
+			this.daysData = daysNew;
+			this.$emit('selectDate', [days, countNumber]);
+		},
+		setMonth:function(month){
+			var reg = /^([0-9]{4}).*([0-9]{2}).*$/;
+			var res = month.match(reg);
+			if(res == null){month = this.currentMonth(); res = month.match(reg);}
+			this.setMonthBase(res);
+		},
+		setMonthBase : function(res){
+			var daysData = [];
+			if(res[2].substr(0,1) == '0'){res[2] = res[2].substr(1);}
+			res[1]    = Number(res[1]);
+			res[2]    = Number(res[2]);
+			var year  = res[1];
+			var month = res[2];
+			for(let i = 0; i < this.monthNumber; i++){
+				var monthIn = month + i;
+				var yearIn  = year;
+				if(monthIn > 12){monthIn = monthIn - 12; yearIn += 1;}
+				if(monthIn < 10){monthIn = '0'+monthIn;}
+				daysData[i] = [];
+				daysData[i].push([yearIn, monthIn]);
+				var days = this.getDays(yearIn,monthIn);
+				var daysList  = [];
+				for (let ii = (0 - days[1]); ii < days[0]; ii++){
+					if(ii >= 0){
+						daysList.push([ii >= 9 ? ii + 1 : '0' + (ii+1), false]);
+					}else{
+						daysList.push(['',false]);
+					}
+				}
+				daysData[i].push(daysList);
+			}
+			this.daysData = daysData;
+		},
+		currentMonth : function () {
+			var date = new Date();
+			var y = date.getFullYear();
+			var m = date.getMonth() + 1;
+			m = m < 10 ? ('0' + m) : m;
+			return y + '年' + m + '月';
+		},
+		getDays : function(year,month){
+			var d         = new Date(year, month, 0);
+			var days      = d.getDate();
+			var d2        = new Date(year, month - 1, 0);
+			var startWeek = d2.getDay();
+			return [days, startWeek];
+		},
+		selectDay:function(e){
+			var day = e.currentTarget.dataset.dt;
+			if(day == ''){return ;}
+			day = Number(day);
+			if(this.sedDays[0] == 0){ this.sedDays[0] = day; }
+			else if(this.sedDays[1] == 0 || this.sedDays[0] == this.sedDays[1]){
+				if(day > this.sedDays[0]){
+					this.sedDays[1] = day;
+				}else if(day < this.sedDays[0]){
+					this.sedDays[1] = this.sedDays[0];
+					this.sedDays[0] = day;
+				}
+			}else{
+				this.sedDays[0] = day;
+				this.sedDays[1] = 0;
+			}
+			this.setBetween(this.sedDays);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-date-bt-block{flex-direction:row; flex-wrap:wrap;}
+.gui-date-bt-item{width:98rpx; text-align:center; position:relative;}
+.gui-date-bt-week{line-height:80rpx; height:80rpx; font-size:28rpx;}
+.gui-date-bt-month-w{flex-direction:row; flex-wrap:nowrap; margin:25px 0;}
+.gui-date-bt-month{line-height:50rpx; text-align:center; color:#FFFFFF; width:258rpx; border-radius:30rpx; font-size:26rpx;}
+.gui-date-bt-days{line-height:98rpx; height:98rpx; width:98rpx; font-size:28rpx;}
+.gui-date-bt-start{position:absolute; font-size:28rpx; font-weight:bold; width:98rpx; height:98rpx; text-align:center; line-height:98rpx; z-index:1; left:0; top:0;}
+</style>

+ 100 - 0
lib/GraceUI5/components/gui-datetime-between.vue

@@ -0,0 +1,100 @@
+<template>
+	<view>
+		<view @tap.stop="open"><slot></slot></view>
+		<view class="gui-dateBT-shade gui-flex gui-columns gui-justify-content-end" 
+		v-if="show" :style="{zIndex:zIndex}">
+			<view class="gui-bg-white">
+				<view class="graceDateTime-header gui-flex gui-rows gui-space-between gui-bg-gray">
+					<text class="graceDateTime-header-btn" 
+					:style="{color:cancelTColor}" 
+					@tap="close">{{cancelText}}</text>
+					<text class="graceDateTime-header-btn" 
+					:style="{textAlign:'right', color:confirmColor}" 
+					@tap="confirm">{{confirmText}}</text>
+				</view>
+				<view>
+					<text class="graceDateTimeBT-text gui-block-text">{{titles[0]}}</text>
+				</view>
+				<!-- 起始时间 -->
+				<view style="overflow:hidden;">
+					<gui-datetime-bt-base :value="startValue" @change="chang1"   
+					:isTime="isTime" 
+					:isSecond="isSecond" 
+					:isMinute="isMinute" 
+					:startYear="startYear" 
+					:endYear="endYear" 
+					:units="units"></gui-datetime-bt-base>
+				</view>
+				<!-- 结束时间 -->
+				<view class="gui-margin-top">
+					<text class="graceDateTimeBT-text gui-block-text">{{titles[1]}}</text>
+				</view>
+				<view style="overflow:hidden;">
+					<gui-datetime-bt-base 
+					:value="endValue" 
+					:isTime="isTime" 
+					:isMinute="isMinute" 
+					@change="chang2" 
+					:isSecond="isSecond" 
+					:startYear="startYear" 
+					:endYear="endYear" 
+					:units="units"></gui-datetime-bt-base>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-datetime-between",
+	props : {
+		cancelText    : { type : String,  default : '取消' },
+		cancelTColor  : { type : String,  default : '#888888' },
+		confirmText   : { type : String,  default : '确定' },
+		confirmColor  : { type : String,  default : '#008AFF' },
+		startValue    : { type : String , default : ''},
+		endValue      : { type : String , default : ''},
+		isTime        : { type : Boolean, default : true},
+		isMinute      : { type : Boolean, default : true},
+		isSecond      : { type : Boolean, default : true},
+		startYear     : { type : Number,  default : 1980},
+		endYear       : { type : Number,  default : 2050},
+		units         : { type : Array ,  default : function(){return new Array('年','月','日','时','分','秒')}},
+		titles        : { type : Array ,  default : function(){return new Array('开始时间','结束时间')}},
+		zIndex        : { type : Number,  default : 90 }
+	},
+	data() {
+		return {
+			indicatorStyle : 'height:35px',
+			defaultVal     : [0,0,0,0,0,0],
+			sDate:[[],[],[],[],[],[]],
+			recDate:[[],[]],
+			show : false
+		}
+	},
+	methods:{
+		open : function () {
+			this.show = true;
+		},
+		close : function () {
+			this.show = false;
+		},
+		confirm : function(){
+			this.$emit('confirm', this.recDate);
+			this.close();
+		},
+		chang1 : function(res){
+			this.recDate[0] = res;
+		},
+		chang2 : function(res){
+			this.recDate[1] = res;
+		},
+	}
+}
+</script>
+<style scoped>
+.gui-dateBT-shade{width:750rpx; position:fixed; z-index:99; left:0; top:0; bottom:0; flex:1; overflow:hidden; background-color:rgba(0,0,0,0.5);}
+.graceDateTime-header{padding:25rpx;}
+.graceDateTime-header-btn{width:200rpx; line-height:38rpx; height:38rpx; font-size:28rpx;}
+.graceDateTimeBT-text{padding:15rpx; background-color:#FFFFFF; line-height:80rpx; height:80rpx; color:rgba(69, 90, 100, 0.6); font-size:26rpx;}
+</style>

+ 167 - 0
lib/GraceUI5/components/gui-datetime-bt-base.vue

@@ -0,0 +1,167 @@
+<template>
+	<picker-view :style="{height:height}"
+	:indicator-style="indicatorStyle" 
+	class="graceDateTime-main" 
+	:value="defaultVal" @change="change">
+		<picker-view-column>
+			<text class="graceDateTime-item gui-block-text" 
+			v-for="(item, index) in sDate[0]" :key="index">{{item}}{{units[0]}}</text>
+		</picker-view-column>
+		<picker-view-column>
+			<text class="graceDateTime-item gui-block-text" 
+			v-for="(item, index) in sDate[1]" :key="index">{{item}}{{units[1]}}</text>
+		</picker-view-column>
+		<picker-view-column>
+			<text class="graceDateTime-item gui-block-text" 
+			v-for="(item, index) in sDate[2]" :key="index">{{item}}{{units[2]}}</text>
+		</picker-view-column>
+		<picker-view-column v-if="isTime">
+			<text class="graceDateTime-item gui-block-text" 
+			v-for="(item, index) in sDate[3]" :key="index">{{item}}{{units[3]}}</text>
+		</picker-view-column>
+		<picker-view-column v-if="isTime && isMinute">
+			<text class="graceDateTime-item gui-block-text" 
+			v-for="(item, index) in sDate[4]" :key="index">{{item}}{{units[4]}}</text>
+		</picker-view-column>
+		<picker-view-column  v-if="isTime && isMinute && isSecond">
+			<text class="graceDateTime-item gui-block-text" 
+			v-for="(item, index) in sDate[5]" :key="index">{{item}}{{units[5]}}</text>
+		</picker-view-column>
+	</picker-view>
+</template>
+<script>
+export default {
+	name  : "gui-datetime-bt-base",
+	props : {
+		value     : { type : String , default:''},
+		isMinute  : { type : Boolean, default : true},
+		isTime    : { type : Boolean, default : true},
+		isSecond  : { type : Boolean, default : true},
+		startYear : { type : Number, default : 1980},
+		endYear   : { type : Number, default : 2050},
+		units     : { type : Array , default:function(){return new Array('年','月','日','时','分','秒')}},
+		height    : { type : String, default : '300rpx' }
+	},
+	data() {
+		return {
+			indicatorStyle : 'height:38px',
+			defaultVal     : [0,0,0,0,0,0],
+			sDate:[[],[],[],[],[],[]]
+		}
+	},
+	created() {this.init();},
+	methods: {
+		now : function () {
+			var date = new Date();
+			var y = date.getFullYear();
+			var m = date.getMonth() + 1;
+			m = m < 10 ? ('0' + m) : m;
+			var d = date.getDate();
+			d = d < 10 ? ('0' + d) : d;
+			var h = date.getHours();
+			h = h < 10 ? ('0' + h) : h;
+			var minute = date.getMinutes();
+			var second = date.getSeconds();
+			minute = minute < 10 ? ('0' + minute) : minute;
+			second = second < 10 ? ('0' + second) : second;
+			return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;
+		},
+		arrayIndexOf : function(arr, needFind){
+			var index = -1;
+			for(let i = 0; i < arr.length; i++){if(arr[i] == needFind){index = i; return i;}}
+			return index;
+		},
+		setValue : function (val) {
+			if(val == ''){val = this.now();}
+			var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
+			var res = val.match(reg);
+			if(res == null){
+				reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/;
+				res = val.match(reg);
+				if(res == null){
+					this.setValue(this.now());
+					return ;
+				}
+				res[4] = '00';
+				res[5] = '00';
+				res[6] = '00';
+			}
+			this.setDefaults([res[1],res[2],res[3],res[4],res[5],res[6]]);
+		},
+		setDefaults : function (res) {
+			for(let i = 0; i < res.length; i++){
+				var index = this.arrayIndexOf(this.sDate[i], res[i]);
+				if(index == -1){index = 0;}
+				this.defaultVal.splice(i, 1, index);
+			}
+			this.changeBase(this.defaultVal);
+		},
+		// 初始化组件
+		init:function(){
+			if(this.endYear < this.startYear){this.endYear = this.startYear + 10;}
+			var years     = new Array();
+			for(let i = this.startYear; i <= this.endYear; i++){years.push(i);}
+			var months     = new Array();
+			for(let i = 1; i <= 12; i++){if(i < 10){months.push('0'+i);}else{months.push(i);}}
+			var days     = new Array();
+			for(let i = 1; i <= 31; i++){if(i < 10){days.push('0'+i);}else{days.push(i);}}
+			var hours     =  new Array();
+			for(let i = 0; i < 24; i++){if(i < 10){hours.push('0'+i);}else{hours.push(i);}}
+			var minutes  =  new Array();
+			var seconds  =  new Array();
+			for(let i = 0; i < 60; i++){
+				if(i < 10){minutes.push('0'+i); seconds.push('0'+i);}else{minutes.push(i); seconds.push(i);}
+			}
+			this.sDate = [years, months, days, hours, minutes, seconds];
+			this.$nextTick(()=>{setTimeout(()=>{ this.setValue(this.value);},800);});
+		},
+		change : function (res) {
+			this.changeBase(res.detail.value);
+		},
+		changeBase:function(res){
+			var date = new Date(this.sDate[0][res[0]], this.sDate[1][res[1]], 0);
+			var days = date.getDate();
+			var daysOut = new Array();
+			for(let i = 1; i <= days; i++){if(i < 10){daysOut.push('0'+i);}else{daysOut.push(i);}}
+			this.sDate.splice(2, 1, daysOut);
+			if(res[2] + 1 > days){res[2] = days - 1;}
+			this.defaultVal = res;
+			if(this.isTime){
+				var resdata = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]],
+				this.sDate[3][this.defaultVal[3]],
+				this.sDate[4][this.defaultVal[4]],
+				this.sDate[5][this.defaultVal[5]]);
+			}else{
+				var resdata = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]])
+			}
+			this.$emit('change', resdata);
+		},
+		confirm:function () {
+			if(this.isTime){
+				var res = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]],
+				this.sDate[3][this.defaultVal[3]],
+				this.sDate[4][this.defaultVal[4]],
+				this.sDate[5][this.defaultVal[5]]);
+			}else{
+				var res = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]])
+			}
+			this.$emit('confirm', res);
+		}
+	}
+}
+</script>
+<style scoped>
+.graceDateTime-main{width:750rpx; height:300rpx; color:#323232;}
+.graceDateTime-item{font-size:14px; line-height:38px; text-align:center;}
+/* #ifndef APP-NVUE */
+.graceDateTime-item{display:block;}
+/* #endif */
+</style>

+ 339 - 0
lib/GraceUI5/components/gui-datetime.vue

@@ -0,0 +1,339 @@
+<template>
+	<view>
+		<view @tap.stop="open"><slot></slot></view>
+		<view class="gui-dateBT-shade gui-flex gui-columns gui-justify-content-end"
+		v-if="show" 
+		:style="{zIndex:zIndex, width:width}">
+			<view class="graceDateTime-header gui-flex gui-rows gui-space-between gui-bg-gray">
+				<text class="graceDateTime-header-btn" 
+				:style="{color:cancelTColor}" 
+				@tap="close">{{cancelText}}</text>
+				<text class="graceDateTime-header-btn" 
+				:style="{textAlign:'right', color:confirmColor}" 
+				@tap="confirm">{{confirmText}}</text>
+			</view>
+			<view class="gui-bg-white">
+				<!-- #ifndef MP-ALIPAY -->
+				<picker-view 
+				:indicator-style="indicatorStyle" 
+				class="graceDateTime-main" 
+				:value="defaultVal" 
+				@change="change" 
+				:style="{height:height, width:width}">
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[0]" 
+						:key="index">{{item}}{{units[0]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[1]" 
+						:key="index">{{item}}{{units[1]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[2]" 
+						:key="index">{{item}}{{units[2]}}</text>
+					</picker-view-column>
+					<picker-view-column v-if="isTime">
+						<text class="graceDateTime-item" 
+						v-for="(item, index) in sDate[3]" 
+						:key="index">{{item}}{{units[3]}}</text>
+					</picker-view-column>
+					<picker-view-column v-if="isTime && isMinute">
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[4]" 
+						:key="index">{{item}}{{units[4]}}</text>
+					</picker-view-column>
+					<picker-view-column  v-if="isTime && isMinute && isSecond">
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[5]" 
+						:key="index">{{item}}{{units[5]}}</text>
+					</picker-view-column>
+				</picker-view>
+				<!-- #endif -->
+				<!-- #ifdef MP-ALIPAY -->
+				<!-- 时分秒 -->
+				<picker-view :indicator-style="indicatorStyle" 
+				class="graceDateTime-main" 
+				:value="defaultVal" 
+				@change="change" 
+				:style="{height:height, width:width}" 
+				v-if="isTime && isSecond && isMinute">
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[0]" 
+						:key="index">{{item}}{{units[0]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[1]" 
+						:key="index">{{item}}{{units[1]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[2]" 
+						:key="index">{{item}}{{units[2]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item" 
+						v-for="(item, index) in sDate[3]" 
+						:key="index">{{item}}{{units[3]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[4]" 
+						:key="index">{{item}}{{units[4]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[5]" 
+						:key="index">{{item}}{{units[5]}}</text>
+					</picker-view-column>
+				</picker-view>
+				<!-- 时分 -->
+				<picker-view :indicator-style="indicatorStyle"
+				class="graceDateTime-main" 
+				:value="defaultVal" @change="change" 
+				:style="{height:height, width:width}" 
+				v-else-if="isTime && isMinute && !isSecond">
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[0]" 
+						:key="index">{{item}}{{units[0]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[1]" 
+						:key="index">{{item}}{{units[1]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[2]" 
+						:key="index">{{item}}{{units[2]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item" 
+						v-for="(item, index) in sDate[3]" 
+						:key="index">{{item}}{{units[3]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[4]" 
+						:key="index">{{item}}{{units[4]}}</text>
+					</picker-view-column>
+				</picker-view>
+				<!-- 时 -->
+				<picker-view :indicator-style="indicatorStyle"
+				class="graceDateTime-main" 
+				:value="defaultVal" @change="change" 
+				:style="{height:height, width:width}" 
+				v-else-if="isTime && !isMinute">
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[0]" 
+						:key="index">{{item}}{{units[0]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[1]" 
+						:key="index">{{item}}{{units[1]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[2]" 
+						:key="index">{{item}}{{units[2]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item" 
+						v-for="(item, index) in sDate[3]" 
+						:key="index">{{item}}{{units[3]}}</text>
+					</picker-view-column>
+				</picker-view>
+				<picker-view :indicator-style="indicatorStyle"
+				class="graceDateTime-main" 
+				:value="defaultVal" @change="change" 
+				:style="{height:height, width:width}" 
+				v-else-if="!isTime">
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[0]" 
+						:key="index">{{item}}{{units[0]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[1]" 
+						:key="index">{{item}}{{units[1]}}</text>
+					</picker-view-column>
+					<picker-view-column>
+						<text class="graceDateTime-item gui-block-text" 
+						v-for="(item, index) in sDate[2]" 
+						:key="index">{{item}}{{units[2]}}</text>
+					</picker-view-column>
+				</picker-view>
+				<!-- #endif -->
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-datetime",
+	props : {
+		cancelText    : { type : String,  default : '取消' },
+		cancelTColor  : { type : String,  default : '#888888' },
+		confirmText   : { type : String,  default : '确定' },
+		confirmColor  : { type : String,  default : '#008AFF' },
+		value         : { type : String , default : ''},
+		isTime        : { type : Boolean, default : true},
+		isMinute      : { type : Boolean, default : true},
+		isSecond      : { type : Boolean, default : true},
+		startYear     : { type : Number,  default : 1980},
+		endYear       : { type : Number,  default : 2050},
+		units         : { type : Array ,  default : function(){return new Array('年','月','日','时','分','秒')}},
+		height        : { type : String,  default : '300rpx' },
+		zIndex        : { type : Number,  default : 90},
+		width         : { type : String,  default : '750rpx' }
+	},
+	data() {
+		return {
+			show:false,
+			indicatorStyle : 'height:35px',
+			defaultVal     : [0,0,0,0,0,0],
+			sDate:[[],[],[],[],[],[]],
+			timer:null,
+			show : false
+		}
+	},
+	created() {
+		this.init();
+	},
+	methods: {
+		stopfun:function(e){e.stopPropagation(); return ;},
+		now : function () {
+			var date = new Date();
+			var y = date.getFullYear();
+			var m = date.getMonth() + 1;
+			m = m < 10 ? ('0' + m) : m;
+			var d = date.getDate();
+			d = d < 10 ? ('0' + d) : d;
+			var h = date.getHours();
+			h = h < 10 ? ('0' + h) : h;
+			var minute = date.getMinutes();
+			var second = date.getSeconds();
+			minute = minute < 10 ? ('0' + minute) : minute;
+			second = second < 10 ? ('0' + second) : second;
+			return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;
+		},
+		arrayIndexOf : function(arr, needFind){
+			var index = -1;
+			for(let i = 0; i < arr.length; i++){if(arr[i] == needFind){index = i; return i;}}
+			return index;
+		},
+		setValue : function (val) {
+			if(val == ''){val = this.now();}
+			var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
+			var res = val.match(reg);
+			if(res == null){
+				reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/;
+				res = val.match(reg);
+				if(res == null){
+					this.setValue(this.now());
+					return ;
+				}
+				res[4] = '00';
+				res[5] = '00';
+				res[6] = '00';
+			}
+			this.setDefaults([res[1],res[2],res[3],res[4],res[5],res[6]]);
+		},
+		setDefaults : function (res) {
+			for(let i = 0; i < res.length; i++){
+				var index = this.arrayIndexOf(this.sDate[i], res[i]);
+				if(index == -1){index = 0;}
+				this.defaultVal.splice(i, 1, index);
+			}
+			this.changeBase(this.defaultVal);
+		},
+		// 初始化组件
+		init:function(){
+			if(this.endYear < this.startYear){this.endYear = this.startYear + 10;}
+			var years     = new Array();
+			for(let i = this.startYear; i <= this.endYear; i++){years.push(i);}
+			var months     = new Array();
+			for(let i = 1; i <= 12; i++){if(i < 10){months.push('0'+i);}else{months.push(i);}}
+			var days     = new Array();
+			for(let i = 1; i <= 31; i++){if(i < 10){days.push('0'+i);}else{days.push(i);}}
+			var hours     =  new Array();
+			for(let i = 0; i < 24; i++){if(i < 10){hours.push('0'+i);}else{hours.push(i);}}
+			var minutes  =  new Array();
+			var seconds  =  new Array();
+			for(let i = 0; i < 60; i++){
+				if(i < 10){minutes.push('0'+i); seconds.push('0'+i);}else{minutes.push(i); seconds.push(i);}
+			}
+			this.sDate = [years, months, days, hours, minutes, seconds];
+			this.$nextTick(()=>{setTimeout(()=>{ this.setValue(this.value);}, 500);});
+		},
+		change : function (res) {
+			if(this.timer != null){clearTimeout(this.timer);}
+			this.timer = setTimeout(()=>{this.changeBase(res.detail.value);},500);
+		},
+		changeBase:function(res){
+			var date = new Date(this.sDate[0][res[0]], this.sDate[1][res[1]], 0);
+			var days = date.getDate();
+			var daysOut = new Array();
+			for(let i = 1; i <= days; i++){if(i < 10){daysOut.push('0'+i);}else{daysOut.push(i);}}
+			this.sDate.splice(2, 1, daysOut);
+			if(res[2] + 1 > days){res[2] = days - 1;}
+			this.defaultVal = res;
+			if(this.isTime){
+				var resdata = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]],
+				this.sDate[3][this.defaultVal[3]],
+				this.sDate[4][this.defaultVal[4]],
+				this.sDate[5][this.defaultVal[5]]);
+			}else{
+				var resdata = new Array(
+					this.sDate[0][this.defaultVal[0]],
+					this.sDate[1][this.defaultVal[1]],
+					this.sDate[2][this.defaultVal[2]]
+				)
+			}
+			this.$emit('change', resdata);
+		},
+		confirm:function () {
+			if(this.isTime){
+				var res = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]],
+				this.sDate[3][this.defaultVal[3]],
+				this.sDate[4][this.defaultVal[4]],
+				this.sDate[5][this.defaultVal[5]]);
+			}else{
+				var res = new Array(this.sDate[0][this.defaultVal[0]],
+				this.sDate[1][this.defaultVal[1]],
+				this.sDate[2][this.defaultVal[2]])
+			}
+			this.$emit('confirm', res);
+			this.close();
+		},
+		open : function () {
+			this.show = true;
+		},
+		close : function () {
+			this.show = false;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-dateBT-shade{width:750rpx; position:fixed; background-color:rgba(0,0,0,0.5); z-index:99; left:0; top:0; bottom:0; flex:1; overflow:hidden;}
+.graceDateTime-header{padding:25rpx;}
+.graceDateTime-header-btn{width:200rpx; line-height:38rpx; height:38rpx; font-size:28rpx;}
+.graceDateTime-main{width:750rpx; color:#232323;}
+.graceDateTime-item{height:35px; font-size:14px; line-height:35px; overflow:hidden; text-align:center;}
+/* #ifndef APP-NVUE */
+.graceDateTime-item{display:block; width:100%;}
+/* #endif */
+</style>

+ 26 - 0
lib/GraceUI5/components/gui-demo-banner.vue

@@ -0,0 +1,26 @@
+<template>
+	<view class="gui-banner">
+		<image :src="img" class="gui-banner-img"></image>
+		<view class="gui-banner-in gui-flex gui-columns gui-justify-content-center">
+			<text class="gui-block-text gui-h3 gui-color-white gui-bold gui-text-center">{{title}}</text>
+			<text class="gui-block-text gui-text-small gui-color-white gui-text-center" style="margin-top:8rpx;">{{desc}}</text>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-demo-banner",
+	props : {
+		title:{type:String, default:''},
+		img:{type:String, default:''},
+		desc:{type:String, default:'漂亮 丰富 高效的跨平台 UI 框架'}
+	}
+}
+</script>
+<style scoped>
+.gui-banner{height:228rpx; border-radius:10rpx; font-size:0; position:relative; margin-top:15rpx;}
+.gui-banner-img{width:690rpx; height:228rpx; border-radius:10rpx; opacity:0.92;}
+.gui-banner-in{height:228rpx; border-radius:10rpx; position:absolute; z-index:1; left:0; top:0;}
+.gui-h3{font-size:38rpx;}
+.gui-text-center{width:690rpx;}
+</style>

+ 22 - 0
lib/GraceUI5/components/gui-demo-desc.vue

@@ -0,0 +1,22 @@
+<template>
+	<view style="margin-top:50rpx; ">
+		<view>
+			<text class="gui-h6 demo-desc-title">{{title}}</text>
+		</view>
+		<view class="gui-margin-top gui-bg-gray demo-desc-content gui-border-radius">
+			<text class="gui-text">{{desc}}</text>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	props:{
+		title:{type:String, default:'演示说明'},
+		desc:{type:String, default:''}
+	}
+}
+</script>
+<style>
+.demo-desc-title{color:rgba(69, 90, 100, 0.6); line-height:50rpx;}
+.demo-desc-content{padding:20rpx;}
+</style>

+ 11 - 0
lib/GraceUI5/components/gui-demo-header.vue

@@ -0,0 +1,11 @@
+<template>
+	<view slot="gHeader" class="gui-margin gui-rows gui-align-items-center">
+		<text class="gui-h5 gui-icons gui-primary-color">&#xe642; GraceUI 5</text>
+		<text class="gui-text-small gui-color-gray" 
+		style="margin-left:20rpx; margin-top:6rpx;">更努力为更快更好的跨平台开发</text>
+	</view>
+</template>
+<script>
+</script>
+<style>
+</style>

+ 31 - 0
lib/GraceUI5/components/gui-demo-list.vue

@@ -0,0 +1,31 @@
+<template>
+	<view>
+		<view class="demo-list"
+		v-for="(item, idx) in pageList" :key="idx">
+			<view class="gui-flex gui-rows">
+				<text class="demo-title gui-color-gray gui-h5">{{item.title}}</text>
+				<text class="gui-text-small gui-text-small-ml gui-color-gray">{{item.desc}}</text>
+			</view>
+			<navigator class="demo-list-cell gui-flex gui-rows gui-space-between gui-bg-gray gui-border-radius" 
+			v-for="(nav, index) in item.pages" :key="index" :url="nav[1]">
+				<text class="demo-list-cell-title">{{(index+1)}}. {{nav[0]}}</text>
+				<text class="demo-list-cell-arrow gui-icons gui-color-gray-light">&#xe601;</text>
+			</navigator>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	props:{
+		pageList:{type:Array, default:function(){return [];}}
+	}
+}
+</script>
+<style scoped>
+.demo-list{margin-top:60rpx;}
+.demo-title{line-height:50rpx;}
+.demo-list-cell{padding-left:25rpx; padding-right:20rpx; padding-top:20rpx; padding-bottom:20rpx; margin-top:25rpx;}
+.demo-list-cell-title{line-height:50rpx; font-size:26rpx;}
+.demo-list-cell-arrow{line-height:50rpx; font-size:36rpx;}
+.gui-text-small-ml{margin-left:20rpx; margin-top:8rpx; line-height:38rpx;}
+</style>

+ 236 - 0
lib/GraceUI5/components/gui-editor.vue

@@ -0,0 +1,236 @@
+<template>
+<view class="gui-editor">
+	<view class="gui-border-b">
+		<textarea class="gui-editor-title" maxlength="-1" 
+		v-model="article.title" placeholder="# 请输入标题" auto-height />
+	</view>
+	<!-- 空内容提示 -->
+	<view v-if="article.contents.length < 1">
+		<text class="gui-color-gray gui-editor-empty">请点击下面的按钮,添加内容。</text>
+	</view>
+	<!-- 内容区域 -->
+	<view v-for="(item, index) in article.contents" :key="index" 
+	class="gui-editor-items">
+		<!-- 加粗 -->
+		<view v-if="item.type == 'h3'">
+			<textarea class="gui-editor-strong gui-border-box" 
+			:data-index="index" maxlength="-1" :focus="item.focusin" 
+			@input="graceEditorInput" :value="item.content" @blur="blur" 
+			placeholder="请输入标题" />
+		</view>
+		<!-- 普通文本 -->
+		<view v-else-if="item.type == 'txt'">
+			<textarea class="gui-editor-txt gui-border-box" 
+			maxlength="-1" @blur="blur" 
+			:data-index="index" :focus="item.focusin" 
+			@input="graceEditorInput" :value="item.content" 
+			placeholder="请填写文本内容" />
+		</view>
+		<!-- 居中文本 -->
+		<view v-else-if="item.type == 'center'" 
+		class="gui-flex gui-rows gui-justify-content-center" 
+		style="background-color:#F8F8F8; padding:20rpx;">
+			<input type="text" class="gui-editor-center" 
+			@blur="blur" maxlength="-1" :data-index="index" 
+			:focus="item.focusin" @input="graceEditorInput" 
+			:value="item.content" placeholder="请填写居中文本" />
+		</view>
+		<!-- 图片 -->
+		<view v-else-if="item.type == 'img'" 
+		class="gui-editor-img-wrap">
+			<image :src="item.content" class="gui-editor-img" 
+			:data-index="index" mode="aspectFit"></image>
+			<view v-if="item.error" 
+			class="gui-editor-img-error gui-flex gui-columns gui-justify-content-center">
+				<text class="gui-editor-img-error-text gui-block-text gui-text-center gui-icons">&#xe6a1; 上传失败,请重试</text>
+			</view>
+		</view>
+		<!-- 引用 -->
+		<view v-else-if="item.type == 'quote'">
+			<textarea class="gui-editor-quote gui-border-box" 
+			maxlength="-1" @blur="blur" 
+			:data-index="index" @input="graceEditorInput" :focus="item.focusin" 
+			:value="item.content" placeholder="请输入引用内容" />
+		</view>
+		<!-- 代码 -->
+		<view v-else-if="item.type == 'code'">
+			<textarea class="gui-editor-quote gui-border-box" 
+			maxlength="-1" @blur="blur" 
+			style="height:300rpx;"
+			:data-index="index" @input="graceEditorInput" :focus="item.focusin" 
+			:value="item.content" placeholder="请输入代码" />
+		</view>
+		<!-- 加粗 -->
+		<view v-else-if="item.type == 'strong'">
+			<textarea class="gui-editor-strong gui-border-box" 
+			:data-index="index" maxlength="-1" :focus="item.focusin" 
+			@input="graceEditorInput" :value="item.content" @blur="blur" 
+			placeholder="请输入加粗内容" />
+		</view>
+		<!-- 链接 -->
+		<view v-else-if="item.type == 'link'">
+			<input type="text" class="gui-editor-link gui-border-box" 
+			:focus="item.focusin" 
+			:data-index="index" @input="graceEditorInput" @blur="blur" 
+			:value="item.content" placeholder="请输入连接地址" />
+		</view>
+		<!-- 分割 -->
+		<view v-else-if="item.type == 'spline'">
+			<text class="gui-editor-spline gui-block-text" 
+			:data-index="index">● ● ●</text>
+		</view>
+		<!-- 功能 -->
+		<view class="gui-flex gui-rows gui-justify-content-end gui-editor-item-btns-wrap">
+			<view class="gui-editor-item-btns" hover-class="gui-tap" 
+			:data-index="index" @tap="moveup">
+				<text class="gui-editor-item-btns-text gui-block-text gui-icons">&#xe654; 上移</text>
+			</view>
+			<view class="gui-editor-item-btns" hover-class="gui-tap" 
+			:data-index="index" @tap="movedown">
+				<text class="gui-editor-item-btns-text gui-block-text gui-icons">&#xe603; 下移</text>
+			</view>
+			<view class="gui-editor-item-btns" @tap="deleteItem" 
+			hover-class="gui-tap" :data-index="index">
+				<text class="gui-editor-item-btns-text gui-block-text gui-icons">&#xe636; 删除</text>
+			</view>
+		</view>
+	</view>
+	<view class="gui-margin-top-large" 
+	v-if="article.contents.length >= 1"></view>
+	<!-- 选项类型选择 -->
+	<view class="gui-flex gui-rows gui-align-items-center gui-space-between gui-editor-menus gui-border-box gui-border-t" 
+	:style="{paddingBottom:ipxHeight}">
+		<text class="gui-editor-icons gui-icons" data-type="h3"
+		@tap="graceEditorAddItem" style="font-size:46rpx;">&#xe64d;</text>
+		<text class="gui-editor-icons gui-icons" data-type="txt" 
+		@tap="graceEditorAddItem" style="font-size:32rpx;">&#xe9e4;</text>
+		<text class="gui-editor-icons gui-icons" data-type="center" 
+		@tap="graceEditorAddItem">&#xe621;</text>
+		<text class="gui-editor-icons gui-icons" data-type="img" 
+		@tap="graceEditorAddItem">&#xe63d;</text>
+		<text class="gui-editor-icons gui-icons" data-type="quote" 
+		@tap="graceEditorAddItem">&#xe620;</text>
+		<text class="gui-editor-icons gui-icons" data-type="code"
+		@tap="graceEditorAddItem" style="font-size:40rpx;">&#xe64e;</text>
+		<text class="gui-editor-icons gui-icons" data-type="strong" 
+		style="font-size:32rpx;" 
+		@tap="graceEditorAddItem">&#xe640;</text>
+		<text class="gui-editor-icons gui-icons gui-bold" data-type="link" 
+		@tap="graceEditorAddItem" style="font-size:38rpx;">&#xe61e;</text>
+		<text class="gui-editor-icons gui-icons gui-bold" data-type="spline" 
+		@tap="graceEditorAddItem">&#xe61b;</text>
+	</view>
+</view>
+</template>
+<script>
+export default{
+	name : "gui-editor",
+	data() {
+		return {
+			article   : { title : '', contents:[] },
+			ipxHeight : 0
+		}
+	},
+	created:function(){
+		// #ifdef MP
+		try {
+			var system   = uni.getSystemInfoSync();
+			system.model = system.model.replace(' ', '');
+			system.model = system.model.toLowerCase();
+			var res1  = res.model.indexOf('iphonex');
+			if(res1 > 5){res1 = -1;}
+			var res2   = res.model.indexOf('iphone1');
+			if(res2 > 5){res2 = -1;}
+			if(res1 != -1 || res2 != -1){
+				this.ipxHeight = '60rpx';
+			}
+		} catch (e){return null;}
+		// #endif
+	},
+	methods:{
+		graceEditorAddItem : function(e){
+			var type = e.currentTarget.dataset.type;
+			if(type == 'img'){
+				uni.chooseImage({
+					success:(e)=>{
+						var imgs = e.tempFilePaths;
+						for(let i = 0; i < imgs.length; i++){
+							this.article.contents.push({type:type,content:imgs[i], focusin:false});
+						}
+					}
+				});
+			}else if(type == 'spline'){
+				this.article.contents.push({type:type,content:'',focusin:false});
+			}else{
+				this.article.contents.push({type:type,content:'',focusin:true});
+			}
+		},
+		graceEditorInput : function(e){
+			var index = e.currentTarget.dataset.index;
+			var val   = e.detail.value;
+			this.article.contents[index].content = val;
+		},
+		deleteItem : function(e){
+			var index = e.currentTarget.dataset.index;
+			uni.showModal({
+				title:"提示",
+				content:"确定要删除项目吗?",
+				success:(e)=>{
+					if(e.confirm){this.article.contents.splice(index, 1);}
+				}
+			})
+		},
+		blur    : function (e) {
+			var index = Number(e.currentTarget.dataset.index);
+			this.article.contents[index].focusin = false;
+			this.article.contents.splice(index, 1, this.article.contents[index]);
+		},
+		moveup  : function (e) {
+			var index = Number(e.currentTarget.dataset.index);
+			if(index > 0){
+				this.article.contents[index] = this.article.contents.splice(index - 1, 1, this.article.contents[index])[0];
+			}
+		},
+		movedown : function (e) {
+			var index = Number(e.currentTarget.dataset.index);
+			if(index < this.article.contents.length - 1){
+				this.article.contents[index] = this.article.contents.splice(index + 1, 1, this.article.contents[index])[0];
+			}
+		},
+		getData  : function () {
+			return this.article;
+		},
+		setError : function (index) {
+			this.article.contents[index].error = true;
+			this.article.contents.splice(index, 1, this.article.contents[index]);
+		},
+		setDefault : function (article) {
+			this.article = article;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-editor{padding:10rpx 25rpx; background-color:#FFFFFF; border-radius:6rpx;}
+.gui-editor-title{padding:25rpx 0; width:690rpx; font-size:32rpx; line-height:50rpx; color:#2B2E3D;}
+.gui-editor-empty{line-height:120rpx; font-size:26rpx;}
+.gui-editor-icons{width:80rpx; height:80rpx; color:#898989; line-height:88rpx; text-align:center; font-size:34rpx; margin:5rpx 0;}
+.gui-editor-items{margin-top:20rpx;}
+.gui-editor-item-btns-wrap{padding:20rpx 5rpx;}
+.gui-editor-item-btns{width:100rpx; border-radius:30rpx; margin-left:20rpx; background-color:#898989;}
+.gui-editor-item-btns-text{text-align:center; font-size:20rpx; line-height:38rpx; border-radius:30rpx; color:#FFFFFF;}
+/* #ifndef APP-NVUE */
+.gui-editor-icons{display:block;}
+/* #endif */
+.gui-editor-txt{width:650rpx; font-size:26rpx; line-height:35rpx; padding:20rpx; height:150rpx;}
+.gui-editor-center{width:500rpx; text-align:center; font-size:28rpx; color:#333333; height:60rpx; line-height:60rpx;}
+.gui-editor-img-wrap{width:650rpx; height:320rpx; overflow:hidden; position:relative; font-size:0;}
+.gui-editor-img{width:650rpx; height:320rpx;}
+.gui-editor-quote{width:650rpx; font-size:26rpx; line-height:35rpx; padding:20rpx; background-color:#F9F9F9; height:100rpx;}
+.gui-editor-strong{width:650rpx; font-size:26rpx; line-height:35rpx; padding:20rpx; height:100rpx; font-weight:bold;}
+.gui-editor-link{width:650rpx; font-size:26rpx; line-height:35rpx; padding:20rpx; height:100rpx; color:#008AFF;}
+.gui-editor-spline{width:650rpx; line-height:60rpx; text-align:center; color:#8788A3; font-size:28rpx; opacity:0.6;}
+
+.gui-editor-img-error{position:absolute; width:650rpx; height:320rpx; left:0; top:0; background-color:rgba(0,0,0,0.8);}
+.gui-editor-img-error-text{font-size:28rpx; color:#FFFFFF;}
+</style>

+ 11 - 0
lib/GraceUI5/components/gui-empty.vue

@@ -0,0 +1,11 @@
+<template>
+	<view class="gui-flex gui-columns gui-justify-content-center gui-align-items-center">
+		<slot name="img"></slot>
+		<slot name="text"></slot>
+		<slot name="other"></slot>
+	</view>
+</template>
+<script>
+</script>
+<style scoped>
+</style>

+ 61 - 0
lib/GraceUI5/components/gui-face-group.vue

@@ -0,0 +1,61 @@
+<template>
+	<view class="gui-face-group" 
+	:style="{height:(size + borderWidth * 2 ) +'rpx'}">
+		<view class="gui-face-items" 
+		v-for="(item, index) in items" :key="index" 
+		:style="{'z-index':startIndex + index, 
+			left:isAddBtn ? (space * (index)) + 'rpx' : (space * index) + 'rpx', 
+			borderWidth:borderWidth + 'rpx', borderStyle :'solid ', borderColor:borderColor, 
+			width:size+'rpx', height:size+'rpx'}">
+			<image :src="item" mode="widthFix" class="gui-face-image"
+			:style="{width:size+'rpx', height:size+'rpx'}"></image>
+		</view>
+		<view class="gui-face-items" v-if="isAddBtn"
+		:style="{
+			'z-index':zindex, 
+			width:size+'rpx', 
+			height:size+'rpx', 
+			borderWidth:borderWidth + 'rpx', borderStyle :'solid ', borderColor:borderColor, 
+			left : isAddBtn ? (space * Number(this.items.length)) + 'rpx' : 0,
+			}" @tap.stop="addBtnClick">
+			<slot></slot>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-face-group",
+	props : {
+		items       : { type : Array,   default : function () { return new Array() } },
+		size        : { type : Number,  default : 80 },
+		space       : { type : Number,  default : 50 },
+		borderWidth : { type : Number,  default : 4 },
+		borderColor : { type : String,  default : '#F5F5F5' },
+		isAddBtn    : { type : Boolean, default : false },
+		startIndex  : { type : Number,  default : 100}
+	},
+	data() {
+		return {
+			zindex : 100,
+		}
+	},
+	created:function(){
+		this.zindex     = this.startIndex + this.items.length + 1;
+	},
+	watch:{
+		items : function (v) {
+			this.zindex = this.startIndex + this.items.length + 1;
+		}
+	},
+	methods:{
+		addBtnClick : function (){
+			this.$emit('addBtnClicked');
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-face-group{position:relative;}
+.gui-face-items{position:absolute; overflow:hidden; border-radius:200rpx; font-size:0;}
+.gui-face-image{border-radius:200rpx;}
+</style>

+ 47 - 0
lib/GraceUI5/components/gui-header-leading.vue

@@ -0,0 +1,47 @@
+<template>
+	<view v-if="!onlyBack" 
+	class="gui-header-leader gui-flex gui-rows gui-nowrap gui-align-items-center gui-header-buttons-bg gui-border-box" 
+	:style="bgStyle">
+		<view class="gui-header-leader-btns" hover-class="gui-tap">
+			<text class="gui-header-leader-btns gui-block-text gui-icons gui-header-buttons-color" 
+			@tap="goback" :style="buttonStyle">&#xe643;</text>
+		</view>
+		<view class="gui-header-leader-btns" hover-class="gui-tap">
+			<text class="gui-header-leader-btns gui-block-text gui-icons gui-header-buttons-color" 
+			@tap="gohome" :style="'font-size:35rpx; '+ buttonStyle">&#xe63b;</text>
+		</view>
+	</view>
+	<view v-else class="gui-header-leader">
+		<view class="gui-header-leader-btns" hover-class="gui-tap">
+			<text class="gui-header-leader-btns gui-block-text gui-icons gui-primary-color" 
+			hover-class="gui-tap" @tap="goback" :style="'text-align:left; '+buttonStyle">&#xe643;</text>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-header-leading",
+	props : {
+		homePage    : {type:String , default:"/pages/index/index"},
+		bgStyle     : {type:String , default:""},
+		buttonStyle : {type:String , default:""},
+		onlyBack    : {type:Boolean, default:false}
+	},
+	methods:{
+		goback : function () {
+			uni.navigateBack({delta:1}); 
+			this.$emit('goback');
+		},
+		gohome : function () {
+			if(this.homePage != ''){
+				uni.switchTab({url:this.homePage});
+			}
+			this.$emit('gohome');
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-header-leader{height:60rpx; border-radius:60px; width:138rpx; overflow:hidden;}
+.gui-header-leader-btns{width:68rpx; line-height:60rpx; font-size:32rpx; text-align:center;}
+</style>

+ 169 - 0
lib/GraceUI5/components/gui-im-input.vue

@@ -0,0 +1,169 @@
+<template name="gui-im-input">
+	<view>
+		<view class="gui-im-footer" 
+		:style="{paddingBottom:paddingB}">
+			<view class="gui-im-menus graceIMFonts icon-voice" 
+			hover-class="gui-tap" v-if="voiceBtnShow" 
+			@tap="showRec"></view>
+			<view class="gui-im-menus graceIMFonts icon-photograph" 
+			 hover-class="gui-tap" 
+			@tap="chooseImg"></view>
+			<view class="gui-im-input">
+				<input type="text" v-model="inputMsg" 
+				@confirm="sendTextMsg" :cursor-spacing="35" />
+			</view>
+			<view class="gui-items" 
+			style="padding:0 12rpx; margin-right:10rpx;" 
+			hover-class="gui-tap" @tap="sendTextMsg">发送</view>
+		</view>
+		<!-- 语音输入 -->
+		<view class="gui-im-record" v-if="recShow">
+			<view class="gui-im-record-txt">
+				{{recTxt}}<text v-if="recing">已录音 : {{recLength}} s</text>
+			</view>
+			<view class="gui-im-record-btn" 
+			@tap="rec" :class="[recing ? 'gui-im-recording' : '']"></view>
+			<view class="gui-im-send-voice" 
+			v-if="tmpVoice != ''">
+				<text @tap="sendVoiceMsg">发送语音</text>
+			</view>
+			<view class="gui-im-record-close graceIMFonts icon-close" 
+			@tap="closeRec" v-if="!recing"></view>
+		</view>
+	</view>
+</template>
+<script>
+var bgAudioMannager = uni.getBackgroundAudioManager();
+export default {
+	name  : "gui-im-input",
+	props : { },
+	data() {
+		return {
+			paddingB        : '0',
+			uploading       : false,
+			recShow         : false,
+			recTxt          : "请点击绿色按钮开始录音",
+			inputMsg        : "",
+			recorderManager : null,
+			recing          : false,
+			recLength       : 1,
+			recTimer        : null,
+			tmpVoice        : '',
+			voiceLen        : 0,
+			voiceBtnShow    : false,
+			// 播放相关
+			player          : null,
+			playTxt         : "试听语音"
+		}
+	},
+	created : function(){
+		// #ifndef H5
+		this.voiceBtnShow    = true;
+		this.recorderManager = uni.getRecorderManager();
+		this.recorderManager.onStop((res) => {
+			this.tmpVoice    = res.tempFilePath;
+			this.recing      = false;
+			this.recTxt       =  "... 已录音 "+this.recLength+
+			"s, 点击绿色按钮重新录音 ...";
+			clearInterval(this.recTimer);
+		});
+		this.recorderManager.onError(() => {
+			uni.showToast({ title: '录音失败', icon: 'none' });
+			this.recing = false;
+			this.recTxt   = "请点击绿色按钮开始录音",
+			clearInterval(this.recTimer);
+		});
+		// #endif
+		// #ifdef MP
+		try {
+		    var res = uni.getSystemInfoSync();
+			res.model = res.model.replace(' ', '');
+			res.model = res.model.toLowerCase();
+			var res1  = res.model.indexOf('iphonex');
+			if(res1 > 5){res1 = -1;}
+			var res2   = res.model.indexOf('iphone1');
+			if(res2 > 5){res2 = -1;}
+			if(res1 != -1 || res2 != -1){
+				this.paddingB = uni.upx2px(50)+'px';
+			}
+		} catch (e){return null;}
+		// #endif
+	},
+	methods:{
+		// 录音
+		rec : function(){
+			if (this.recing){
+				this.recorderManager.stop();
+				this.recing = false;
+				this.recTxt   =  "... 已录音 "+this.recLength
+				+"s, 点击绿色按钮重新录音 ...";
+				clearInterval(this.recTimer);
+			} else {
+				this.recorderManager.start({duration:60000, format:'mp3' });
+				this.recing     = true;
+				this.recTxt     =  "... 正在录音 ...";
+				this.recLength  = 1;
+				this.recTimer   = setInterval(()=>{this.recLength++;}, 1000);
+			}
+		},
+		// 发送录音
+		sendVoiceMsg : function(){
+			if (this.tmpVoice == '') {
+				uni.showToast({ title: "请先录制一段语音", icon: "none" });
+				return;
+			}
+			// 关闭界面
+			this.recShow = false;
+			this.$emit('sendVoice', this.tmpVoice, this.recLength);
+			this.tmpVoice  = '';
+			this.recLength = 0;
+			this.recTxt    = "请点击绿色按钮开始录音";
+		},
+		// 展示录音界面
+		showRec : function(){this.recShow  = true;},
+		// 关闭录音界面
+		closeRec: function (){this.recShow = false;},
+		// 发送文本消息
+		sendTextMsg: function () {
+			if (this.inputMsg < 1) {return false;}
+			this.$emit('sendText', this.inputMsg);
+			this.inputMsg = '';
+		},
+		// 选择图片
+		chooseImg : function(){
+			uni.chooseImage({
+				count      : 1,
+				sizeType   : ['compressed'],
+				sourceType : ['album', 'camera'],
+				success    : (res)=>{
+					const tempFilePaths = res.tempFilePaths;
+					this.$emit('chooseImage', tempFilePaths[0]);
+				}
+			});
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-im-footer{background:#FFFFFF; width:100%; position:fixed; left:0; bottom:0; height:100rpx; display:flex; flex-wrap:nowrap; overflow:hidden; box-shadow:1px 1px 6px #999999; align-items:center;}
+.gui-im-footer .gui-items{width:auto; line-height:88rpx; flex-shrink:0; font-size:28rpx; color:#2B2E3D;}
+.gui-im-menus{width:80rpx; height:80rpx; flex-shrink:0; line-height:80rpx; text-align:center;}
+.gui-im-input{width:600rpx; margin:10rpx; padding:10rpx 16rpx; background:#F4F5F6; border-radius:6rpx; height:60rpx;}
+.gui-im-input input{width:100%; background:#F4F5F6; color:#2B2E3D; height:40rpx; line-height:40rpx; font-size:28rpx; margin-top:10rpx;}
+.gui-im-record{width:100%; position:fixed; left:0; bottom:0; background:#FFFFFF; padding:30px 0; padding-bottom:100rpx; z-index:11; box-shadow:1px 1px 6px #999999;}
+.gui-im-record-close{width:100rpx; height:100rpx; position:absolute; top:0px; right:0px; z-index:100; text-align:center; line-height:100rpx; color:#888888; font-size:38rpx !important;}
+.gui-im-record-txt{text-align:center; font-size:26rpx; line-height:30px; padding-bottom:10px; color:#CCCCCC;}
+.gui-im-record-btn{width:60px; height:60px; margin:0 auto; border:5px solid #F1F2F3; border-radius:100%; background:#00B26A;}
+.gui-im-recording{background:#FF0000; animation:fade linear 2s infinite;}
+@keyframes fade{from{opacity:0.1;} 50%{opacity:1;} to{opacity:0.1;}}
+.gui-im-record-txt text{color:#00B26A; padding:0 12px;}
+.gui-im-send-voice{margin-top:12px; font-size:28rpx; color:#00BA62; text-align:center;}
+.gui-im-send-voice text{margin:0 15px; color:#00BA62;}
+
+@font-face{font-family:"graceIMFonts"; src:url('data:font/truetype;charset=utf-8;base64,d09GMgABAAAAAASoAAsAAAAACpAAAARbAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDMgqILIZ4ATYCJAMUCwwABCAFhG0HSxsHCcgOJQUABgUAAMBk8EB6fW8yk/3Z7Cd4BLPXQW6vA9B99wc4f67lvzL5jC8R2YVkAS+XAsN4QPB1pPqF+wfHUj8K/8Hyvu1BXjGyLDq25lGBDagb1ySRuNkEfcvRGr5iXEVcDQGYRBOJS2OXykbwRoFqQYpmTZc48HZYUBEkgaF3BBypENvQMbT12hNgq/b24g35wgANXYLX6jelSITc52EvKqRlDzJKWljFuYDbcSCBTAAFYkGgZxZuhipT05hBv+dOLYCJgYb2POx50vPyFxW2DZaiQzqT/8MDDYlCgHCAGk+KrY0reB4m8aDB8yQeJDwv50HBiwrZtGh0ur0JhAGiEhCdYIisoERHonui2lcmOM2zJHp7m6a+suXpoNZng9tfDG17vkyohugi+3dbns4wdwWyFuTaGyL2DH1o+v/RweMTg2Y6LqngIEk2qXNSr6zPX9naOrilZVBb25D29qFN+/Nh99riT7Z3vdsad6xlyKkr1tWNZ09eGz6kkbRWS7iliav7hBVp1hm64Q4O3rMhcFCzzBa4ywoa3MgWtHtjyNAmVUhYR3kdd6O7DasHDfpeN2jwb7vbQFjoV6Fa7o6VK9v0qChdVrZdRURhRbwW3rqlUHWLS5mMreMeM3nRSDO2TbYUy16uGosg002pTpZwphre5b7iZKa3S1VPqnNboCS+PE4Hmd9c9SJ2Lk+1zG3JjnAsPmH0XBpvDWJl+WX186e6zIWKSG6z0np0qthYRZSdTEQULL34fb9uJZ66RKiru0eP4K4lSXcWecR/xPf20/WbFi0Bz/8qJrcUz0VLHq9jd7SqyEjVyoWKSFZYZV4TL99QQihCuiGEghgP3sLyqYFyCAlv/7hDnEsCyWXFCOnjZkAVINnlhrLtTEJFJEusvRjRsGVZpxpGRH+psDBFlC1MRCRsj0k9bjZvPtcjYrOpiXamCVUROssu7hLWO2VNhdl5+yxFRU/Z8/pcBwNGkpu2yNAKAPaY/CNXAvak/CmXAfaM/CYXH8o/w6M7d+aODar8ZrgUAB2fJ5zRauxBhbTgeNSSWHrgShOOqa8crbp6d0qSt09n10Gh0T6LTOBwDfjzrxh7EEUmBAZBFmh4EAUSg0SkwmaCjotCcGBQAyYZlBzvIgCKG0I5gXTGAAS+nIKGN9dB4ssnUmH/QCeY/+DAV0gwGSICzugiWUw3GxZgjmER8V1IESyTCDvz1YvrsdSmc9Qu18jNmDqVIIrLznUnS7CJaRH7ONuleMYIItQyUDFcD+u6hWxqqVhg0TJjdnpMzpSgJ4oWLAN8aYCC4WBgRBA8XSAUBCxMiLIww9fz+vVgJNrQ4aARXT/8zWAoTpTVI+KIJjYBskRjJuralEon7UjEw2iEgCC3QgsDRDF1YXQes0DYwZupYAQY0cgZIjbpxNDJSFJNdPU6Yx5LT5ueeAZdaEIKJXThwGPGdM60RcRz0WJbUY1TF8sb8IrH8sVdigkAAA==') format('truetype');}
+.graceIMFonts{font-family:"graceIMFonts" !important; font-style:normal; color:#2B2E3D; font-size:56rpx;}
+.icon-voice:before{content:"\e63a";}
+.icon-photograph:before{content:"\e619";}
+.icon-close:before{content:"\e625";}
+.icon-kbd{content:"\e73b";}
+</style>

+ 159 - 0
lib/GraceUI5/components/gui-im-message.vue

@@ -0,0 +1,159 @@
+<template name="gui-im-messages">
+	<view class="gui-im" 
+	:style="{'background-color':background}">
+		<block v-for="(item, index) in msgs" :key="index">
+			<block v-if="item.group == group">
+				<!-- 系统消息 -->
+				<view class="gui-im-msg gui-flex gui-rows gui-justify-content-center" 
+				v-if="item.contentType == 'system'">
+					<view class="gui-im-system-msg gui-bg-black">{{item.msg}}</view>
+				</view>
+				<!-- 用户消息 -->
+				<view v-else>
+					<view class="gui-im-msg" 
+					:class="[userid == item.uindex ? 'gui-im-msg-right' : 'gui-im-msg-left']">
+						<view class="gui-im-face">
+							<image class="gui-im-face-image" :src="item.uface" mode="widthFix"></image>
+						</view>
+						<view class="gui-im-content-spacing"></view>
+						<view class="gui-im-content-in">
+							<view class="gui-im-name" v-if="userid != item.uindex">
+								<text :style="unameStyle">{{item.uname}}</text>
+							</view>
+							<!-- 文本消息 -->
+							<view v-if="item.contentType == 'txt'" 
+							:class="[userid == item.uindex ? 'gui-im-flex-end' : '']">
+								<view class="gui-im-content-txt" 
+								:class="[userid == item.uindex ? 'gui-bg-green' : '']">
+									<text :style="txtContentStyle" 
+									:class="[userid == item.uindex ? 'gui-color-white' : '']">{{item.content}}</text>
+								</view>
+							</view>
+							<!-- 图片消息 -->
+							<view v-if="item.contentType == 'img'" 
+							:class="[userid == item.uindex ? 'gui-im-flex-end' : '']">
+								<view class="gui-img-in gui-im-img">
									<image class="gui-im-img" 
									:src="item.content" :data-img="item.content" 
									@tap="showImgs" mode="widthFix"></image>
								</view>
+							</view>
+							<!-- 语言消息 -->
+							<view v-if="item.contentType == 'voice'" 
+							:class="[userid == item.uindex ? 'gui-im-flex-end' : '']">
+								<view 
+								class="gui-flex gui-rows gui-nowrap gui-align-items-center" 
+								:class="[
+								'gui-im-voice-msg', 
+								index == playIndex ? 'gui-bg-green' : '', 
+								userid != item.uindex ? 'gui-im-flex-end' : '' 
+								]" 
+									:data-voice="item.content" 
+									:data-index='index' @tap='playVoice' 
+									:style="{'width':(item.length*3)+'px'}">
+									<text class="gui-icons" 
+									:class="[index == playIndex ? 'gui-color-white' : '']">&#xe800;</text>
+									<text class="gui-im-voice-msg-text" 
+									:class="[index == playIndex ? 'gui-color-white' : '']">{{item.length}} ”</text> 
+								</view>
+							</view>
+							<view :class="[userid == item.uindex ? 'gui-text-right' : '']">
+								<text class="gui-im-timer gui-block-text">{{item.date}}</text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</block>
+		</block>
+		<view style="height:100px;"></view>
+	</view>
+</template>
+<script>
+export default {
+	name   : "gui-im-messages",
+	props  : {
+		msgs             : { type : Array,  default : function(){ return []; }},
+		userid           : { type : String, default:''},
+		group            : { type : String, default : "" },
+		background       : { type : String, default : "#F7FBFE" },
+		unameStyle       : { type : String, default : 'line-height:28rpx; height:28rpx; font-size:26rpx; color:#666666;'},
+		txtContentStyle  : { type : String, default : 'line-height:38rpx; font-size:30rpx; color:#2B2E3D;'}
+	},
+	data() {
+		return {
+			player    : null,
+			playIndex : -1
+		}
+	},
+	created: function(){
+		this.player = uni.createInnerAudioContext();
+		this.player.onPlay(() => {console.log('play');});
+		this.player.onEnded(() => {
+			var cIndex     = Number(this.playIndex);
+			this.playIndex = -1;
+			for(let i = cIndex + 1; i < this.msgs.length; i++) {
+				if (this.msgs[i].contentType == 'voice') {
+					this.playNow(this.msgs[i].content, i);
+					break;
+					return;
+				}
+			}
+		});
+		this.player.onError((E)=>{console.log(E);});
+  },
+  methods: {
+		// 播放语音
+		playVoice: function (e) {
+			var voicelUrl = e.currentTarget.dataset.voice;
+			var index     = e.currentTarget.dataset.index;
+			if (this.playIndex == -1){
+				return this.playNow(voicelUrl, index);
+			}
+			if (this.playIndex == index) {
+				this.player.stop();
+				this.playIndex = -1;
+			} else {
+				this.player.stop();
+				this.playIndex = -1;
+				this.playNow(voicelUrl, index);
+			}
+		},
+		// 语音播放基础函数
+		playNow: function (voicelUrl, index){
+			this.playIndex  = index;
+			this.player.src = voicelUrl;
+			this.player.play();
+			return true;
+		},
+		// 图片预览
+		showImgs : function(e){
+			var imgs        = [];
+			var imgsCurrent = e.currentTarget.dataset.img;
+			for (var i = 0; i < this.msgs.length; i++) {
+				if (this.msgs[i].contentType == 'img') {
+					imgs.push(this.msgs[i].content);
+				}
+			}
+			uni.previewImage({urls : imgs, current : imgsCurrent});
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-im{padding:30rpx;}
+.gui-im-system-msg{color:#FFFFFF; font-size:26rpx; line-height:38rpx; padding:5px 10px; display:block; border-radius:6rpx;}
+.gui-im-msg{margin-bottom:28px; display:flex; flex-direction:row; flex-wrap:nowrap;}
+.gui-im-face{width:88rpx; height:88rpx; overflow:hidden; flex-shrink:0; border-radius:6rpx; overflow:hidden; font-size:0;}
+.gui-im-face-image{width:88rpx;}
+.gui-im-name{padding-bottom:10rpx; margin-top:-5rpx; }
+.gui-im-content-spacing{width:25rpx; height:50rpx; flex-shrink:0;}
+.gui-im-content-in{width:600rpx; overflow:hidden;}
+.gui-im-content-txt{background-color:#E7F0F3; padding:15rpx 20rpx; border-radius:6rpx; min-width:100rpx; word-break:break-all;}
+.gui-im-msg-right{flex-direction:row-reverse;}
+.gui-im-timer{margin-top:5px; line-height:30rpx; font-size:22rpx; color:#8788A3;}
+.gui-im-img{width:358rpx; border-radius:6rpx;}
+.gui-im-flex-end{display:flex; flex-direction:row; flex-wrap:nowrap; justify-content:flex-end;}
+.gui-im-voice-msg{height:80rpx; padding:0 20rpx; background-color:#E7F0F3; border-radius:6rpx; color:#2B2E3D; min-width:100rpx; max-width:400rpx;}
+.gui-im-voice-msg-text{font-size:22rpx; margin:0 5rpx;}
+@font-face {
+font-family: "guiimfont"; 
+src:url('data:font/ttf;charset=utf-8;base64,d09GRgABAAAAAARIAAsAAAAABpAOfljMqxyszBwQAGoSFheJxjYGRgYADih0telMfz23xl4GZhAIEblhYmCPr/ZxYGZl4gl4OBCSQKAC7VCZ8AeJxjYGRgYG7438AQw8IAAkCSkQEVMAEARGInC9nJQTHaVXQA5E8EE500AB910O4UPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nGNgYoAALgbsgImRiZGZgTWxNCUzn4EBAAzjAi0AAA==');
+}
+.graceIMFont{font-family:"graceIMFont"; font-size:30rpx; color:#2B2E3D;}
+</style>

+ 56 - 0
lib/GraceUI5/components/gui-image.vue

@@ -0,0 +1,56 @@
+<template>
+	<view class="gui-img" 
+	:style="{width:width+'rpx', height:height == 0 ? imgHeight+'rpx' : height+'rpx'}">
+		<image :src="src" @load="imgLoad" @error="error" 
+		:style="{width:width+'rpx', height:imgHeight+'rpx', borderRadius:borderRadius, opacity:opacity}"></image>
+		<text class="gui-img-loading gui-icons" :class="[animate?'gui-fade-out':'']" v-if="isLoading" 
+		:style="{
+			width:width+'rpx', 
+			height:height == 0 ? imgHeight+'rpx' : height+'rpx', 
+			lineHeight:height == 0 ? imgHeight+'rpx' : height+'rpx', 
+			borderRadius:borderRadius}">&#xe63a;</text>
+		<text class="gui-img-loading gui-icons" :class="[animate?'gui-fade-out':'']" v-if="failed"
+		:style="{
+			width:width+'rpx', 
+			height:height == 0 ? imgHeight+'rpx' : height+'rpx', 
+			lineHeight:height == 0 ? imgHeight+'rpx' : height+'rpx', 
+			borderRadius:borderRadius}">&#xe65b;</text>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-image",
+	props : {
+		src   : {type:String, default:''},
+		width : {type:Number, default:300},
+		height: {type:Number, default:0},
+		timer : {type:Number,default:200},
+		borderRadius:{type:String, default:'0rpx'}
+	},
+	data() {
+		return {
+			isLoading : true,
+			imgHeight : 180,
+			opacity   : 0,
+			animate   : false,
+			failed    : false
+		}
+	},
+	methods:{
+		imgLoad : function (e) {
+			var scale      = e.detail.width / e.detail.height;
+			this.imgHeight = this.width / scale;
+			this.animate = true;
+			setTimeout(() => {this.isLoading = false; this.opacity = 1;}, this.timer);
+		},
+		error : function(){
+			this.isLoading = false;
+			this.failed    = true;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-img{width:500rpx; height:500rpx; overflow:hidden; font-size:0; position:relative;}
+.gui-img-loading{position:absolute; left:0; top:0; background-color:#F8F8F8; font-size:58rpx; color:#D9D9D9; text-align:center;}
+</style>

+ 135 - 0
lib/GraceUI5/components/gui-interval-slider.vue

@@ -0,0 +1,135 @@
+<template>
+	<view class="grace-slider" 
+	:style="{height:blockSize+'px', width:realWidth+'px'}">
+		<view class="grace-slider-bar" 
+		:style="{backgroundColor:bgColor, width:realWidth+'px', height:height+'px', top:lineTop+'px'}"></view>
+		<view class="grace-slider-active-bar" 
+		:style="{backgroundColor:activeColor, width:activeWidth+'px', height:height+'px', marginLeft:activeLeft+'px', top:lineTop+'px'}"></view>
+		<view class="grace-slider-block" 
+		:style="{backgroundColor:blockBgColor, height:blockSize+'px', width:blockSize+'px', 'margin-left':xMin+'px'}" 
+		@touchstart.stop="touchstart" @touchmove.stop.prevent="touchmove" data-tag="min"></view>
+		<view class="grace-slider-block" 
+		:style="{backgroundColor:blockBgColor, height:blockSize+'px', width:blockSize+'px', 'margin-left':xMax+'px'}" 
+		@touchstart.stop="touchstart" @touchmove.stop.prevent="touchmove" data-tag="max"></view>
+	</view>
+</template>
+<script>
+const _windowWidth = uni.getSystemInfoSync().windowWidth;
+export default {
+	name : "gui-interval-slider",
+	data() {
+		return {
+			realWidth    : 200,
+			realMax      : 200,
+			xMin         : 0,
+			left1        : 0,
+			xMax         : 100,
+			currentBlock : '',
+			minValue     : 0,
+			maxValue     : 100,
+			activeWidth  : 0,
+			activeLeft   : 0,
+			lineTop      : 0
+		};
+	},
+	props: {
+		bgColor      : {type : String, default : "#F6F7F8"},
+		activeColor  : {type : String, default : "#3688FF"},
+		width        : {type : Number, default : 750},
+		height       : {type : Number, default : 2},
+		blockBgColor : {type : String, default : "#FFFFFF"},
+		blockSize    : {type : Number, default : 30},
+		min          : {type : Number, default : 0},
+		minDefault   : {type : Number, default : 0},
+		max          : {type : Number, default : 100},
+		maxDefault   : {type : Number, default : 100}
+	},
+	created:function(){
+		this.realWidth = this.upx2px(this.width);
+		this.left1     = (_windowWidth - this.realWidth) / 2;
+		this.realMax   = this.realWidth - this.blockSize;
+		this.lineTop   = (this.blockSize - this.height) / 2;
+		this.setSlider();
+	},
+	watch:{
+		minDefault : function(){
+			this.setSlider();
+		},
+		maxDefault : function(){
+			this.setSlider();
+		}
+	},
+	methods: {
+		setSlider : function(){
+			this.xMin = (this.minDefault - this.min) / (this.max - this.min) * this.realMax;
+			this.xMax = (this.maxDefault - this.min) / (this.max - this.min) * this.realMax;
+			this.minValue = this.minDefault;
+			this.maxValue = this.maxDefault;
+			this.activeLeft = this.xMin + 5;
+			this.activeWidth = this.xMax - this.xMin;
+		},
+		touchstart: function(e) {
+			this.currentBlock = e.target.dataset.tag;
+			if(this.currentBlock == 'min'){
+				var pageX = e.pageX || e.changedTouches[0].pageX;
+				pageX = pageX - this.left1;
+				this.xMin = pageX;
+			}else{
+				var pageX = e.pageX || e.changedTouches[0].pageX;
+				pageX = pageX - this.left1;
+				this.xMax = pageX;
+			}
+		},
+		touchmove: function(e) {
+			this.calculate(e);
+		},
+		px2upx: function(px) {
+			return (750 / _windowWidth ) * px;
+		},
+		upx2px : function(upx){
+			return (_windowWidth / 750) * upx;
+		},
+		calculate: function(e) {
+			var pageX = e.pageX || e.changedTouches[0].pageX;
+			pageX = pageX - this.left1;
+			if(this.currentBlock == 'min'){
+				var xMin = this.xMin + (pageX - this.xMin);
+				// 最左侧限制
+				if(xMin < 0){xMin = 0;}
+				// 最右侧限制
+				if(xMin >= this.realMax){xMin = this.realMax;}
+				this.xMin = xMin;
+				// 计算值
+				var value = this.xMin / this.realMax * (this.max - this.min);
+				value = parseInt(value);
+				value = value + this.min;
+				this.minValue = value;
+			}else{
+				var xMax = this.xMax + (pageX - this.xMax);
+				// 最左侧限制
+				if(xMax < 0){xMax = 0;}
+				// 最右侧限制
+				if(xMax >= this.realMax){xMax = this.realMax;}
+				this.xMax = xMax;
+				// 计算值
+				var value = this.xMax / this.realMax * (this.max - this.min);
+				value = parseInt(value);
+				value = value + this.min;
+				this.maxValue = value;
+			}
+			// 获得2个值并传递出去
+			if(this.maxValue >= this.minValue){
+				this.$emit('change', [this.minValue, this.maxValue]);
+			}else{
+				this.$emit('change', [this.maxValue, this.minValue]);
+			}
+		}
+	}
+};
+</script>
+<style scoped>
+.grace-slider{position:relative;}
+.grace-slider-bar{position:absolute; top:0rpx;}
+.grace-slider-block{position:absolute; top:0rpx; left:0; border-radius:500px; border-width:1px; border-style:solid; border-color:#F5F6F8;}
+.grace-slider-active-bar{position:absolute; top:25rpx;}
+</style>

+ 42 - 0
lib/GraceUI5/components/gui-iphone-bottom.vue

@@ -0,0 +1,42 @@
+<template>
+	<view :style="{height:height}" v-if="need"></view>
+</template>
+<script>
+export default{
+	name  : "gui-iphone-bottom",
+	props : {
+		height       : {type:String,  default:'50rpx'},
+		isSwitchPage : {type:Boolean, default:false}
+	},
+	data() {
+		return {
+			need:false 
+		}
+	},
+	created:function(){
+		// #ifdef MP
+		this.setBottom();
+		// #endif
+		// #ifdef H5
+		this.setBottom();
+		// #endif
+	},
+	methods:{
+		setBottom : function () {
+			if(this.isSwitchPage){return ;}
+			var system   = uni.getSystemInfoSync();
+			system.model = system.model.replace(' ', '');
+			system.model = system.model.toLowerCase();
+			var res1     = system.model.indexOf('iphonex');
+			if(res1 > 5){res1 = -1;}
+			var res2     = system.model.indexOf('iphone1');
+			if(res2 > 5){res2 = -1;}
+			if(res1 != -1 || res2 != -1){
+				this.need = true;
+			}
+		}
+	}
+}
+</script>
+<style scoped>
+</style>

+ 51 - 0
lib/GraceUI5/components/gui-link.vue

@@ -0,0 +1,51 @@
+<template>
+	<!-- #ifdef APP-PLUS -->
+	<text class="link" :data-url="url" @tap="openUrlForApp" 
+	:style="{color:color, lineHeight:lineHeight, fontSize:fontSize}">{{title}}</text>
+	<!-- #endif -->
+	<!-- #ifdef H5 -->
+	<a :href="url" class="link" target="_blank" 
+	:style="{color:color, lineHeight:lineHeight, fontSize:fontSize}">{{title}}</a>
+	<!-- #endif -->
+	<!-- #ifdef MP -->
+	<text class="link" :style="{color:color, lineHeight:lineHeight, fontSize:fontSize}">{{url}}</text>
+	<!-- #endif -->
+</template>
+<script>
+export default {
+	name  : "gui-link",
+	props : {
+		url:{
+			type : String,
+			default : ""
+		},
+		title : {
+			type : String,
+			default : ""
+		},
+		color:{
+			type : String,
+			default : "#008AFF"
+		},
+		fontSize : {
+			type : String,
+			default : "28rpx"
+		},
+		lineHeight : {
+			type : String,
+			default : "50rpx"
+		}
+	},
+	methods:{
+		openUrlForApp : function(e){
+			var link = e.currentTarget.dataset.url;
+			plus.runtime.openURL(link);
+		}
+	}
+}
+</script>
+<style scoped>
+/* #ifdef H5 */
+.link{text-decoration:none;}
+/* #endif */
+</style>

+ 86 - 0
lib/GraceUI5/components/gui-loadmore.vue

@@ -0,0 +1,86 @@
+<template>
+	<view class="gui-load-more gui-flex gui-rows gui-align-items-center gui-justify-content-center" 
+	v-if="!hidden" @tap.stop.prevent="tapme">
+		<view class="gui-load-more-icon" ref="loadingiconforloadmore" 
+		v-if="loadMoreStatus == 1">
+			<text class="gui-icons gui-rotate360 gui-block-text"
+			:style="{
+				fontSize:loadMoreFontSize,
+				color:loadMoreColor[loadMoreStatus]}">&#xe9db;</text>
+		</view>
+		<text class="gui-block-text" 
+		:style="{
+			fontSize:loadMoreFontSize, 
+			color:loadMoreColor[loadMoreStatus]
+		}">{{loadMoreText[loadMoreStatus]}}</text>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+var animation = weex.requireModule('animation');
+// #endif
+export default{
+	name  : "gui-loadmore",
+	props : {
+		loadMoreText     : {type:Array, default:function () {
+			return ['','更多数据加载中', '已加载全部数据', '暂无数据'];
+		}},
+		loadMoreColor    : {type:Array, default:function () {
+			return ['rgba(69, 90, 100, 0.6)', 'rgba(69, 90, 100, 0.6)', 'rgba(69, 90, 100, 0.8)', 'rgba(69, 90, 100, 0.6)'];
+		}},
+		loadMoreFontSize : {type:String, default:'26rpx'},
+		status           : {type:Number, default:0},
+	},
+	data() {
+		return {
+			loadMoreStatus : 0,
+			hidden         : false
+		}
+	},
+	created:function(){
+		this.loadMoreStatus = this.status;
+	},
+	methods:{
+		loading    : function(){
+			this.loadMoreStatus = 1;
+			// #ifdef APP-NVUE
+			setTimeout(()=>{
+				this.rotate360();
+			}, 200);
+			// #endif
+		},
+		stoploadmore : function(){
+			this.loadMoreStatus = 0;
+		},
+		nomore : function(){
+			this.loadMoreStatus = 2;
+		},
+		empty  : function(){
+			this.loadMoreStatus = 3;
+		},
+		hide   : function(){
+			this.hidden = true;
+		},
+		rotate360 : function(){
+			var el = this.$refs.loadingiconforloadmore;
+			animation.transition(el, {
+				styles     : {transform: 'rotate(7200deg)'},
+				duration   : 20000,
+				timingFunction: 'linear',
+				needLayout :false,
+				delay: 0
+			});
+		},
+		tapme : function(){
+			if(this.loadMoreStatus == 0){
+				this.$emit('tapme');
+			}
+		}
+	}
+}
+</script>
+<style>
+.gui-load-more{overflow:hidden; padding:25rpx;}
+.gui-load-more-text{line-height:35rpx;} 
+.gui-load-more-icon{padding:0 12rpx; line-height:35rpx;}
+</style>

+ 58 - 0
lib/GraceUI5/components/gui-modal.vue

@@ -0,0 +1,58 @@
+<template>
+	<gui-popup ref="guipopupformodal" 
+	:width="width" 
+	:canCloseByShade="canCloseByShade" 
+	@close="eClose">
+		<view 
+		:style="bodyStyle" 
+		@tap.stop.prevent="stopfun" 
+		class="gui-relative">
+			<view>
+				<text class="gui-block-text gui-text-center" v-if="isTitle"
+				:style="titleStyle">{{title}}</text>
+			</view>
+			<view><slot name="content"></slot></view>
+			<view><slot name="btns"></slot></view>
+			<text 
+			class="gui-popup-close gui-block-text gui-absolute-rt gui-icons"
+			:style="closeBtnStyle" 
+			@tap.stop.prevent="close" 
+			v-if="isCloseBtn">&#xe7a5;</text>
+		</view>
+	</gui-popup>
+</template>
+<script>
+export default{
+	name  : "gui-modal",
+	props : {
+		width           : { type  : String,  default : '580rpx'},
+		bodyStyle       : { type  : String,  default : 'background-color:#FFFFFF; border-radius:6rpx;' },
+		isCloseBtn      : { type  : Boolean, default : true },
+		closeBtnStyle   : { type  : String,  default : 'color:#2B2E3D; font-size:28rpx;' },
+		isTitle         : { type  : Boolean, default : true },
+		title           : { type  : String,  default : 'title' },
+		titleStyle      : { type  : String,  default : 'line-height:100rpx; font-size:28rpx; font-weight:700; color:#2B2E3D;' },
+		canCloseByShade : { type  : Boolean, default : true }
+	},
+	methods:{
+		open  : function(){
+			this.$refs.guipopupformodal.open();
+			this.$emit('open');
+		},
+		close : function(){
+			this.$refs.guipopupformodal.close();
+			this.$emit('close');
+		},
+		stopfun : function(e){
+			e.stopPropagation();
+			return null;
+		},
+		eClose : function(){
+			this.$emit('close');
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-popup-close{width:80rpx; height:80rpx; line-height:80rpx; text-align:center;}
+</style>

+ 26 - 0
lib/GraceUI5/components/gui-mp-menu-spacing.vue

@@ -0,0 +1,26 @@
+<template>
+	<view class="gui-wx-menu-spacing" :style="{width:width+'px'}"></view>
+</template>
+<script>
+export default{
+	name  : "gui-mp-menu-spacing",
+	props : {},
+	data() {
+		return {
+			width: 0
+		}
+	},
+	created:function(){
+		// #ifdef MP
+			// #ifndef MP-ALIPAY
+			let system         = uni.getSystemInfoSync();
+			let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
+			this.width         = menuButtonInfo.width + (system.screenWidth - menuButtonInfo.right);
+			// #endif
+		// #endif
+	}
+}
+</script>
+<style scoped>
+.gui-wx-menu-spacing{width:80px; height:20px;}
+</style>

+ 53 - 0
lib/GraceUI5/components/gui-number-animate.vue

@@ -0,0 +1,53 @@
+<template>
+	<text :style="{
+		fontSize:fontSize, 
+		fontWeight:fontWeight, 
+		color:color, 
+		lineHeight:lineHeight
+	}">{{numAnimate}}</text>
+</template>
+<script>
+export default{
+	name  : "gui-number-animate",
+	props : {
+		num        : { type : Number,  default : 0 },
+		stepNumber : { type : Number,  default : 50 },
+		timer      : { type : Number,  default : 1000 },
+		keepInt    : { type : Boolean, default : false },
+		fontSize   : { type : String,  default : '28rpx' },
+		color      : { type : String,  default : '#333333' },
+		lineHeight : { type : String,  default : '50rpx' },
+		fontWeight : { type : String,  default : '400' }
+	},
+	data() {
+		return {
+			numAnimate : 0,
+			intervalId : null
+		}
+	},
+	created:function(){
+		let timer = this.timer / this.stepNumber;
+		let step  = Math.floor((this.num / this.stepNumber) * 100) / 100;
+		this.intervalId = setInterval(() => {
+			// 正值 
+			if(this.num >= 0){
+				if(this.numAnimate >= this.num){
+					this.numAnimate = this.num;
+					clearInterval(this.intervalId);
+					return;
+				}
+			}else{
+				if(this.numAnimate <= this.num){
+					this.numAnimate = this.num;
+					clearInterval(this.intervalId);
+					return;
+				}
+			}
+			let  res = this.numAnimate + step;
+			this.numAnimate = this.keepInt ? parseInt(res) : Math.floor(res * 100) / 100;
+		}, timer);
+	}
+}
+</script>
+<style scoped>
+</style>

+ 120 - 0
lib/GraceUI5/components/gui-number-keyboard.vue

@@ -0,0 +1,120 @@
+<template>
+	<gui-popup ref="guipopupfornk"
+	position="bottom" :canCloseByShade="canCloseByShade">
+		<view style="background-color:#F6F7F8;" 
+		@tap.stop.prevent="stopfun">
+			<text class="gui-keyboard-res gui-block-text" v-if="showInputRes" 
+			:style="{color:resultColor, fontSize:resultSize}">{{resVal}}</text>
+			<view class="gui-keyboard gui-flex gui-rows gui-space-between">
+				<view class="gui-keyboard-left gui-flex gui-rows gui-wrap gui-space-between">
+					<text v-for="(item, index) in [1,2,3,4,5,6,7,8,9]" :key="index" 
+					class="gui-keyboard-keys gui-block-text" 
+					:data-keynumber="item" 
+					:style="{
+						backgroundColor:tapIndex == item ? tapBgColor : '#FFFFFF', 
+						color : tapIndex == item ? '#FFFFFF' : '#2B2E3D'
+					}" 
+					@tap.stop="inputNow">{{item}}</text>
+					<text class="gui-keyboard-keys gui-block-text" 
+					:style="{
+						width: isPoint ? '259rpx':'538rpx',
+						backgroundColor:tapIndex == 0 ? tapBgColor : '#FFFFFF',
+						color : tapIndex == 0 ? '#FFFFFF' : '#2B2E3D'
+					}" 
+					data-keynumber="0" @tap.stop="inputNow">0</text>
+					<text v-if="isPoint" class="gui-keyboard-keys" 
+					:style="{
+						width:'259rpx',
+						backgroundColor:tapIndex == '.' ? tapBgColor : '#FFFFFF',
+						color : tapIndex == '.' ? '#FFFFFF' : '#2B2E3D'
+					}" 
+					data-keynumber="." @tap.stop="inputNow">.</text>
+				</view>
+				<view class="gui-keyboard-right gui-flex gui-columns gui-align-items-center">
+					<text class="gui-keyboard-keys gui-icons gui-block-text" 
+					:style="{
+						backgroundColor : tapIndex == -3 ? tapBgColor : '#FFFFFF',
+						color : tapIndex == -3 ? '#FFFFFF' : '#2B2E3D'
+					}" 
+					:data-keynumber="-3" @tap.stop="deleteNow">&#xe623;</text>
+					<text class="gui-keyboard-keys gui-keyboard-done gui-block-text" 
+					:style="{backgroundColor:tapBgColor}" @tap.stop="done">{{doneBtnName}}</text>
+				</view>
+			</view>
+		</view>
+	</gui-popup>
+</template>
+<script>
+export default{
+	name  : "gui-number-keyboard",
+	props : {
+		canCloseByShade : { type : Boolean, default : false},
+		doneBtnName     : { type : String,  default : "完成" },
+		isPoint         : { type : Boolean, default : true },
+		value           : { type : String,  default : ''},
+		showInputRes    : { type : Boolean, default : true},
+		resultColor     : { type : String,  default : '#2B2E3D'},
+		resultSize      : { type : String,  default : '32rpx'},
+		tapBgColor      : { type : String,  default : '#008AFF'},
+	},
+	methods:{
+		open  : function(){
+			this.$refs.guipopupfornk.open();
+		},
+		close : function(){
+			this.$refs.guipopupfornk.close();
+		},
+		stopfun : function(e){
+			e.stopPropagation();
+			return ;
+		},
+		inputNow : function (e){
+			var k = e.currentTarget.dataset.keynumber;
+			this.resVal += k+'';
+			this.tapIndex = k;
+			this.$emit('keyboardInput', k);
+			this.removeClass();
+		},
+		deleteNow : function (e){
+			var k = e.currentTarget.dataset.keynumber;
+			this.tapIndex = k;
+			this.resVal = this.resVal.substring(0, this.resVal.length - 1);
+			this.$emit('keyboardDelete');
+			this.removeClass();
+		},
+		done : function(){
+			this.$emit('keyboardDone');
+		},
+		setVal : function (val) {
+			this.resVal = val;
+		},
+		removeClass : function () {
+			setTimeout(()=>{this.tapIndex = -1;}, 100);
+		},
+	},
+	data() {
+		return {
+			resVal   : '',
+			tapIndex : -1
+		}
+	},
+	created:function(){
+		this.resVal = this.value+'';
+	},
+	watch:{
+		value : function (val) {
+			this.resVal = val+'';
+		}
+	}
+}
+</script>
+<style>
+.gui-keyboard{background-color:#F6F7F8; width:750rpx; padding:20rpx 0;}
+.gui-keyboard-body{flex-direction:row; justify-content:space-between; padding:10px 0;}
+.gui-keyboard-left{width:560rpx;}
+.gui-keyboard-right{width:188rpx;}
+.gui-keyboard-keys{width:166rpx; height:100rpx; margin:10rpx; background-color:#FFFFFF; text-align:center; line-height:100rpx; border-radius:8rpx; font-weight:700; font-size:50rpx;}
+.gui-keyboard-done{height:340rpx; line-height:340rpx; font-size:36rpx; font-weight:400; color:#FFFFFF;}
+.gui-keyboard-res{line-height:60rpx; text-align:center; font-size:32rpx; font-weight:bold; padding-top:20rpx;}
+.keydown{background-color:#3688FF; color:#FFFFFF;}
+</style>

+ 74 - 0
lib/GraceUI5/components/gui-order.vue

@@ -0,0 +1,74 @@
+<template>
+	<view  @tap="changeOrderBy" 
+	class="gui-flex gui-rows gui-nowrap gui-align-items-center gui-justify-content-center">
+		<view><slot></slot></view>
+		<view v-if="orderByIn == 0" class="gui-order gui-flex gui-columns">
+			<text class="gui-block-text gui-icons gui-order-icon" 
+			:style="{width:(size+10)+'rpx', height:(size)+'rpx', 
+			lineHeight:(size)+'rpx', fontSize:fontSize+'rpx', color:color}">&#xe647;</text>
+			<text class="gui-block-text gui-icons gui-order-icon" 
+			:style="{width:(size+10)+'rpx', height:(size)+'rpx', 
+			lineHeight:(size)+'rpx', fontSize:fontSize+'rpx', color:color}">&#xe661;</text>
+		</view>
+		<view v-if="orderByIn == 1" class="gui-order gui-flex gui-columns">
+			<text class="gui-block-text gui-icons gui-order-icon" 
+			:style="{width:(size+10)+'rpx', height:(size)+'rpx', 
+			lineHeight:(size)+'rpx', fontSize:fontSize+'rpx', color:activeColor}">&#xe647;</text>
+			<text class="gui-block-text gui-icons gui-order-icon" 
+			:style="{width:(size+10)+'rpx', height:(size)+'rpx', 
+			lineHeight:(size)+'rpx', fontSize:fontSize+'rpx', color:color}">&#xe661;</text>
+		</view>
+		<view v-if="orderByIn == 2" class="gui-order gui-flex gui-columns">
+			<text class="gui-block-text gui-icons gui-order-icon" 
+			:style="{width:(size+10)+'rpx', height:(size)+'rpx', 
+			lineHeight:(size)+'rpx', fontSize:fontSize+'rpx', color:color}">&#xe647;</text>
+			<text class="gui-block-text gui-icons gui-order-icon" 
+			:style="{width:(size+10)+'rpx', height:(size)+'rpx', 
+			lineHeight:(size)+'rpx', fontSize:fontSize+'rpx', color:activeColor}">&#xe661;</text>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-order",
+	props : {
+		size        : {type:Number, default:18},
+		fontSize    : {type:Number, default:36},
+		color       : {type:String, default:'rgba(69, 90, 100, 0.3)'},
+		activeColor : {type:String, default:'#FF0036'},
+		orderBy     : {type:Number, default:0},
+		limit       : {type:Array,  default:function(){return [0,2];}}
+	},
+	data() {
+		return {
+			orderByIn : 0
+		}
+	},
+	created:function(){
+		this.orderByIn = this.orderBy;
+		this.init();
+	},
+	watch:{
+		orderBy : function(v){
+			console.log(v);
+			this.orderByIn = v;
+			this.init();
+		}
+	},
+	methods:{
+		changeOrderBy:function(){
+			this.orderByIn++;
+			if(this.orderByIn > this.limit[1]){this.orderByIn = this.limit[0];}
+			this.$emit('change', this.orderByIn);
+		},
+		init:function(){
+			if(this.orderByIn < 0){this.orderByIn = 0;}
+			else if(this.orderByIn > 2){this.orderByIn = 2;}
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-order{padding:0 15rpx;}
+.gui-order-icon{text-align:center; overflow:hidden;}
+</style>

+ 154 - 0
lib/GraceUI5/components/gui-page-loading.vue

@@ -0,0 +1,154 @@
+<template>
+	<view 
+	class="gui-page-loading gui-flex gui-nowrap gui-align-items-center gui-justify-content-center gui-page-loading-bg"
+	@tap.stop="stopfun" 
+	@touchmove.stop.prevent="stopfun" 
+	v-if="isLoading">
+		<!-- #ifndef APP-NVUE -->
+		<view class="gui-page-loading-point gui-flex gui-rows gui-justify-content-center">
+			<view class="gui-page-loading-points animate1 gui-page-loading-color"></view>
+			<view class="gui-page-loading-points animate2 gui-page-loading-color"></view>
+			<view class="gui-page-loading-points animate3 gui-page-loading-color"></view>
+		</view>
+		<!-- #endif -->
+		<!-- #ifdef APP-NVUE -->
+		<view class="gui-page-loading-point gui-flex gui-rows gui-justify-content-center">
+			<view class="gui-page-loading-points gui-page-loading-color" ref="loadingPoints1"></view>
+			<view class="gui-page-loading-points gui-page-loading-color" ref="loadingPoints2"></view>
+			<view class="gui-page-loading-points gui-page-loading-color" ref="loadingPoints3"></view>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const BindingX = uni.requireNativePlugin('bindingx');
+// #endif
+export default{
+	name  : "gui-page-loading",
+	props : {},
+	data() {
+		return {
+			isLoading      : false,
+			BindingXObjs   : [null,null,null],
+			AnimateObjs    : [null,null,null],
+			animateTimer   : 800,
+			intervalID     : null
+		}
+	},
+	watch:{
+		// #ifdef APP-NVUE
+		isLoading : function (val) {
+			if(val){
+				setTimeout(()=>{
+					this.getRefs('loadingPoints1', 0, (refs)=>{
+						this.BindingXObjs = [
+							refs.ref,
+							this.$refs.loadingPoints2.ref,
+							this.$refs.loadingPoints3.ref
+						];
+						this.startAnimate();
+					});
+				}, 100);
+				this.intervalID = setInterval(()=>{
+					if(this.isLoading){
+						this.startAnimate();
+					}else{
+						clearInterval(this.intervalID);
+					}
+				}, 2000);
+			}
+		}
+		// #endif
+	},
+	methods:{
+		// #ifdef APP-NVUE
+		startAnimate   : function(){
+			this.loadingAnimate(0);
+			setTimeout(()=>{this.loadingAnimate(1);},300);
+			setTimeout(()=>{this.loadingAnimate(2);},600);
+		},
+		loadingAnimate : function (id) {
+			this.AnimateObjs[id] = BindingX.bind({
+				eventType      : 'timing',
+				exitExpression : 't>'+this.animateTimer,
+				props          : [
+					{
+						element    : this.BindingXObjs[id], 
+						property   : 'transform.scale',
+						expression : "1+t/"+this.animateTimer+"/3"
+					},
+					{
+						element    : this.BindingXObjs[id], 
+						property   : 'opacity',
+						expression : "0.6+t/"+this.animateTimer
+					}
+				]
+			}, (e)=>{
+				if(e.state === 'exit') {
+					BindingX.unbind({
+						token : this.AnimateObjs[id].token,
+						eventType: 'timing'
+					});
+					this.AnimateObjs[id] = BindingX.bind({
+						eventType      : 'timing',
+						exitExpression : 't>'+this.animateTimer,
+						props          : [
+							{
+								element    : this.BindingXObjs[id], 
+								property   : 'transform.scale',
+								expression : "1.35-t/"+this.animateTimer+"/3"
+							},
+							{
+								element    : this.BindingXObjs[id], 
+								property   : 'opacity',
+								expression : "1.6-t/"+this.animateTimer
+							}
+						]
+					}, (e)=>{
+						if(e.state === 'exit') {
+							BindingX.unbind({
+								token : this.AnimateObjs[id].token,
+								eventType: 'timing'
+							});
+						}
+					});
+				}
+			});
+		},
+		// #endif
+		stopfun        : function(e){e.stopPropagation(); return null;},
+		open           : function(){ this.isLoading = true; },
+		close          : function(){
+			setTimeout(()=>{
+				this.isLoading = false; 
+			},100);
+		},
+		getRefs        : function(ref, count, fun){
+			if(count >= 30){return null;}
+			var refReturn = this.$refs[ref];
+			if(refReturn){
+				fun(refReturn);
+				return;
+			}else{
+				count++;
+				setTimeout(()=>{
+					this.getRefs(ref, count, fun);
+				}, 50);
+			}
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-page-loading{width:750rpx; position:fixed; left:0; top:0; bottom:0; flex:1; z-index:99999;}
+.gui-page-loading-points{width:20rpx; height:20rpx; border-radius:50rpx; margin:10rpx; opacity:0.5;}
+/* #ifndef APP-NVUE */
+@keyframes pageLoading1{0% {opacity:0.5; transform:scale(1);} 40% {opacity:1; transform:scale(1.5);}  60%{opacity:0.5; transform:scale(1);}}
+@keyframes pageLoading2{20% {opacity:0.5; transform:scale(1);} 60% {opacity:1; transform:scale(1.5);}  80% {opacity:0.5; transform:scale(1);}}
+@keyframes pageLoading3{40% {opacity:0.5; transform:scale(1);} 80% {opacity:1; transform:scale(1.5);}  100% {opacity:0.5; transform:scale(1);}}
+.animate1{animation:pageLoading1 1.2s infinite linear;}
+.animate2{animation:pageLoading2 1.2s infinite linear;}
+.animate3{animation:pageLoading3 1.2s infinite linear;}
+/* #endif */
+</style>

+ 419 - 0
lib/GraceUI5/components/gui-page.vue

@@ -0,0 +1,419 @@
+<template>
+	<view :class="[
+		'gui-flex', 'gui-columns', 'gui-sbody', 
+		fullPage ? 'gui-flex1':'' , 
+		refresh || loadmore ? 'gui-flex1' : ''
+	]">
+		<!-- 自定义头部 -->
+		<view class="gui-header gui-transition-all" 
+		v-if="customHeader" 
+		id="guiPageHeader" ref="guiPageHeader" 
+		:style="'height:'
+		+(headerSets.height+statusBarHeight)+'px; z-index:'
+		+headerSets.zIndex+';'+headerStyle">
+			<!-- 状态栏 -->
+			<view class="gui-page-status-bar" 
+			:style="'height:'+statusBarHeight+'px;'+statusBarStyle"></view>
+			<!-- 头部插槽 -->
+			<view class="gui-flex gui-columns gui-justify-content-center" 
+			@tap.stop.prevnet="headerTap"
+			:style="{height:headerSets.height+'px'}">
+				<slot name="gHeader"></slot>
+			</view>
+		</view>
+		<!-- 自定义头部占位 -->
+		<view v-if="customHeader && isHeaderSized" 
+		:style="{height:(headerSets.height+statusBarHeight)+'px'}"></view>
+		
+		
+		<!-- 页面主体 -->
+		<view class="gui-flex gui-columns" v-if="!refresh && !loadmore" 
+		id="guiPageBody" ref="guiPageBody" 
+		:class="[fullPage?'gui-flex1':'']">
+			<slot name="gBody"></slot>
+		</view>
+		
+		
+		<!-- 刷新加载主体 -->
+		<view class="gui-flex gui-columns gui-flex1" 
+		v-if="refresh || loadmore" 
+		id="guiPageBody" 
+		ref="guiPageBody" 
+		:style="{
+			marginTop:fixedTopMargin+'px', 
+			height:refreshBodyHeight+'px'
+		}">
+			<scroll-view class="gui-relative" 
+			:scroll-y="true" 
+			:show-scrollbar="false" 
+			:style="{
+				height:refreshBodyHeight+'px',
+				opacity:refreshBodyHeight < 1 ? 0 : 1
+			}" 
+			@touchstart="touchstart" 
+			@touchmove="touchmove" 
+			@touchend="touchend" 
+			@scroll="scroll" 
+			:scroll-top="scrollTop" 
+			@scrolltolower="loadmorefun">
+				<view>
+					<gui-refresh 
+					ref="guiPageRefresh" 
+					@reload="reload"
+					:refreshText="refreshText" 
+					:refreshBgColor="refreshBgColor" 
+					:refreshColor="refreshColor" 
+					:refreshFontSize="refreshFontSize"></gui-refresh>
+				</view>
+				<slot name="gBody"></slot>
+				<view 
+				v-if="loadmore" 
+				class="gui-page-loadmore">
+					<gui-loadmore 
+					ref="guipageloadmore" 
+					:loadMoreText="loadMoreText" 
+					:loadMoreColor="loadMoreColor" 
+					:loadMoreFontSize="loadMoreFontSize"></gui-loadmore>
+				</view>
+			</scroll-view>
+		</view>
+
+
+		<!-- 页面底部 -->
+		<!-- 底部占位 -->
+		<view v-if="customFooter" 
+		:style="{height:footerHeight}"></view>
+		<view class="gui-page-footer gui-border-box" 
+		:class="[isSwitchPage?'gui-switch-page-footer':'']" 
+		v-if="customFooter" 
+		id="guiPageFooter" 
+		ref="guiPageFooter" 
+		:style="{
+			height:footerHeight, 
+			'background-image':footerSets.bg, 
+			'z-index':footerSets.zIndex
+		}">
+			<view><slot name="gFooter"></slot></view>
+			<view 
+			:style="'height:'+iphoneXButtomHeight+'; '+ iphoneXButtomStyle"></view>
+		</view>
+		
+		<!-- 右下角悬浮挂件 -->
+		<view class="gui-page-pendant" 
+		:style="{
+			right:pendantSets.right, bottom:pendantSets.bottom, 
+			width:pendantSets.width, zIndex:pendantSets.zIndex}">
+			<slot name="gPendant"></slot>
+		</view>
+		
+		<!-- 吸顶元素 -->
+		<view class="gui-page-fixed-top" 
+		ref="guiPageFixedTop" 
+		id="guiPageFixedTop" 
+		:style="{top:fixedTop+'px'}">
+			<slot name="gFixedTop"></slot>
+		</view>
+		
+		<!-- 全屏 loading -->
+		<gui-page-loading ref="guipageloading"></gui-page-loading>
+	</view>
+</template>
+<script>  
+// #ifdef APP-NVUE
+const dom     = weex.requireModule('dom');
+// #endif
+export default{
+	name  : 'gui-page',
+	props : {
+		fullPage           : {type:Boolean, default:false},
+		customHeader       : {type:Boolean, default:false},
+		headerSets         : {type:Object , default:function(){return {height:44, zIndex:100}}},
+		headerStyle        : {type:String , default:'background-color:#FFFFFF;'},
+		isHeaderSized      : {type:Boolean, default:true},
+		statusBarStyle     : {type:String , default:'background-color:#FFFFFF;'},
+		customFooter       : {type:Boolean, default:false},
+		footerSets         : {type:Object , default:function(){return {height:100, zIndex:100, bg:'linear-gradient(to bottom, #FFFFFF,#FFFFFF)'}}},
+		pendantSets        : {type:Object , default:function(){return {width:'100rpx', right:'25rpx', bottom:'100rpx', zIndex:100};}},
+		isLoading          : {type:Boolean, default:false},
+		isSwitchPage       : {type:Boolean, default:false},
+		iphoneXButtomStyle : {type:String,  default:''},
+		
+		/* 刷新 */
+		refresh            : {type:Boolean, default:false},
+		refreshText        : {type:Array,   default:function () {
+			return ['继续下拉刷新','松开手指开始刷新','数据刷新中','数据已刷新'];
+		}},
+		refreshBgColor     : {type:Array,   default:function () {
+			return ['#FFFFFF','#FFFFFF','#FFFFFF','#63D2BC'];
+		}},
+		refreshColor       : {type:Array,   default:function () {
+			return ['rgba(69, 90, 100, 0.6)','rgba(69, 90, 100, 0.6)','#63D2BC','#FFFFFF'];
+		}},
+		refreshFontSize    : {type:String, default:'26rpx'},
+		
+		/* 加载更多 */
+		loadmore           : {type:Boolean, default:false},
+		loadMoreText       : {type:Array, default:function () {
+			return ['','更多数据加载中', '已加载全部数据'];
+		}},
+		loadMoreColor      : {type:Array, default:function () {
+			return ['rgba(69, 90, 100, 0.6)', 'rgba(69, 90, 100, 0.6)', 'rgba(69, 90, 100, 0.8)'];
+		}},
+		loadMoreFontSize   : {type:String, default:'26rpx'},
+		apiLoadingStatus   : {type:Boolean, default:false}
+	},
+	data() {
+		return {
+			footerHeight        : '100rpx',
+			iphoneXButtomHeight : '0rpx',
+			statusBarHeight     : 0,
+			// #ifdef APP-NVUE
+			animateCount        : 0,
+			// #endif
+			headerTapNumber     : 0,
+			fixedTop            : 0,
+			refreshBodyHeight   : 0,
+			loadMoreTimer       : null,
+			fixedTopMargin      : 0,
+			scrollTop           : 0,
+			srcollTimer         : null
+		}
+	},
+	
+	mounted:function(){
+		
+		if(this.isLoading){
+			this.$refs.guipageloading.open();
+		}
+		
+		// 刷新相关
+		if(this.refresh || this.loadmore){
+			// #ifdef APP-NVUE
+			this.getRefs('guiPageBody', 0, (res)=>{
+				setTimeout(()=>{
+					this.getDomSize('guiPageBody', (res2)=>{
+						this.refreshBodyHeight = res2.height;
+						this.getDomSize('guiPageFixedTop', (res)=>{
+							if(res.height){
+								this.refreshBodyHeight -= res.height;
+								this.fixedTopMargin     = res.height;
+							}
+							if(this.customFooter){
+								this.getDomSize('guiPageFooter',(footer)=>{
+									this.refreshBodyHeight -= footer.height;
+								});
+							}
+						});
+					});
+				},100);
+			});
+			// #endif
+			// #ifndef APP-NVUE
+			this.getDomSize('guiPageBody', (res)=>{
+				this.refreshBodyHeight = res.height;
+				this.getDomSize('guiPageFixedTop', (res)=>{
+					if(res.height){
+						this.refreshBodyHeight -= res.height;
+						this.fixedTopMargin     = res.height;
+					}
+					if(this.customFooter){
+						this.getDomSize('guiPageFooter',(footer)=>{
+							this.refreshBodyHeight -= footer.height;
+							console.log(this.refreshBodyHeight);
+						});
+					}					
+				})
+			});
+			// #endif
+		}
+	},
+	
+	watch:{
+		isLoading : function (val) {
+			if(val){
+				this.$refs.guipageloading.open();
+			}else{
+				this.$refs.guipageloading.close();
+			}
+		}
+	},
+	
+	created:function(){
+		
+		this.footerHeight = this.footerSets.height + 'rpx';
+		
+		// #ifdef H5
+		if(this.customHeader){
+			this.fixedTop = this.headerSets.height;
+		}else{
+			this.fixedTop = 44;
+		}
+		// #endif
+		
+		try {
+			var system   = uni.getSystemInfoSync();
+			if(system.model){
+				system.model = system.model.replace(' ', '');
+				system.model = system.model.toLowerCase();
+				this.statusBarHeight = system.statusBarHeight;
+				var res1 = system.model.indexOf('iphonex');
+				if(res1 > 5){res1 = -1;}
+				var res2 = system.model.indexOf('iphone1');
+				if(res2 > 5){res2 = -1;}
+				if(res1 != -1 || res2 != -1){
+					this.iphoneXButtomHeight = '50rpx';
+					this.footerHeight        =  (this.footerSets.height + 50 ) + 'rpx';
+				}
+			}
+			
+			// #ifdef MP-ALIPAY
+			this.statusBarHeight = 0;
+			// #endif
+			
+			// #ifdef APP-PLUS
+			this.iphoneXButtomHeight = '0rpx';
+			this.footerHeight        =  this.footerSets.height + 'rpx';
+			// #endif
+			
+			if(this.isSwitchPage){
+				this.iphoneXButtomHeight = '0rpx';
+				this.footerHeight        =  this.footerSets.height + 'rpx';
+			}
+			
+			// #ifndef H5
+			if(this.customHeader){
+				this.fixedTop = this.headerSets.height + this.statusBarHeight;
+			}else{
+				this.fixedTop = 0;
+			}
+			// #endif
+		} catch (e){return null;}
+	},
+	methods:{
+		// 下拉刷新相关
+		touchstart : function (e){
+			if(!this.refresh){return false;}
+			if(this.apiLoadingStatus){return false;}
+			this.$refs.guiPageRefresh.touchstart(e);
+		},
+		touchmove : function(e){
+			if(!this.refresh){return false;}
+			if(this.apiLoadingStatus){return false;}
+			this.$refs.guiPageRefresh.touchmove(e);
+		},
+		touchend : function (e) {
+			if(!this.refresh){return false;}
+			if(this.apiLoadingStatus){return false;}
+			this.$refs.guiPageRefresh.touchend(e);
+		},
+		scroll:function(e){
+			if(this.srcollTimer != null){
+				clearTimeout(this.srcollTimer);
+			}
+			this.srcollTimer = setTimeout(()=>{
+				this.$refs.guiPageRefresh.scroll(e);
+				this.$emit('scroll', e);
+				this.scrollTop = e.detail.scrollTop;
+			}, 100);
+		},
+		setScrollTop : function (scrollTop){
+			this.scrollTop = scrollTop;
+		},
+		endReload : function(){
+			this.$refs.guiPageRefresh.endReload();
+		},
+		reload : function(){
+			if(this.apiLoadingStatus){return false;}
+			this.$emit('reload');
+			if(this.loadmore){this.$refs.guipageloadmore.stoploadmore();}
+		},
+		
+		// 获取元素尺寸
+		getDomSize : function(domIDOrRef, fun){
+			setTimeout(()=>{
+				// #ifndef APP-NVUE
+				uni.createSelectorQuery().in(this).select('#'+domIDOrRef).boundingClientRect().exec((res)=>{
+					fun(res[0]);
+				});
+				// #endif
+				// #ifdef APP-NVUE
+				var el = this.$refs[domIDOrRef];
+				dom.getComponentRect(el, (res) => {
+					fun(res.size);
+				});
+				// #endif
+			}, 800);
+			
+		},
+		stopfun : function(e){e.stopPropagation(); return null;},
+		headerTap : function(){
+			this.headerTapNumber ++;
+			if(this.headerTapNumber >= 2){
+				this.$emit('gotoTop');
+				this.headerTapNumber = 0;
+			}else{
+				setTimeout(()=>{this.headerTapNumber = 0;}, 1000);
+			}
+		},
+		// #ifdef APP-NVUE
+		getRefs : function(ref, count, fun){
+			if(count >= 40){return null;}
+			var refReturn = this.$refs[ref];
+			if(refReturn){
+				fun(refReturn);
+				return;
+			}else{
+				count++;
+				setTimeout(()=>{
+					this.getRefs(ref, count, fun);
+				}, 100);
+			}
+		},
+		// #endif
+		
+		loadmorefun : function () {
+			if(!this.loadmore){return false;}
+			if(this.apiLoadingStatus){return false;}
+			// 获取加载组件状态看一下是否还能继续加载
+			// 保证触底只执行一次加载
+			if(this.loadMoreTimer != null){clearTimeout(this.loadMoreTimer);}
+			this.loadMoreTimer =  setTimeout(() => {
+				var status = this.$refs.guipageloadmore.loadMoreStatus;
+				if(status != 0){return null;}
+				this.$refs.guipageloadmore.loading();
+				this.$emit('loadmorefun');
+			}, 80);
+		},
+		stoploadmore : function(){
+			this.$refs.guipageloadmore.stoploadmore();
+		},
+		nomore : function () {
+			this.$refs.guipageloadmore.nomore();
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-sbody{width:750rpx;}
+.gui-page-loading{width:750rpx; position:fixed; left:0; top:0; bottom:0; flex:1; z-index:99999;}
+.gui-page-loading-points{width:20rpx; height:20rpx; border-radius:50rpx; margin:10rpx;}
+/* #ifndef APP-NVUE */
+.gui-sbody{min-height:calc(100vh - var(--window-top) - var(--window-bottom));}
+@keyframes pageLoading1{0% {opacity:0.5; transform:scale(1);} 40% {opacity:1; transform:scale(1.5);}  60%{opacity:0.5; transform:scale(1);}}
+@keyframes pageLoading2{20% {opacity:0.5; transform:scale(1);} 60% {opacity:1; transform:scale(1.5);}  80% {opacity:0.5; transform:scale(1);}}
+@keyframes pageLoading3{40% {opacity:0.5; transform:scale(1);} 80% {opacity:1; transform:scale(1.5);}  100% {opacity:0.5; transform:scale(1);}}
+.animate1{animation:pageLoading1 1.2s infinite linear;}
+.animate2{animation:pageLoading2 1.2s infinite linear;}
+.animate3{animation:pageLoading3 1.2s infinite linear;}
+/* #endif */
+.gui-header{width:750rpx; position:fixed; left:0; top:0;}
+.gui-page-footer{width:750rpx; position:fixed; left:0; bottom:0;}
+/* #ifdef H5 */
+.gui-switch-page-footer{bottom:50px;}
+/* #endif */
+.gui-page-status-bar{width:750rpx;}
+.gui-page-pendant{position:fixed;}
+
+.gui-page-fixed-top{position:fixed; top:44px; left:0px;  width:750rpx; z-index:99998; overflow:hidden;}
+.gui-page-loadmore{padding-bottom:30rpx;}
+</style>

+ 92 - 0
lib/GraceUI5/components/gui-pk.vue

@@ -0,0 +1,92 @@
+<template>
+	<view class="gui-pk-wrap" 
+	:style="{width:width,height:height,borderRadius:borderRadius}">
+		<!-- 背景 -->
+		<image 
+		src="https://upload-images.jianshu.io/upload_images/15372054-ef5c77eb84052ec1.png?imageMogr2/auto-orient/strip|imageView2/2/w/750/format/webp" 
+		class="gui-pk-bg" style="width:690rpx; height:460rpx;"></image>
+		<!-- pk 图标 -->
+		<view class="gui-pk-icon-wrap gui-flex gui-rows gui-justify-content-center gui-align-items-center" 
+		:style="{width:width, height:height,borderRadius:borderRadius}">
+			<view class="gui-pk-icon gui-border-box">
+				<image 
+				src="https://upload-images.jianshu.io/upload_images/15372054-24bbe2c57e61d1a2.png?imageMogr2/auto-orient/strip|imageView2/2/w/140/format/webp" 
+				mode="widthFix" style="width:80rpx; height:80rpx;"></image>
+			</view>
+		</view>
+		<view class="gui-pk gui-flex gui-rows gui-space-between gui-align-items-center" 
+		:style="{width:width, height:height,borderRadius:borderRadius}">
+			<view class="gui-pk-item gui-flex gui-columns">
+				<text class="gui-pk-title gui-block-text">{{title[0]}}</text>
+				<view class="gui-pk-btn-wrap" hover-class="gui-tap" v-if="status == 'button'">
+					<text class="gui-pk-btn gui-block-text" 
+					data-index="left" @tap="choose">{{btnName}}</text>
+				</view>
+				<view class="gui-pk-btn-wrap" v-if="status == 'progress'">
+					<progress :percent="progress[0]" activeColor="#FFFFFF" :active="active" 
+					stroke-width="3" class="gui-pk-progress" backgroundColor="#3699ff" />
+				</view>
+				<text class="gui-pk-text gui-block-text" v-if="status == 'progress'">{{progress[2]}}</text>
+			</view>
+			<view class="gui-pk-item">
+				<text class="gui-pk-title gui-block-text" style="text-align:right;">{{title[1]}}</text>
+				<view class="gui-pk-btn-wrap gui-flex gui-rows" hover-class="gui-tap" 
+				style="justify-content:flex-end;" v-if="status == 'button'">
+					<text class="gui-pk-btn gui-block-text" 
+					style="color:#FF0036;" data-index="right" @tap="choose">{{btnName}}</text>
+				</view>
+				<view class="gui-pk-btn-wrap" style="justify-content:flex-end;" v-if="status == 'progress'">
+					<progress :percent="progress[1]" stroke-width="3" class="gui-pk-progress" 
+					:active="active" activeColor="#FFFFFF" backgroundColor="#FF6666"/>
+				</view>
+				<text class="gui-pk-text gui-block-text" style="text-align:right;" v-if="status == 'progress'">{{progress[3]}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-pk",
+	props : {
+		width        : {type:String, default:'690rpx'},
+		height       : {type:String, default:'260rpx'},
+		borderRadius : {type:String, default:'8rpx'},
+		title        : {type:Array, default:function(){return ['',''];}},
+		btnName      : {type:String, default:'站队'},
+		status       : {type:String, default:'button'},
+		progress     : {type:Array, default:function(){return [80,20,'8000 票', '2000 票'];}}
+	},
+	methods:{
+		choose:function (e) {
+			this.$emit('choose', e.currentTarget.dataset.index);
+		}
+	},
+	data() {
+		return {
+			// #ifndef APP-NVUE
+			active: true,
+			// #endif
+			// #ifdef APP-NVUE
+			active: false
+			// #endif
+		}
+	},
+}
+</script>
+<style scoped>
+.gui-pk-wrap{font-size:0; overflow:hidden; position:relative;}
+.gui-pk-bg{position:absolute; left:0; top:0; z-index:1;}
+.gui-pk{position:absolute; left:0; top:0; z-index:3;}
+.gui-pk-item{width:220rpx; overflow:hidden; padding-left:35rpx; padding-right:35rpx;}
+/* #ifndef APP-PLUS */
+.gui-pk-item{box-sizing:border-box;}
+/* #endif */
+.gui-pk-title{color:#FFFFFF; font-size:50rpx; line-height:60rpx;}
+.gui-pk-btn-wrap{margin-top:32rpx;}
+.gui-pk-btn{width:120rpx; height:50rpx; line-height:50rpx; text-align:center; background-color:#FFFFFF; font-size:24rpx; border-radius:100rpx; color:#3687FF;}
+.gui-pk-btn-hv{font-weight:bold;}
+.gui-pk-progress{width:150rpx;}
+.gui-pk-text{font-size:22rpx; color:#FFFFFF; line-height:50rpx; margin-top:2px;}
+.gui-pk-icon-wrap{position:absolute; top:0px; left:0px; z-index:2;}
+.gui-pk-icon{width:120rpx; height:120rpx; padding-top:20rpx; padding-bottom:20rpx; padding-left:20rpx; padding-right:20rpx; background-color:#FFFFFF; border-radius:100rpx; font-size:0;}
+</style>

+ 111 - 0
lib/GraceUI5/components/gui-popup-menu.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="gui-relative" v-if="showIn">
+		<view class="grace-popup-mask"
+		:class="[showIn?'grace-shade-in':'', outting ? 'grace-shade-out' : '']" 
+		@tap.stop="close" @touchmove.stop.prevent="stopfun"
+		:style="{backgroundColor:background, zIndex:zIndex}" 
+		v-if="showIn"></view>
+		<view class="grace-popup-menu" 
+		v-if="showIn" ref="guipopupmenu" 
+		:class="[showIn?'grace-shade-in':'', outting ? 'grace-shade-out' : '']" 
+		:style="{
+		top:top+'px', right:right+'px', width:menuWidth, 
+		zIndex:zIndex+1, height:showIn?'':'0rpx'
+		}">
+			<!-- #ifndef APP-NVUE -->
+			<view :class="['gui-flex', 'gui-rows', 'arrow-d-'+arrowDirection]" 
+			v-if="isArrow">
+				<view class="arrow-up" :style="{margin:arrowMargin}"></view>
+			</view>
+			<!-- #endif -->
+			<view :style="{width:menuWidth}">
+				<slot></slot>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const animation = weex.requireModule('animation');
+// #endif
+var graceJS = require('@/GraceUI5/js/grace.js');
+export default {
+	name  : "gui-popup-menu",
+	props : {
+		menuWidth    :  { type : String,  default : '258rpx' },
+		background   :  { type : String,  default : 'rgba(0,0,0, 0.3)' },
+		zIndex       :  { type : Number,  default : 99 },
+		isArrow      :  { type : Boolean, default : true},
+		arrowDirection : {type : String,  default : "right"},
+		arrowMargin  :  { type : String, default : "0 15rpx"}
+	},
+	data() {
+		return {
+			showIn  : false,
+			top     : 0,
+			right   : 0,
+			outting : false
+		}
+	},
+	methods: {
+		stopfun  : function(e){e.stopPropagation(); return null;},
+		open     : function(){
+			this.outting = false;
+			this.showIn  = true;
+			// #ifdef APP-NVUE
+			graceJS.getRefs('guipopupmenu', this, 0, (guipopupref)=>{
+				animation.transition(guipopupref, {
+					styles: {opacity:1, transform:'scale(1)'},
+					duration: 200, //ms
+					timingFunction: 'ease',
+					delay: 0 //ms
+				});
+			});
+			// #endif
+		},
+		close     : function(){
+			this.outting    = true;
+			setTimeout(()=>{
+				this.showIn = false;
+			},200);
+			// #ifdef APP-NVUE
+			graceJS.getRefs('guipopupmenu', this, 0, (guipopupref)=>{
+				animation.transition(guipopupref, {
+					styles: {opacity:0, transform:'scale(0.5)'},
+					duration: 200, //ms
+					timingFunction: 'ease',
+					delay: 0 //ms
+				});
+			});
+			// #endif
+		},
+		setTop   : function (top) {
+			this.top = top;
+		},
+		setRight : function (right) {
+			this.right = right;
+		}
+	}
+}
+</script>
+<style scoped>
+.grace-popup-menu{width:258rpx; padding:10rpx; right:0; top:0; position:absolute; opacity:0; transform:scale(0.1);}
+/* #ifdef APP-NVUE */
+.grace-popup-menu{padding:0rpx 10rpx;}
+/* #endif */
+.grace-popup-mask{width:750rpx; position:fixed; left:0; top:0px; bottom:0; flex:1;}
+/* #ifndef APP-NVUE */
+.grace-popup-mask{height:100%;}
+.arrow-up{width:0; height:0; border-left:18rpx solid transparent; border-right:18rpx solid transparent; border-bottom:18rpx solid #FFFFFF;}
+.arrow-d-right{justify-content:flex-end;}
+.arrow-d-center{justify-content:center;}
+.arrow-d-left{justify-content:flex-start;}
+.grace-shade-in{animation:grace-shade-in-a 150ms ease-in forwards;}
+@keyframes grace-shade-in-a{0%{transform:scale(0.1); opacity:0;} 100%{transform: scale(1); opacity:1;}}
+.grace-shade-out{animation:grace-shade-out-a 150ms ease-out forwards;}
+@keyframes grace-shade-out-a{0%{transform:scale(1); opacity:1;} 100%{transform: scale(0.5); opacity:0;}}
+/* #endif */
+/* #ifdef APP-NVUE */
+.grace-popup-menu{position:fixed;}
+/* #endif */
+</style>

+ 245 - 0
lib/GraceUI5/components/gui-popup.vue

@@ -0,0 +1,245 @@
+<template>
+	<view v-if="show">
+		<!-- 居中 -->
+		<view class="gui-popup gui-flex gui-columns gui-justify-content-center gui-align-items-center" 
+		:class="[out ? 'gui-fade-out' : 'gui-fade-in']" 
+		ref="guipopup" 
+		@tap.stop="closebysd" @touchmove.stop.prevent="stopfun" 
+		:style="{backgroundColor:bgColor, zIndex:zIndex, top:top+'px'}" 
+		v-if="position == 'center'">
+			<view class="gui-popup-content gui-popup-center"
+			 @tap.stop="stopfun" ref="guiPopupCenter" 
+			:class="[out ? 'gui-scale-out' : 'gui-scale-in']" 
+			:style="'width:'+width+';'"><slot></slot></view>
+		</view>
+		<!-- 顶部 -->
+		<view class="gui-popup gui-flex gui-columns" 
+		:style="{backgroundColor:bgColor, zIndex:zIndex, top:top+'px'}" 
+		v-if="position == 'top'" 
+		:class="[out ? 'gui-fade-out' : 'gui-fade-in']" ref="guipopup" 
+		@tap.stop="closebysd" @touchmove.stop.prevent="stopfun">
+			<view class="gui-popup-content gui-popup-top" 
+			@tap.stop="stopfun" ref="guiPopupTop" 
+			:class="[out ? 'gui-top-out' : 'gui-top-in']">
+				<slot></slot>
+			</view>
+		</view>
+		<!-- 底部 -->
+		<view class="gui-popup gui-flex gui-columns gui-justify-content-end" 
+		:style="{backgroundColor:bgColor, zIndex:zIndex, top:top+'px'}" 
+		v-if="position == 'bottom'" 
+		:class="[out ? 'gui-fade-out' : 'gui-fade-in']" ref="guipopup" 
+		@tap.stop="closebysd" @touchmove.stop.prevent="stopfun">
+			<view class="gui-popup-content gui-popup-bottom" 
+			@tap.stop="stopfun" ref="guiPopupBottom" 
+			:class="[out ? 'gui-bottom-out' : 'gui-bottom-in']">
+				<slot></slot>
+			</view>
+		</view>
+		<!-- 左侧 -->
+		<view class="gui-popup gui-flex gui-columns" 
+		v-if="position == 'left'"
+		:class="[out ? 'gui-fade-out' : 'gui-fade-in']" 
+		ref="guipopup" 
+		@tap.stop="closebysd" @touchmove.stop.prevent="stopfun" 
+		:style="{backgroundColor:bgColor, zIndex:zIndex, top:top+'px'}">
+			<view class="gui-popup-content gui-flex1 gui-flex gui-columns gui-popup-left" 
+			@tap.stop="stopfun" ref="guiPopupLeft" 
+			:class="[out ? 'gui-left-out' : 'gui-left-in']" 
+			:style="'width:'+width+';'">
+				<slot></slot>
+			</view>
+		</view>
+		<!-- 右侧 -->
+		<view class="gui-popup gui-flex gui-columns gui-align-items-end" 
+		v-if="position == 'right'"
+		:class="[out ? 'gui-fade-out' : 'gui-fade-in']" 
+		ref="guipopup" 
+		@tap.stop="closebysd" @touchmove.stop.prevent="stopfun" 
+		:style="{backgroundColor:bgColor, zIndex:zIndex, top:top+'px'}">
+			<view class="gui-popup-content gui-flex1 gui-flex gui-columns gui-popup-right" 
+			@tap.stop="stopfun" ref="guiPopupRight" 
+			:class="[out ? 'gui-right-out' : 'gui-right-in']" 
+			:style="'width:'+width+';'">
+				<slot></slot>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const animation = weex.requireModule('animation');
+var graceJS = require('@/GraceUI5/js/grace.js');
+// #endif
+export default{
+	name  : "gui-popup",
+	props : {
+		bgColor         : { type : String,  default : 'rgba(0, 0, 0, 0.7)'},
+		position        : { type : String,  default : 'center'},
+		width           : { type : String,  default : '580rpx'},
+		canCloseByShade : { type : Boolean, default : true },
+		zIndex          : { type : Number,  default : 99999},
+		top             : { type : Number,  default : 0}
+	},
+	data(){
+		return {
+			show : false,
+			out  : false
+		}
+	},
+	methods:{
+		open    : function(){
+			this.out  = false;
+			this.show = true;
+			// #ifdef APP-NVUE
+			this.weexAnimateIn();
+			// #endif
+		},
+		closebysd : function () {
+			if(this.canCloseByShade){this.close();}
+		},
+		close   : function(){
+			this.out = true;
+			// #ifdef APP-NVUE
+			this.weexAnimateOut();
+			// #endif
+			setTimeout(()=>{
+				this.show = false;
+				this.$emit('close'); 
+			},350);
+		},
+		stopfun : function(e){e.stopPropagation(); return null;},
+		
+		// #ifdef APP-NVUE
+		weexAnimateIn : function(){
+			graceJS.getRefs('guipopup', this, 0, (guipopupref)=>{
+				animation.transition(guipopupref, {
+					styles: { opacity : 1},
+					duration: 350, //ms
+					timingFunction: 'ease',
+					delay: 0 //ms
+				});
+			});
+			
+			if(this.position == 'center'){
+				graceJS.getRefs('guiPopupCenter', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: { transform:'scale(1)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else if(this.position == 'top'){
+				graceJS.getRefs('guiPopupTop', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateY(0px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else if(this.position == 'bottom'){
+				graceJS.getRefs('guiPopupBottom', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateY(0px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else if(this.position == 'left'){
+				graceJS.getRefs('guiPopupLeft', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateX(0px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else{
+				graceJS.getRefs('guiPopupRight', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateX(0px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}
+			
+		},
+		weexAnimateOut : function(){
+			graceJS.getRefs('guipopup', this, 0, (guipopupref)=>{
+				animation.transition(guipopupref, {
+					styles: { opacity : 0},
+					duration: 350, //ms
+					timingFunction: 'ease',
+					delay: 0 //ms
+				});
+			});
+			
+			if(this.position == 'center'){
+				graceJS.getRefs('guiPopupCenter', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: { transform:'scale(0.3)' },
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else if(this.position == 'top'){
+				graceJS.getRefs('guiPopupTop', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateY(-600px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else if(this.position == 'bottom'){
+				graceJS.getRefs('guiPopupBottom', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateY(600px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else if(this.position == 'left'){
+				graceJS.getRefs('guiPopupLeft', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateX(-500px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}else{
+				graceJS.getRefs('guiPopupRight', this, 0, (guipopupref)=>{
+					animation.transition(guipopupref, {
+						styles: {transform:'translateX(600px)'},
+						duration: 350, //ms
+						timingFunction: 'ease',
+						delay: 0 //ms
+					});
+				});
+			}
+		},
+		// #endif
+	}
+}
+</script>
+<style>
+.gui-popup{width:750rpx; position:fixed; z-index:99999; left:0; top:0; bottom:0; flex:1;}
+.gui-popup-content{overflow:hidden;}
+.gui-fade-out{opacity:0;}
+.gui-popup-center{transform:scale(0.3,0.3);}
+.gui-popup-top{transform:translateY(-1000px);}
+.gui-popup-bottom{transform:translateY(600px);}
+.gui-popup-left{transform:translateX(-600px);}
+.gui-popup-right{transform:translateX(600px);}
+/* #ifndef APP-NVUE */
+.gui-popup{height:100%;}
+/* #endif */
+</style>

+ 45 - 0
lib/GraceUI5/components/gui-product-list.vue

@@ -0,0 +1,45 @@
+<template>
+	<view class="gui-flex gui-rows gui-wrap gui-space-between">
+		<view class="gui-product" hover-class="gui-tap" 
+		v-for="(item, index) in products" :key="index" 
+		@tap="gotoInfo(index, item)"
+		:style="{
+			width  : (375 - margin*2)+'rpx',
+			marginLeft  : margin+'rpx',
+			marginRight : margin+'rpx'}">
+			<view>
+				<gui-image :src="item.img" :width="(375 - margin*2)" :height="imgHeight"></gui-image>
+			</view>
+			<view class="gui-product-lines">
+				<text class="gui-product-name">{{item.name}}</text>
+			</view>
+			<view class="gui-product-lines gui-flex gui-rows gui-nowrap gui-align-items-center">
+				<text class="gui-color-red gui-text-small">¥</text>
+				<text class="gui-h5 gui-color-red">{{item.price}}</text>
+				<text class="gui-text-small gui-color-gray gui-line-through gui-price-margin">{{item.priceMarket}}</text>
+				<text class="gui-text-small gui-color-gray gui-price-margin">{{item.selledNum}}人购买</text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-product-list",
+	props : {
+		products    : {type : Array,  default : function(){return [];}},
+		margin      : {type : Number, default : 15},
+		imgHeight   : {type : Number, default : 345},
+	},
+	methods:{
+		gotoInfo : function (idx, item) {
+			this.$emit('gotoInfo', idx, item);
+		}
+	}
+}
+</script>
+<style>
+.gui-product{margin-bottom:38rpx;}
+.gui-product-lines{margin-top:10rpx;}
+.gui-product-name{font-size:26rpx; line-height:32rpx;}
+.gui-price-margin{margin:0 10rpx;}
+</style>

+ 108 - 0
lib/GraceUI5/components/gui-progress-scrollview.vue

@@ -0,0 +1,108 @@
+<template>
+	<view class="">
+		<scroll-view
+		:scroll-x="true" 
+		class="gui-scroll-x" 
+		@scroll="scrolling" 
+		@scrolltolower="scrolltolower" 
+		@scrolltoupper="scrolltoupper" 
+		:show-scrollbar="false">
+			<slot></slot>
+		</scroll-view>
+		<view class="gui-psv-progress" 
+		v-if="progressWidth > 0" 
+		:style="{
+			width  : progressWidth+'rpx',
+			height : progressHeight+'rpx',
+			borderRadius : progressRadius+'rpx',
+			backgroundColor : progressBG
+		}">
+			<view class="gui-psv-progress-bar" 
+			v-if="progressWidth > 0" 
+			:style="{
+				width  : progressBarWidth+'rpx',
+				height : progressHeight+'rpx',
+				borderRadius : progressRadius+'rpx',
+				backgroundColor : progressBarBG,
+				marginLeft      : marginLeft +'rpx'
+			}"></view>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-progress-scrollview",
+	data() {
+		return {
+			warpWitdh : 350,
+			marginLeft : 0
+		}
+	},
+	props : {
+		width         : {
+			type    : Number,
+			default : 700
+		},
+		progressWidth : {
+			type    : Number,
+			default : 200
+		},
+		progressHeight : {
+			type    : Number,
+			default : 10
+		},
+		progressRadius : {
+			type    : Number,
+			default : 10
+		},
+		progressBG : {
+			type    : String,
+			default : '#D1D1D1'
+		},
+		progressBarWidth : {
+			type    : Number,
+			default : 60
+		},
+		progressBarBG : {
+			type    : String,
+			default : '#008AFF'
+		}
+	},
+	created:function(){
+		this.warpWitdh = uni.upx2px(this.width);
+	},
+	methods:{
+		scrolling : function (event) {
+			let scrollLeft  = event.detail.scrollLeft ;
+			let scrllWidth  = event.detail.scrollWidth - this.warpWitdh;
+			let percentage  = scrollLeft / scrllWidth;
+			percentage      *= 100;
+			percentage      = parseInt(percentage);
+			if(percentage > 90){percentage = 100;}
+			if(percentage < 0){percentage  = 0;}
+			this.percentage = percentage;
+			let marginLeft  = (this.progressWidth - this.progressBarWidth) * this.percentage;
+			this.marginLeft = parseInt(marginLeft / 100);
+			this.$emit('scrolling', scrllWidth, scrollLeft, percentage);
+		},
+		scrolltolower : function () {
+			setTimeout(()=>{
+				this.percentage = 100;
+				this.marginLeft = this.progressWidth - this.progressBarWidth;
+				this.$emit('scrolltolower');
+			},300);
+		},
+		scrolltoupper : function () {
+			setTimeout(()=>{
+				this.percentage = 0;
+				this.marginLeft = 0;
+				this.$emit('scrolltoupper');
+			},300);
+		}
+	} 
+}
+</script>
+<style scoped>
+.gui-psv-progress{background-color:#F8F8F8; border-radius:30rpx;}
+.gui-psv-progress-bar{}
+</style>

+ 83 - 0
lib/GraceUI5/components/gui-radio.vue

@@ -0,0 +1,83 @@
+<template>
+	<view class="gui-flex gui-rows gui-nowrap gui-align-items-center" 
+	:style="{justifyContent:justifyContent}" 
+	@tap.stop="changeStatus">
+		<view 
+		:style="{
+			width:(size+5)+'rpx',
+			height:(size+5)+'rpx', 
+			overflow:'hidden',
+			backgroundColor:status?checkedColor:'',
+			borderRadius:(size)+'rpx' 
+		}">
+			<text v-if="status" 
+			class="gui-radio-btn gui-icons gui-block-text gui-text-center"
+			:style="{
+				fontSize:(size-12)+'rpx', 
+				lineHeight:(size+8)+'rpx', 
+				color : '#FFFFFF',
+			}">&#xe60f;</text>
+			<text v-else
+			class="gui-radio-btn gui-icons gui-block-text gui-text-center" 
+			:style="{
+				fontSize:(size)+'rpx',
+				lineHeight:(size+5)+'rpx', 
+				color : color
+			}">&#xe762;</text>
+		</view>
+		<view class="gui-radio-lable"><slot></slot></view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-radio",
+	props : {
+		size : {
+			type : Number,
+			default : 38
+		},
+		color : {
+			type : String,
+			default : '#EEEEEE'
+		},
+		checked : {
+			type : Boolean,
+			default : false
+		},
+		checkedColor : {
+			type : String,
+			default : '#008AFF'
+		},
+		parameter : {
+			type : Array,
+			default : function () {
+				return []
+			}
+		},
+		justifyContent:{type:String, default:'flex-start'}
+	},
+	data() {
+		return {
+			status : false
+		}
+	},
+	watch: {
+		checked : function (val, old) {
+			this.status = val;
+		}
+	},
+	created : function(){
+		this.status = this.checked;
+	},
+	methods:{
+		changeStatus : function(){
+			this.status = !this.status;
+			this.$emit('change', [this.status, this.parameter]);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-radio-btn{color:#999999;}
+.gui-radio-lable{margin-left:15rpx;}
+</style>

+ 125 - 0
lib/GraceUI5/components/gui-refresh.vue

@@ -0,0 +1,125 @@
+<template>
+	<view 
+	class="gui-page-refresh gui-flex gui-rows gui-justify-content-center gui-align-items-center" 
+	:style="{
+	height:refreshHeight+'px', 
+	backgroundColor:refreshBgColor[refreshStatus]}" 
+	:class="[refreshStatus == 3 ? 'gload-hide' : '']">
+		<text class="gui-page-refresh-icon gui-icons gui-block-text" 
+		v-if="refreshStatus == 0 || refreshStatus == 1" 
+		:style="{
+			fontSize:refreshFontSize,
+			color:refreshColor[refreshStatus]
+		}">&#xe66c;</text>
+		<view class="gui-page-refresh-icon" ref="loadingIcon" v-if="refreshStatus == 2" >
+			<text class="gui-icons gui-rotate360 gui-block-text"
+			:style="{
+				fontSize:refreshFontSize,
+				color:refreshColor[refreshStatus]
+			}">&#xe9db;</text>
+		</view>
+		<text class="gui-page-refresh-icon gui-icons"
+		v-if="refreshStatus == 3" 
+		:style="{
+			fontSize:refreshFontSize,
+			color:refreshColor[refreshStatus]
+		}">&#xe7f8;</text>
+		<text class="gui-page-refresh-text gui-block-text" 
+		:style="{
+			fontSize:refreshFontSize,
+			color:refreshColor[refreshStatus]
+		}">{{refreshText[refreshStatus]}}</text>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+var animation = weex.requireModule('animation');
+const dom = weex.requireModule('dom');
+// #endif
+export default{
+	name  : "gui-refresh",
+	props : {
+		refreshText    : {type:Array,   default:function () {
+			return ['继续下拉刷新','松开手指开始刷新','数据刷新中','数据已刷新'];
+		}},
+		refreshBgColor : {type:Array,   default:function () {
+			return ['#FFFFFF','#FFFFFF','#FFFFFF','#63D2BC'];
+		}},
+		refreshColor : {type:Array,   default:function () {
+			return ['rgba(69, 90, 100, 0.6)','rgba(69, 90, 100, 0.6)','#63D2BC','#FFFFFF'];
+		}},
+		refreshFontSize : {type:String, default:'26rpx'}
+	},
+	data() {
+		return {
+			reScrollTop         : 0,
+			refreshHeight       : 0,
+			refreshY            : 0,
+			refreshStatus       : 0,
+			refreshTimer        : 0
+		}
+	},
+	methods:{
+		touchstart : function (e){
+			if(this.reScrollTop > 10){return ;}
+			this.refreshY = e.changedTouches[0].pageY;
+		},
+		touchmove : function(e){
+			if(this.refreshStatus >= 1){ return null;}
+			if(this.reScrollTop > 10){return ;}
+			var moveY = e.changedTouches[0].pageY - this.refreshY;
+			moveY     = moveY / 2;
+			if(moveY >= 50){
+				moveY = 50;
+				this.refreshStatus = 1;
+			}
+			if(moveY > 15){this.refreshHeight = moveY;}
+		},
+		touchend : function (e) {
+			if(this.reScrollTop > 10){return ;}
+			if(this.refreshStatus < 1){
+				return this.resetFresh();
+			}else if(this.refreshStatus == 1){
+				this.refreshStatus = 2;
+				// #ifdef APP-NVUE
+				setTimeout(()=>{
+					this.rotate360();
+				}, 200);
+				// #endif
+				this.$emit('reload');
+			}
+		},
+		scroll:function(e){
+			this.reScrollTop = e.detail.scrollTop;
+		},
+		endReload : function(){
+			this.refreshStatus = 3;
+			setTimeout(()=>{this.resetFresh()}, 1000);
+		},
+		resetFresh : function () {
+			this.refreshHeight = 0;
+			this.refreshStatus = 0;
+			return null;
+		},
+		rotate360 : function(){
+			var el = this.$refs.loadingIcon;
+			animation.transition(el, {
+				styles     : {transform: 'rotate(7200deg)'},
+				duration   : 20000,
+				timingFunction: 'linear',
+				needLayout :false,
+				delay: 0
+			});
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-page-refresh{overflow:hidden}
+.gui-page-refresh-text{line-height:32rpx;}
+.gui-page-refresh-icon{padding:0 12rpx; line-height:40rpx;}
+/* #ifndef APP-NVUE */
+@keyframes gload-hide{0%{opacity:1; height:50px;} 70%{opacity:1; height:50px;} 100%{opacity:0; height:0px;}}
+.gload-hide{animation:gload-hide 1s linear;}
+/* #endif */
+</style>

+ 74 - 0
lib/GraceUI5/components/gui-right-menus.vue

@@ -0,0 +1,74 @@
+<template>
+	<view class="gui-right-menus" 
+	:style="styles">
+		<view v-if="show" ref="guirightmenu" 
+		class="gui-rt-menus-animate" 
+		:class="[outting ? 'slideOutRight' : 'slideInRight']">
+			<slot name="menus-more"></slot>
+		</view>
+		<view hover-class="gui-tap" @tap.stop="toggle">
+			<slot name="menus-primary"></slot>
+		</view>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const animation = weex.requireModule('animation');
+var graceJS = require('@/GraceUI5/js/grace.js');
+// #endif
+export default{
+	name  : "gui-right-menus",
+	props : {
+		styles:{type:String, default:'right:20rpx; bottom:200rpx; z-index:999; width:100rpx;'},
+	},
+	data() {
+		return {
+			show    : false,
+			outting : false
+		}
+	},
+	methods:{
+		toggle : function () {
+			if(this.show){this.close();}else{this.open();}
+		},
+		open:function () {
+			this.show    = true;
+			this.outting = false;
+			// #ifdef APP-NVUE
+			graceJS.getRefs('guirightmenu', this, 0, (ref)=>{
+				animation.transition(ref, {
+					styles         : { transform:'translateX(0px)' },
+					duration       : 200, //ms
+					timingFunction : 'ease',
+					delay          : 0 //ms
+				});
+			});
+			// #endif
+		},
+		close : function () {
+			this.outting  = true;
+			setTimeout(()=>{ this.show = false; }, 200);
+			// #ifdef APP-NVUE
+			graceJS.getRefs('guirightmenu', this, 0, (ref)=>{
+				animation.transition(ref, {
+					styles         : { transform:'translateX(100px)' },
+					duration       : 200, //ms
+					timingFunction : 'ease',
+					delay          : 0 //ms
+				});
+			});
+			// #endif
+		}
+	}
+}
+</script>
+<style scoped>
+/* #ifndef APP-NVUE */
+@import "@/GraceUI5/css/animate.css";
+.gui-rt-menus-animate{animation-duration:200ms; animation-timing-function:linear;}
+/* #endif */
+/* #ifdef APP-NVUE */
+.gui-rt-menus-animate{transform:translateX(100px);}
+/* #endif */
+.gui-right-menus{position:fixed;}
+</style>

+ 213 - 0
lib/GraceUI5/components/gui-schedule.vue

@@ -0,0 +1,213 @@
+<template>
+	<view class="gui-schedule-wrap">
+		<view class="gui-flex gui-rows gui-space-between gui-align-items-center">
+			<picker  mode="date" 
+			:value="currentDayIn" 
+			:start="startDate" 
+			:end="endDate" 
+			@change="selectDate">
+				<text 
+				class="gui-schedule-header-date gui-icons">{{cYear}} 年 {{cMonthStr}} 月 &#xe603;</text>
+			</picker>
+			<text class="gui-border gui-schedule-today" @tap="gotoToday">返回今天</text>
+		</view>
+		<view class="gui-flex gui-rows gui-nowrap">
+			<text class="gui-schedule-weeks gui-color-gray gui-block-text" 
+			v-for="(item, index) in weeks" :key="index">{{item}}</text>
+		</view>
+		<view class="gui-flex gui-rows gui-wrap">
+			<view class="gui-schedule-7item gui-flex gui-rows gui-justify-content-center"
+			v-for="(item, index) in days" :key="index">
+				<view 
+				class="gui-date-ditems gui-flex gui-columns gui-justify-content-center" 
+				v-if="item != ''" 
+				:style="{
+					backgroundColor:currentDayIn == cYear+'-'+cMonthStr+'-'+ item.date 
+					? activeBgColor : bgColor
+				}" 
+				@click="chooseDate(cYear+'-'+cMonthStr+'-'+item.date, item.date)">
+					<text class="gui-date-day gui-block-text" 
+					:class="[currentDayIn == (cYear+'-'+cMonthStr+'-'+item.date) ? 
+					'gui-d-current-txt' : '']">{{item.date}}</text>
+					<text class="gui-date-nl gui-block-text" v-if="isLunar" 
+					:class="[currentDayIn == (cYear+'-'+cMonthStr+'-'+item.date) ? 
+					'gui-d-current-txt' : '']">{{item.nl}}</text>
+					<view class="gui-schedule-point" 
+					v-if="item.haveSe" 
+					:style="{backgroundColor:pointColor}"></view>
+				</view>
+				<view class="gui-date-ditems" v-else style="background-color:none;"></view>
+			</view>
+		</view>
+		<view class="gui-border-b gui-schedule-line"></view>
+		<view class="gui-schedule-time-list-wrap">
+			<view class="gui-schedule-time-list gui-flex gui-rows gui-nowrap"
+			v-for="(item, index) in hours" :key="index">
+				<text class="gui-schedule-timer gui-block-text gui-color-gray">{{item}}:00</text>
+				<view class="gui-border-b gui-schedule-body gui-flex gui-columns">
+					<text class="gui-schedules gui-block-text" 
+					v-for="(schedule, idx) in schedulesIn[index]" :key="idx" 
+					@tap="scheduleTap" :data-id="schedule.id" 
+					:style="{
+						backgroundColor:schedule.bgColor, 
+						color:schedule.color}">{{schedule.content}}</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+import guiCalendar from './gui-calendar.js';
+export default{
+	name : "gui-schedule",
+	data() {
+		return {
+			cYear      : 2020,
+			cMonth     : 1,
+			cDay       : 10,
+			cMonthStr  : '01',
+			weeks      : ['一', '二', '三', '四', '五', '六', '日'],
+			days       : [],
+			currentDayIn : '',
+			hours      : ['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'],
+			schedulesIn: [] 
+		}
+	},
+	props:{
+		// 当前默认日期
+		currentDate   : {type:String, default:""},
+		bgColor       : {type:String, default:"#F8F8F8"},
+		activeBgColor : {type:String, default:"#008AFF"},
+		isLunar       : {type:Boolean, default:true },
+		startDate     : {type:String, default:'1950-01-01'},
+		endDate       : {type:String, default:'2050-01-01'},
+		schedules     : {type:Array, default:function () {return []}},
+		pointColor    : {type:String, default:"#FF0036"}
+	},
+	created:function(){
+		this.currentDayIn = this.currentDate;
+		this.initTime();
+		this.getSchedulesIn();
+	},
+	methods:{
+		initTime : function(){
+			if(this.currentDayIn == ''){
+				var dateObj        = new Date();
+				this.cYear         = Number(dateObj.getFullYear());
+				this.cMonth        = Number(dateObj.getMonth() + 1);
+				this.cMonthStr     = this.cMonth < 10 ? '0' + this.cMonth : this.cMonth;
+				this.cDay          = dateObj.getDate();
+				this.cDay          = this.cDay < 10 ? '0' + this.cDay : this.cDay;
+				this.currentDayIn  = this.cYear + '-' + this.cMonthStr + '-' + this.cDay;
+				this.changeMonth();
+			}else{
+				var dates          = this.currentDayIn.split(' ');
+				if (!dates[1]) { dates[1] = '';}
+				var dayArr         = dates[0].split('-');
+				this.cYear         = Number(dayArr[0]);
+				this.cMonth        = dayArr[1];
+				this.cDay          = dayArr[2];
+				var reg            = new RegExp('^0[0-9]+$');
+				if(reg.test(this.cMonth)){this.cMonth = this.cMonth.substr(1,1);}
+				this.cMonth        = Number(this.cMonth);
+				this.cMonthStr     = this.cMonth < 10 ? '0'+this.cMonth : this.cMonth;
+				this.currentDayIn  = dates[0];
+				this.currentTimeIn = dates[1];
+				this.changeMonth();
+			}
+		},
+		changeMonth:function(){
+			var daysList  = [];
+			var days      = this.getDaysInOneMonth();
+			var startWeek = this.getDay();
+			var forSteps  = 0;
+			for (var i = (0 - startWeek); i < days; i++){
+				if(i >= 0){
+					daysList[forSteps] = {date : i >= 9 ? i + 1 : '0' + (i+1), nl : ''};
+					daysList[forSteps].nl = guiCalendar.getLunarInfo(this.cYear, this.cMonth, i + 1);
+					daysList[forSteps].haveSe = this.haveSchedule(daysList[forSteps].date);
+				}else{
+					daysList[forSteps] = '';
+				}
+				forSteps++;
+			}
+			this.days    = daysList;
+		},
+		haveSchedule : function (day) {
+			var cDay = this.cYear+'-'+this.cMonthStr+'-'+day;
+			for(let i = 0; i < this.schedules.length; i++){
+				if(this.schedules[i].datetime.indexOf(cDay) != -1){
+					return true;
+				}
+			}
+			return false;
+		},
+		getDaysInOneMonth : function (){
+			var d = new Date(this.cYear, this.cMonth, 0);
+			return d.getDate();
+		},
+		getDay : function (){
+			var d = new Date(this.cYear, this.cMonth - 1, 0);
+			return d.getDay();
+		},
+		selectDate : function(e){
+			this.currentDayIn = e.detail.value;
+			this.initTime();
+			this.getSchedulesIn();
+			this.$emit('selectDate', e.detail.value);
+		},
+		chooseDate: function (sedDate) {
+			this.currentDayIn = sedDate;
+			this.getSchedulesIn();
+			this.$emit('chooseDate', sedDate);
+		},
+		getSchedulesIn : function (){
+			var res = [];
+			for(let i = 0; i < this.hours.length; i++){
+				var ctime = this.currentDayIn + ' ' + this.hours[i] + ':00';
+				res.push([]);
+				for(let ii = 0; ii < this.schedules.length; ii++){
+					if(this.schedules[ii].datetime == ctime){
+						res[i].push(this.schedules[ii]);
+					}
+				}
+			}
+			this.schedulesIn = res;
+		},
+		scheduleTap : function (e) {
+			var id = e.currentTarget.dataset.id;
+			this.$emit('scheduleTap', id);
+		},
+		gotoToday : function(){
+			var dateObj        = new Date();
+			this.cYear         = Number(dateObj.getFullYear());
+			this.cMonth        = Number(dateObj.getMonth() + 1);
+			this.cMonthStr     = this.cMonth < 10 ? '0' + this.cMonth : this.cMonth;
+			this.cDay          = dateObj.getDate();
+			this.cDay          = this.cDay < 10 ? '0' + this.cDay : this.cDay;
+			this.currentDayIn  = this.cYear + '-' + this.cMonthStr + '-' + this.cDay;
+			this.changeMonth();
+			this.getSchedulesIn();
+			this.$emit('gotoToday', this.currentDayIn);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-schedule-wrap{width:690rpx;}
+.gui-schedule-header-date{height:88rpx; line-height:88rpx; color:#2B2E3D; font-size:32rpx;}
+.gui-schedule-7item{width:98rpx; margin-bottom:22rpx; position:relative;}
+.gui-schedule-weeks{width:98rpx; height:88rpx; font-size:26rpx; line-height:88rpx; text-align:center;}
+.gui-date-ditems{width:82rpx; height:82rpx; border-radius:80rpx;}
+.gui-d-current-txt{color:#FFFFFF !important;}
+.gui-date-day{height:32rpx; line-height:32rpx; text-align:center; font-size:28rpx;}
+.gui-date-nl{height:24rpx; line-height:26rpx; color:#888888; font-size:20rpx; text-align:center;}
+.gui-schedule-line{height:20rpx; border-color:#F8F8F8;}
+.gui-schedule-time-list{margin-top:20rpx;}
+.gui-schedule-timer{width:88rpx; font-size:22rpx; line-height:36rpx;}
+.gui-schedule-body{width:200rpx; flex:1; border-color:#F8F8F8; margin-top:15rpx;}
+.gui-schedules{padding:10rpx; line-height:30rpx; font-size:22rpx; margin-top:15rpx; border-radius:8rpx;}
+.gui-schedule-time-list-wrap{padding:20rpx;}
+.gui-schedule-today{line-height:50rpx; height:50rpx; font-size:22rpx; color:#828282; padding-left:20rpx; padding-right:20rpx; border-color:#F1F2F3;}
+.gui-schedule-point{width:18rpx; height:18rpx; border-radius:10rpx; background-color:#FF0036; position:absolute; right:6rpx; top:6rpx;}
+</style>

+ 70 - 0
lib/GraceUI5/components/gui-scroll-message.vue

@@ -0,0 +1,70 @@
+<template>
+	<view class="gui-scroll-body gui-flex gui-rows gui-nowrap">
+		<!-- #ifdef APP-NVUE -->
+		<view class="gui-scroll-msg gui-scrolling" 
+		ref="guiscrollbody">
+			<slot></slot>
+		</view>
+		<!-- #endif -->
+		<!-- #ifndef APP-NVUE -->
+		<view class="gui-scroll-msg gui-scrolling" 
+		:style="{'animation-duration':speed+'s'}">
+			<slot></slot>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const BindingX = uni.requireNativePlugin('bindingx');
+// #endif
+export default {
+	name  : "gui-scroll-message",
+	props : {
+		speed    : {type:Number, default:12},
+		distance : {type:Number, default:1200}
+	},
+	data() {
+		return {
+			BindingXObj : {},
+			AnimateObj  : 0
+		}
+	},
+	// #ifdef APP-NVUE
+	mounted:function(){
+		setTimeout(()=>{
+			this.BindingXObj = this.$refs.guiscrollbody.ref;
+			this.animationL();
+		}, 100);
+	},
+	methods:{
+		animationL : function(){
+			this.AnimateObj = BindingX.bind({
+				eventType      : 'timing',
+				exitExpression : 't>'+(this.speed*1000),
+				props          : [
+				  {
+					element    : this.BindingXObj, 
+					property   : 'transform.translateX',
+					expression : "500+(-"+this.distance+")*t/"+(this.speed*1000)
+				  }
+				]
+			}, (e)=>{
+				if(e.state === 'exit') {
+					setTimeout(()=>{
+						this.animationL();
+					},100);
+				}
+			});
+		}
+	}
+	// #endif
+}
+</script>
+<style scoped>
+.gui-scroll-body{overflow:hidden;}
+/* #ifndef APP-NVUE */
+.gui-scrolling{animation:graceScrollingx 12s linear infinite;}
+@keyframes graceScrollingx{ 0% { transform:translateX(60%); } 100% { transform: translateX(-100%); }}
+/* #endif */
+</style>

+ 113 - 0
lib/GraceUI5/components/gui-scrollitems-y.vue

@@ -0,0 +1,113 @@
+<template>
+	<scroll-view :scroll-y="!animating" 
+	:scroll-top="sctop" @scroll="scrolling" 
+	:scroll-with-animation="true" 
+	:show-scrollbar="false" 
+	:style="{height:height}">
+		<view class="gui-scrollitemsy gui-flex gui-rows gui-nowrap gui-space-between" 
+		hover-class="gui-tap" 
+		v-for="(item, idx) in itemsIn" :key="idx" 
+		:class="[ animating && idx == 0 ? 'gui-scrollitemsy-animate' : '']" 
+		:style="{opacity:animating && idx == 0 ? 0 : 1}" 
+		@touchstart="touchstart" @touchend="touchend" 
+		@tap="itemTap(idx)" ref="scitems">
+			<image 
+			:src="item.img" 
+			:style="imgStyle"></image>
+			<view class="gui-scrollitemsy-body" 
+			:style="{width:msgWidth}">
+				<text class="gui-block-text" 
+				:style="textStyle">{{item.desc}}</text>
+			</view>
+		</view>
+	</scroll-view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const animation = weex.requireModule('animation');
+// #endif
+export default{
+	name  : "gui-scrollitems-y",
+	props : {
+		height    : {type : String, default : '480rpx'},
+		imgStyle  : {type : String, default : 'width:88rpx; height:88rpx; border-radius:6rpx; margin-top:5rpx; margin-right:28rpx;'},
+		textStyle : {type : String, default : 'font-size:28rpx; color:#2B2E3D; line-height:38rpx;'},
+		items     : {type : Array,  default : function(){return [];}},
+		msgWidth : {type : String,  default :'570rpx'},
+		duration  : {type : Number, default : 6000}
+	},
+	data() {
+		return {
+			timer      : null,
+			timer2     : null,
+			timer3     : null,
+			animating  : false,
+			itemsIn    : [],
+			sctop      : 0
+		}
+	},
+	created:function(){
+		this.itemsIn = this.items;
+		this.timer   = setTimeout(() => {this.animate();}, this.duration);
+	},
+	methods:{
+		animate : function(){
+			this.sctop     = 0;
+			var tmp        = this.itemsIn.pop();
+			this.items.unshift(tmp);
+			this.animating = true;
+			// #ifdef APP-NVUE
+			setTimeout(() => {this.animateforweex();}, 200);
+			// #endif
+			setTimeout(()=>{ this.animating = false; }, 600);
+			this.timer = setTimeout(() => {
+				this.animate();
+			}, this.duration);
+		},
+		touchstart : function(){
+			clearTimeout(this.timer);
+		},
+		touchend : function(){
+			clearTimeout(this.timer2);
+			this.timer2 = setTimeout(()=>{
+				this.sctop = 0;
+				setTimeout(()=>{this.animate();}, 1000)
+			}, 3000);
+		},
+		scrolling : function (e) {
+			clearTimeout(this.timer3);
+			this.timer3 = setTimeout(()=>{
+				this.sctop = e.detail.scrollTop;
+			},200);
+		},
+		itemTap : function(idx){
+			this.$emit('itemTap', this.itemsIn[idx]);
+		},
+		addItem : function(obj){
+			clearTimeout(this.timer);
+			clearTimeout(this.timer2);
+			this.itemsIn.push(obj);
+			setTimeout(()=>{ this.sctop = 0; }, 500);
+			setTimeout(()=>{ this.animate(); }, 1000);
+		},
+		animateforweex : function () {
+			var ref = this.$refs.scitems[0];
+			animation.transition(ref, {
+				styles: {opacity:1},
+				duration: 300, //ms
+				timingFunction: 'ease',
+				delay: 0 //ms
+			});
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-scrollitemsy{margin-bottom:30rpx;}
+.gui-scrollitemsy-body{overflow:hidden;}
+
+/* #ifndef APP-NVUE */
+@keyframes gui-scrollitemsy-animate{0%{height:0;} 100%{height:100rpx;}}
+.gui-scrollitemsy-animate{animation:gui-scrollitemsy-animate 500ms ease-in; }
+/* #endif */
+</style>

+ 102 - 0
lib/GraceUI5/components/gui-scrollitems.vue

@@ -0,0 +1,102 @@
+<template>
+	<view :style="{width:width+'rpx', overflow:'hidden'}">
+		<gui-touch @thStart="thStart" @thMove="thMove" @thEnd="thEnd">
+			<view class="gui-flex gui-rows gui-nowrap" 
+			:style="{
+			width:wrapWidth+'px',
+			transform:'translateX('+scLeft+'px)'
+			}">
+				<view class="gui-scrollitems gui-img-in" 
+				hover-class="gui-tap" 
+				:style="{
+				width:itemWidth+'rpx', 
+				height:itemHeight+'rpx', 
+				marginRight:itemMargin+'rpx'}" 
+				v-for="(item, idx) in itemsIn" :key="idx" 
+				@tap="tapme(idx)">
+					<image class="gui-scroll-image" 
+					:style="{
+					width:itemWidth+'rpx', 
+					height:itemHeight+'rpx'}" 
+					:src="item.img"></image>
+					<text 
+					class="gui-scrollitems-title gui-block-text gui-bg-black-opacity3 gui-border-box" 
+					:style="{width:width+'rpx'}">{{item.title}}</text>
+				</view>
+			</view>
+		</gui-touch>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-scrollitems",
+	props : {
+		width         : {type : Number, default:690},
+		itemWidth     : {type : Number, default:345},
+		itemHeight    : {type : Number, default:200},
+		itemMargin    : {type : Number, default:10},
+		items         : {type : Array,  default:function(){return [];}},
+		duration      : {type : Number, default:25}
+	},
+	data() {
+		return {
+			scLeft        : 0,
+			resetWidth    : 0,
+			itemsIn       : [],
+			timer         : null,
+			timer2        : null,
+			speed         : 1,
+			timer3        : null,
+			wrapWidth     : 5000,
+			oX            : 0
+		}
+	},
+	created:function(){
+		var len          = this.items.length;
+		this.itemsIn     = this.items;
+		this.resetWidth  = len * (this.itemWidth + this.itemMargin);
+		this.resetWidth  = uni.upx2px(this.resetWidth);
+		this.resetWidth *= -1;
+		this.itemsIn     = this.itemsIn.concat(this.items);
+		this.wrapWidth   = len * (this.itemWidth + this.itemMargin) * 2 + 80;
+		this.scrollAnimate();
+	},
+	methods:{
+		scrollAnimate : function () {
+			if(this.scLeft <= this.resetWidth){
+				this.scLeft = 0;
+				this.timer = setTimeout(()=>{this.scrollAnimate()}, this.duration+200);
+			}else{
+				this.scLeft -= this.speed
+				this.timer   = setTimeout(()=>{this.scrollAnimate()}, this.duration);
+			}
+		},
+		thStart : function(e){
+			clearTimeout(this.timer);
+			this.timer = null;
+			this.oX    = this.scLeft;
+		},
+		thMove : function (e){
+			clearTimeout(this.timer);
+			var tmpleft   = this.oX + e[0][0];
+			if(tmpleft < this.resetWidth){ tmpleft = this.resetWidth;}
+			if(tmpleft > 0){tmpleft = 0}
+			this.scLeft   = tmpleft;
+		},
+		thEnd : function(e){
+			this.timer = null
+			if(this.timer3 != null){clearTimeout(this.timer3);}
+			this.timer3 = setTimeout(()=>{
+				this.scrollAnimate();
+			}, 500);
+		},
+		tapme : function(idx){
+			this.$emit('itemTap', this.itemsIn[idx]);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-scrollitems{overflow:hidden; position:relative;}
+.gui-scrollitems-title{position:absolute; z-index:1; left:0; bottom:0; height:44rpx; line-height:44rpx; padding:0 15rpx; overflow:hidden; font-size:22rpx; color:#FFFFFF;}
+</style>

+ 95 - 0
lib/GraceUI5/components/gui-search.vue

@@ -0,0 +1,95 @@
+<template>
+	<view class="gui-flex gui-rows gui-nowrap gui-align-items-center" 
+	:style="{
+		height:height, 
+		backgroundColor:background,
+		borderRadius:borderRadius
+		}">
+		<text class="gui-search-icon gui-icons gui-block-text gui-text-center" @tap.stop="tapme" 
+		:style="{
+			color:iconColor, 
+			fontSize:iconFontSize, 
+			lineHeight:height, width:iconWidth
+		}">&#xe604;</text>
+		
+		<input type="text" :placeholder-class="placeholderClass" 
+		class="gui-search-input gui-flex1" :placeholder="placeholder" 
+		v-model="inputVal" v-if="!disabled" :focus="focus" 
+		:style="{
+			height:inputHeight, 
+			lineHeight:inputHeight, 
+			fontSize:inputFontSize, 
+			color:inputColor
+		}" 
+		@input="inputting" @confirm="confirm" confirm-type="search" />
+		
+		<text class="gui-search-input gui-flex1 gui-block-text" 
+		v-if="disabled" @tap.stop="tapme" 
+		:style="{
+			height:inputHeight, 
+			lineHeight:inputHeight, 
+			fontSize:inputFontSize, 
+			color:iconColor}">{{placeholder}}</text>
+		<text class="gui-search-icon gui-icons gui-block-text gui-text-center" 
+		v-if="inputVal.length > 0" @tap.stop="clearKwd" 
+		:style="{
+			color:iconColor, 
+			fontSize:iconFontSize, 
+			lineHeight:height, 
+			width:iconWidth}">&#xe78a;</text>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-search",
+	props : {
+		height:{type:String, default:'66rpx'},
+		background:{type:String, default:'#FFFFFF'},
+		fontSize:{type:String, default:'28rpx'},
+		iconWidth:{type:String, default:'70rpx'},
+		iconColor:{type:String, default:'#A5A7B2'},
+		iconFontSize:{type:String, default:'30rpx'},
+		inputHeight:{type:String, default:'30rpx'},
+		inputFontSize:{type:String, default:'26rpx'},
+		inputColor:{type:String, default:'#323232'},
+		placeholder:{type:String, default:'关键字'},
+		placeholderClass:{type:String, default:''},
+		kwd:{type:String, default:''},
+		borderRadius:{type:String, default:'66rpx'},
+		disabled:{type:Boolean, default:false},
+		focus:{type:Boolean, default:false}
+	},
+	data() {
+		return {
+			inputVal : ''
+		}
+	},
+	created: function (){
+		this.inputVal = this.kwd;
+	},
+	watch:{
+		kwd : function(val, vo){
+			this.inputVal = val;
+		}
+	},
+	methods:{
+		clearKwd : function () {
+			this.inputVal = '';
+			this.$emit('clear', '');
+		},
+		inputting : function(e){
+			this.$emit('inputting', e.detail.value);
+		},
+		confirm : function (e) {
+			this.$emit('confirm', e.detail.value);
+			uni.hideKeyboard();
+		},
+		tapme : function () {
+			this.$emit('tapme')
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-search-input{width:100rpx; margin:0 10rpx; border-width:0rpx; padding:0; background-color:rgba(255,255,255,0);}
+</style>

+ 47 - 0
lib/GraceUI5/components/gui-segmented-control.vue

@@ -0,0 +1,47 @@
+<template>
+	<view class="gui-flex gui-rows gui-nowrap gui-justify-content-center gui-segmented-control" 
+	:style="{borderRadius:borderRadius}">
+		<text v-for="(item, index) in items" :key="index" 
+		:class="['gui-segmented-control-item','gui-block-text',
+		index == currentIn ? 'gui-segmented-current':'',
+		index == currentIn ? 'gui-fade-in':'']" 
+		:style="{borderRadius:borderRadius}" 
+		@tap.stop="changeSC" :data-index="index">{{item}}</text>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-segmented-control",
+	props : {
+		items : {
+			type : Array,
+			default : function () { return new Array();}
+		},
+		current : { type : Number, default : 0},
+		borderRadius:{type:String, default:'6rpx'}
+	},
+	data() {
+		return {
+			currentIn: 0
+		}
+	},
+	created: function(){
+		this.currentIn = this.current;
+	},
+	watch:{
+		current : function (val) {
+			this.currentIn = val;
+		}
+	},
+	methods:{
+		changeSC:function (e) {
+			var index = Number(e.currentTarget.dataset.index);
+			this.currentIn = index;
+			this.$emit('change', index);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-segmented-control-item{width:50rpx; flex:1; text-align:center;}
+</style>

+ 103 - 0
lib/GraceUI5/components/gui-select-list.vue

@@ -0,0 +1,103 @@
+<template>
+	<view class="gui-select-list">
+		<view v-for="(item, index) in dataIn" 
+		:key="index" class="gui-select-list-item gui-flex gui-rows gui-nowrap gui-align-items-center" 
+		:data-index="index" @tap.stop="choose">
+			<text class="gui-select-list-icon gui-icons gui-block-text gui-select-list-ring gui-select-list-icon-l"
+			v-if="checkedType == 'ring' && !item.checked">&#xe762;</text>
+			<text class="gui-select-list-icon gui-icons gui-block-text gui-select-list-ring gui-select-list-icon-l gui-fade-in gui-select-list-current"
+			v-if="checkedType == 'ring' && item.checked">&#xe685;</text>
+			<image  :src="item.img" class="gui-select-list-img" v-if="item.img" mode="widthFix"></image>
+			<view class="gui-select-list-body gui-flex gui-rows gui-nowrap gui-align-items-center" 
+			:class="[isBorder?'gui-border-b' : '']" :style="{borderColor:borderColor}">
+				<view class="gui-select-list-content">
+					<text class="gui-block-text gui-select-list-title">{{item.title}}</text>
+					<text class="gui-select-list-desc gui-block-text" v-if="item.desc">{{item.desc}}</text>
+				</view>
+				<text class="gui-icons gui-block-text gui-select-list-icon gui-select-list-current" 
+				:class="[item.checked ? 'gui-fade-in gui-select-list-current' : '']" 
+				v-if="item.checked && checkedType == 'right'">&#xe60f;</text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-select-list",
+	props : {
+		items           : {type : Array,   default : function(){return [];}},
+		type            : {type : String,  default : "radio"},
+		checkedType     : {type : String,  default : 'right'},
+		isBorder        : {type : Boolean, default : true},
+		borderColor     : {type : String,  default : "#F6F6F6"},
+		maxSize         : {type : Number,  default : 0}
+	},
+	data() {
+		return {
+			dataIn :  []
+		}
+	},
+	created : function(){
+		this.dataIn = this.items;
+	},
+	watch : {
+		items : function(val){ this.dataIn = val;}
+	},
+	methods : {
+		// 获取选中数据的索引
+		getSelectedIndex : function(){
+			var tmpArr = [];
+			this.dataIn.forEach((item, idx)=>{
+				if(item.checked){
+					tmpArr.push(idx);
+				}
+			});
+			return tmpArr;
+		},
+		// 选择数据
+		choose : function(e){
+			var index = e.currentTarget.dataset.index;
+			if(this.type == 'radio'){
+				if(this.dataIn[index].checked){
+					this.dataIn[index].checked = false;
+					this.$emit('change', -1);
+				}else{
+					for(let i = 0; i < this.dataIn.length; i++){
+						this.dataIn[i].checked = false;
+					}
+					this.dataIn[index].checked = true;
+					this.$emit('change', index);
+				}
+			}else{
+				if(this.dataIn[index].checked){
+					this.dataIn[index].checked = false;
+				}else{
+					if(this.maxSize > 0){
+						var size = 0;
+						this.dataIn.forEach((item)=>{
+							if(item.checked){size++;}
+						});
+						size++;
+						if(size > this.maxSize){this.$emit('maxSed'); return ;}
+					}
+					this.dataIn[index].checked = true;
+				}
+				var sedArr = [];
+				for(let i = 0; i < this.dataIn.length; i++){
+					if(this.dataIn[i].checked){
+						sedArr.push(i);
+					}
+				}
+				this.$emit('change', sedArr);
+			}
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-select-list-item{font-size:0;}
+.gui-select-list-icon{margin-left:10rpx;}
+.gui-select-list-icon-l{margin-left:0; margin-right:10rpx;}
+.gui-select-list-body{width:100rpx; flex:1;}
+.gui-select-list-content{width:200rpx; flex:1; overflow:hidden; padding:25rpx 0;}
+</style>

+ 168 - 0
lib/GraceUI5/components/gui-select-menu.vue

@@ -0,0 +1,168 @@
+<template>
+	<view class="gui-select-menu-wrap">
+		<!-- #ifndef APP-NVUE -->
+		<view class="gui-masker" 
+		v-if="show"
+		@tap.stop.prevent="close" 
+		@touchmove.stop.prevent="stopfun" 
+		:style="{zIndex:(zIndex-1)}" ></view>
+		<!-- #endif -->
+		<view class="gui-select-menu-title gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center" 
+		@click.stop="showMenu" 
+		id="menuMain">
+			<text class="gui-block-text gui-ellipsis" 
+			:style="{
+				fontSize:fontSize, 
+				color:titleColor
+			}">{{itemsIn[currentIndex]}}</text>
+			<text :style="{fontSize:fontSize, color:iconColor}" 
+			class="gui-icons gui-select-menu-title-icon gui-block-text" 
+			v-if="!show">&#xe603;</text>
+			<text :style="{fontSize:fontSize, color:iconColor}" 
+			class="gui-icons gui-select-menu-title-icon gui-block-text" 
+			v-if="show">&#xe654;</text>
+		</view>
+		<view class="gui-select-menu" 
+		v-if="show" 
+		:style="{top : top +'px', height:height, zIndex:zIndex}" 
+		@tap.stop="close" 
+		@touchmove.stop.prevent="stopfun">
+			<scroll-view :scroll-y="true" 
+			:show-scrollbar="false" 
+			:style="{height:height, marginTop:'100rpx'}" 
+			class="gui-select-menus gui-border-box">
+				<view @tap.stop="stopfun" 
+				class="gui-select-item gui-flex gui-rows gui-nowrap gui-align-items-center gui-bg-gray" 
+				v-if="isInput">
+					<input type="text" 
+					v-model="inputVal" 
+					class="gui-select-input gui-flex1 gui-border-box"
+					@confirm="addTag" 
+					:placeholder="placeholder" />
+					<text class="gui-select-input-btn gui-block-text" 
+					:style="{color:activeColor}" 
+					@tap.stop="addTag">{{addBtnName}}</text>
+				</view>
+				<view class="gui-select-item gui-flex gui-rows gui-nowrap gui-align-items-center gui-bg-white" 
+				v-for="(item, index) in itemsIn" :key="index" 
+				:class="[index < getSize() ?'gui-border-b':'']" 
+				:data-index="index" 
+				@tap.stop="select">
+					<text class="gui-selected-icon gui-icons" 
+					:style="{
+						color : index == currentIndex ? activeColor : color, 
+						fontSize:fontSize
+					}" 
+					v-if="index == currentIndex">&#xe7f8;</text>
+					<text :style="{
+						fontSize:fontSize, 
+						color : index == currentIndex ? activeColor : color
+					}">{{item}}</text>
+				</view>
+				<view style="height:25rpx;" class="gui-bg-white"><text> </text></view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+<script scoped>
+export default {
+	name  : "gui-select-menu",
+	props : {
+		items          : { type : Array,   default : function () { return [] } },
+		titleColor     : { type : String,  default : "#2B2E3D" },
+		color          : { type : String,  default : "#2B2E3D" },
+		iconColor      : { type : String,  default : "rgba(69, 90, 100, 0.3)"},
+		activeColor    : { type : String,  default : "#008AFF" },
+		selectIndex    : { type : Number,  default : 0},
+		isH5header     : { type : Boolean, default : true },
+		fontSize       : { type : String,  default : '28rpx' },
+		zIndex         : { type : Number,  default : 9999 },
+		isInput        : { type : Boolean, default : false},
+		placeholder    : { type : String,  default : "请输入自定义条件"},
+		addBtnName     : { type : String,  default :"+ 添加"},
+		height         : { type : String,  default : '600rpx'}
+	},
+	data() {
+		return {
+			currentIndex : 0,
+			top          : 0,
+			showRes      : [],
+			inputVal     : '',
+			show         : false,
+			itemsIn      : []
+		}
+	},
+	watch:{
+		selectIndex : function () {
+			this.currentIndex = this.selectIndex;
+		},
+		items : function (val) {
+			this.itemsIn = val;
+		}
+	},
+	created : function () {
+		this.currentIndex = this.selectIndex;
+		this.itemsIn      = this.items;
+	},
+	methods:{
+		stopfun  : function (e) {e.stopPropagation(); return ;},
+		showMenu : function () {
+			uni.createSelectorQuery().in(this).select('#menuMain').fields(
+				{rect: true}, (res) => {
+					this.top       = res.top;
+					// #ifdef H5
+					if(this.isH5header){
+						this.top      += 44;
+					}
+					// #endif
+					this.show = true;
+					this.$emit('showMenu');
+				}
+			).exec();
+		},
+		close : function(){
+			setTimeout(()=>{this.show = false;}, 100);
+			this.$emit('close');
+		},
+		select : function(e){
+			var index = Number(e.currentTarget.dataset.index);
+			this.currentIndex = index;
+			this.$emit('select', index, this.items[index]);
+			this.close();
+		},
+		addTag : function () {
+			if(this.inputVal == ''){return ;}
+			var newArr   = JSON.stringify(this.itemsIn);
+			newArr       = JSON.parse(newArr);
+			newArr.unshift(this.inputVal);
+			this.itemsIn = [];
+			this.itemsIn = newArr;
+			 //newArr;
+			this.$emit('submit', this.inputVal);
+			this.inputVal = '';
+			this.close();
+		},
+		getSize : function(){
+			return (this.itemsIn.length - 1);
+		},
+		setCurrentIndex : function (index) {
+			this.currentIndex = index;
+		}
+	}
+}
+</script>
+<style scoped>
+/* #ifndef APP-NVUE */
+@import "@/GraceUI5/css/animate.css";
+.animate{animation-duration:200ms; animation-timing-function:linear;}
+/* #endif */
+.gui-masker{width:750rpx; position:fixed; left:0; top:250rpx; bottom:0; flex:1; background-color:rgba(0,0,0,0.3);}
+.gui-select-menu-title{height:100rpx;}
+.gui-select-menu-title-icon{margin-left:5px; margin-top:3px;}
+.gui-select-menu{position:fixed; width:750rpx; left:0; top:0;}
+.gui-select-menus{ height:300px;}
+.gui-select-item{padding:0 25rpx; height:88rpx;}
+.gui-selected-icon{margin-right:15rpx;}
+.gui-select-input{line-height:60rpx; height:100rpx; width:200rpx; padding:20rpx 0; font-size:26rpx; background-color:rgba(0,0,0,0);}
+.gui-select-input-btn{width:120rpx; line-height:60rpx; height:60rpx; text-align:center; font-size:24rpx; border-radius:6rpx;}
+</style>

+ 132 - 0
lib/GraceUI5/components/gui-single-slider.vue

@@ -0,0 +1,132 @@
+<template>
+	<view class="gui-sg-slider" 
+	@touchstart="touchstart" 
+	@touchmove.stop.prevent="touchmove" 
+	@touchend="touchend" 
+	ref="gracesgslider" 
+	id="gracesgslider" 
+	:style="{height:barHeight+'rpx'}">
+		<view class="gui-sg-slider-line" 
+		:style="{
+			height:bglineSize+'rpx', backgroundColor:bglineColor, 
+			marginTop:((barHeight - bglineSize) / 2)+'rpx', 
+			borderRadius:borderRadius}"></view>
+		<view class="gui-sg-slider-a-line" 
+		:style="{
+			width:(left+25)+'px', 
+			top:((barHeight - bglineSize) / 2)+'rpx', 
+			backgroundColor:bglineAColor, 
+			height:bglineSize+'rpx', 
+			borderRadius:borderRadius}"></view>
+		<text class="gui-sg-slider-bar gui-block-text"
+		:style="{
+			width:barWidth+'rpx', height:barHeight+'rpx', 
+			'line-height':barHeight+'rpx', 
+			backgroundImage:barBgColor, 
+			color:barColor, left:left+'px', 
+			fontSize:barTextSize, 
+			borderRadius:borderRadius}">{{barText}}</text>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const dom = weex.requireModule('dom');
+// #endif
+export default{
+	name  : "gui-single-slider",
+	props : {
+		barHeight    : {type:Number,  default:32},
+		barWidth     : {type:Number,  default:168},
+		barColor     : {type:String,  default:'#FFFFFF'},
+		barBgColor   : {type:String,  default:'linear-gradient(to right, #3688FF,#3688FF)'},
+		bglineSize   : {type:Number,  default:2},
+		bglineColor  : {type:String,  default:'rgba(54,136,255,0.5)'},
+		bglineAColor : {type:String,  default:'#3688FF'},
+		barText      : {type:String,  default:''},
+		barTextSize  : {type:String,  default:'20rpx'},
+		borderRadius : {type:String,  default:'32rpx'},
+		canSlide     : {type:Boolean, default:true}
+	},
+	data() {
+		return {
+			left       : 0,
+			startLeft  : 0,
+			width      : 0,
+			barWidthPX : 30
+		}
+	},
+	mounted:function(){
+		this.init();
+	},
+	methods:{
+		init : function(){
+			// #ifdef APP-NVUE
+			var el = this.$refs.gracesgslider;
+			dom.getComponentRect(el, (res) => {
+				if(res.result == 0){
+					setTimeout(()=>{this.init();}, 100);
+					return;
+				}
+				this.startLeft  = res.size.left;
+				this.width      = res.size.width;
+				this.barWidthPX = uni.upx2px(this.barWidth);
+			});
+			// #endif
+			// #ifndef APP-NVUE
+			uni.createSelectorQuery().in(this).select('#gracesgslider').fields(
+				{size: true, rect:true}, (res) => {
+					if(res == null){
+						setTimeout(()=>{this.init();}, 100);
+						return;
+					}
+					this.startLeft  = res.left;
+					this.width      = res.width;
+					this.barWidthPX = uni.upx2px(this.barWidth);
+				}
+			).exec();
+			// #endif
+		},
+		touchstart : function (e) {
+			if(!this.canSlide){return ;}
+			var touch = e.touches[0] || e.changedTouches[0];
+			this.changeBar(touch.pageX);
+		},
+		touchmove : function (e) {
+			if(!this.canSlide){return ;}
+			var touch = e.touches[0] || e.changedTouches[0];
+			this.changeBar(touch.pageX);
+		},
+		touchend : function (e) {
+			if(!this.canSlide){return ;}
+			var touch = e.touches[0] || e.changedTouches[0];
+			this.changeBar(touch.pageX, true);
+		},
+		changeBar : function(x){
+			var left = x - this.startLeft;
+			if(left <= 0){
+				this.left = 0;
+				this.$emit('change', 0);
+			}else if(left + this.barWidthPX > this.width){
+				left = this.width - this.barWidthPX;
+				this.left = left;
+				this.$emit('change', 100);
+			}else{
+				this.left = left;
+				var scale = this.left / (this.width - this.barWidthPX);
+				this.$emit('change', Math.round(scale * 100));
+			}
+		},
+		setProgress : function (value){
+			if(this.width < 1){ setTimeout(()=>{this.setProgress(value), 300}); return ;}
+			if(value < 0){value = 0;}
+			if(value > 100){value = 100;}
+			this.left = ( value / 100 ) * (this.width - this.barWidthPX);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-sg-slider{overflow:hidden; position:relative;}
+.gui-sg-slider-a-line{position:absolute; left:0; top:0;}
+.gui-sg-slider-bar{position:absolute; left:0; top:0; border-radius:50rpx; font-size:20rpx; text-align:center; color:#323232; overflow:hidden;}
+</style>

+ 36 - 0
lib/GraceUI5/components/gui-skeleton.vue

@@ -0,0 +1,36 @@
+<template>
+	<view>
+		<view class="gui-skeleton-animate" 
+		:style="styles" 
+		v-if="!show"></view>
+		<view v-if="show">
+			<slot></slot>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name : "gui-skeleton",
+	data() {
+		return {
+			show:false
+		}
+	},
+	props:{
+		styles    : {type : String, default  : ''},
+		delayTime : {type : Number, default  : 800},
+		canShow   : {type : Boolean, default : true}
+	},
+	created:function(){
+		setTimeout(()=>{
+			if(this.canShow){this.show = true;}
+		}, this.delayTime);
+	}
+}
+</script>
+<style scoped>
+/* #ifndef APP-NVUE */
+@keyframes gui-skeleton-animate{0%{opacity:1;} 25%{opacity:0.5;} 50%{opacity:0.6;} 75%{opacity:1;} 100%{opacity:1;}}
+.gui-skeleton-animate{animation:gui-skeleton-animate 1.6s ease-in infinite;}
+/* #endif */
+</style>

+ 136 - 0
lib/GraceUI5/components/gui-slide-list.vue

@@ -0,0 +1,136 @@
+<template>
+	<scroll-view class="gui-slide-list" :scroll-y="scY" 
+	:show-scrollbar="false" 
+	:style="{width:width+'rpx', height:height+'px'}">
+		<view class="gui-slide-list-item gui-border-b" 
+		v-for="(item, index) in msgsIn" :key="index" 
+		:style="{width:width+'rpx'}">
+			<view class="gui-flex gui-rows gui-nowrap gui-align-items-center" 
+			:style="{
+			width:(width + btnWidth)+'rpx', overflow:'hidden',
+			transform:'translateX('+(moveIndex != index ? 0 : x)+'px)' 
+			}">
+				<view class="gui-slide-list-img-wrap" 
+				hover-class="gui-tap" 
+				@tap.stop.prevnet="itemTap(index)">
+					<image :src="item.img" class="gui-slide-list-img" 
+					mode="widthFix"></image>
+					<text class="gui-slide-list-point gui-block-text gui-bg-red gui-color-white" 
+					v-if="item.msgnumber > 0">{{item.msgnumber}}</text>
+				</view>
+				<view class="gui-slide-list-content" hover-class="gui-tap">
+					<gui-touch @thStart="thStart" @thMove="thMove" 
+					@thEnd="thEnd" @tapme="itemTap(index)" :datas="[index]">
+						<view class="gui-flex gui-rows gui-nowrap gui-space-between">
+						<text 
+						class="gui-slide-list-title-text gui-block-text">{{item.title}}</text>
+						<text 
+						class="gui-slide-list-desc gui-block-text">{{item.time}}</text>
+						</view>
+						<text 
+						class="gui-slide-list-desc gui-block-text gui-ellipsis">{{item.content}}</text>
+					</gui-touch>
+				</view>
+				<view class="gui-slide-btns gui-flex gui-rows gui-nowrap"
+				:style="{width:(btnWidth-2) +'rpx'}">
+					<text class="gui-slide-btn gui-block-text gui-text-center" 
+					v-for="(btn, btnIndex) in item.btns" :key="btnIndex" 
+					:style="{backgroundColor:btn.bgColor}" 
+					@tap.stop.prevnet="btnTap(index, btnIndex)">{{btn.name}}</text>
+				</view>
+			</view>
+		</view>
+	</scroll-view>
+</template>
+<script>
+export default{
+	name  : "gui-slide-list",
+	props : {
+		width       : { type : Number, default : 750},
+		msgs        : { type : Array,  default : function(){return [];}},
+		btnWidth    : { type : Number, default : 320},
+		height      : { type : Number, default : 200},
+	},
+	data() {
+		return {
+			msgsIn    : [],
+			damping   : 0.29,
+			moveIndex : -1,
+			x         : 0,
+			oX        : 0,
+			scY       : true,
+			btnWidthpx:160,
+			touchStart:false
+		}
+	},
+	created:function(){
+		this.init(this.msgs);
+		this.btnWidthpx = (uni.upx2px(this.btnWidth) * -1) + 2;
+	},
+	watch:{
+		msgs : function(nv){this.init(nv);}
+	},
+	methods:{
+		init     : function(msgs){
+			this.moveIndex = -1;
+			this.msgsIn    = msgs;
+		},
+		thStart  : function(e, index){
+			this.x         = 0;
+			this.moveIndex = index[0];
+			this.damping   = 0.25;
+		},
+		thMove   : function (e, index){
+			var x          = e[0][0];
+			var y          = e[0][1];
+			if(Math.abs(x) < Math.abs(y)){
+				this.scY   = true;
+				return ;
+			}else{
+				this.scY   = false;
+			}
+			if(x < 0){
+				this.x += x * this.damping;
+				if(this.x < this.btnWidthpx){this.x = this.btnWidthpx;}
+				this.damping *= 1.02;
+			}else{
+				this.scY   = true;
+			}
+		},
+		thEnd    : function(e, index){
+			if(this.x > this.btnWidthpx / 8){
+				this.x = 0;
+			}else{
+				this.x = this.btnWidthpx;
+			}
+			this.scY   = true;
+			this.oX    = this.x;
+		},
+		btnTap  : function (index, indexBtn) {
+			this.$emit('btnTap',index, indexBtn);
+		},
+		itemTap : function (index) {
+			if(this.oX < 0){
+				this.oX = 0;
+				this.moveIndex = -1;
+				return ;
+			}
+			this.$emit('itemTap',index);
+			this.moveIndex = -1;
+			this.oX = 0;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-slide-list{overflow:hidden;}
+.gui-slide-list-item{overflow:hidden; position:relative;}
+.gui-slide-list-img-wrap{font-size:0; position:relative; width:80rpx; height:80rpx; margin-left:25rpx; overflow:hidden;}
+.gui-slide-list-point{position:absolute; z-index:1; right:0; top:0;}
+.gui-slide-list-content{width:622rpx; overflow:hidden; padding-top:28rpx; padding-bottom:25rpx; margin-left:25rpx;}
+.gui-slide-list-title{overflow:hidden;}
+.gui-slide-btns{width:300rpx; height:116rpx;}
+.gui-slide-btn{width:100rpx; flex:1; height:125rpx; line-height:125rpx; height:125rpx; font-size:28rpx; color:#FFFFFF; overflow:hidden;}
+.gui-slide-list-img{width:80rpx; height:80rpx; border-radius:6rpx;} /* 列表图片外层样式 */
+.gui-slide-list-point{border-radius:32rpx; height:32rpx; line-height:32rpx; padding:0 10rpx; font-size:20rpx;} /* 消息数标签样式 */
+</style>

+ 95 - 0
lib/GraceUI5/components/gui-slide-to-unlock.vue

@@ -0,0 +1,95 @@
+<template>
+	<view class="graceSlideToUnlock gui-border-box" 
+	:style="{
+	backgroundColor:bgColor, width:width+'rpx', 
+	padding:padding+'rpx', height:(size+padding*2)+'rpx'
+	}">
+		<text class="graceSlideToUnlock-text gui-block-text gui-icons" 
+		:class="[moving?'gui-fade':'']" 
+		:style="{
+			width:(width - padding* 2) +'rpx', 
+			lineHeight:size+'rpx', 
+			color:disabled?blockActiveColor:'#898989',
+			top : padding+'rpx'}">{{disabled?msgUnlock:msg}} &#xe601;&#xe601;</text>
+		<movable-area class="movable-area" 
+		:style="{
+			width:(width - padding* 2) +'rpx', 
+			height:size+'rpx', borderRadius:borderRadius,
+			top : padding+'rpx'}">
+			<movable-view direction="horizontal" 
+			@change="change" :x="moveX" :disabled="disabled" 
+			:style="{width:size+'rpx', height:size+'rpx'}">
+				<text class="graceSlideToUnlock-block gui-icons gui-block-text gui-color-white" 
+				v-if="!disabled" 
+				:style="{
+					backgroundColor:disabled ? blockActiveColor : blockColor, 
+					borderRadius:borderRadius, width:size+'rpx', height:size+'rpx', 
+					lineHeight:size+'rpx', color:iconColor, fontSize:iconSize}">&#xe641;</text>
+				<text class="graceSlideToUnlock-block gui-icons gui-block-text gui-color-white" 
+				v-if="disabled" :style="{
+					backgroundColor:disabled ? blockActiveColor : blockColor, 
+					borderRadius:borderRadius, width:size+'rpx', height:size+'rpx', 
+					lineHeight:size+'rpx', color:iconColor, fontSize:iconSize}">&#xe86a;</text>
+			</movable-view>
+		</movable-area>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-slide-to-unlock",
+	props : {
+		width            : {type : Number, default:690 },
+		padding          : {type : Number, default:6},
+		size             : {type : Number, default:68},
+		bgColor          : {type : String, default:'#F6F7F8'},
+		blockColor       : {type : String, default:'#008AFF'},
+		blockActiveColor : {type : String, default:'#39B55A'},
+		iconSize         : {type : String, default:'30rpx'},
+		iconColor        : {type : String, default:'#FFFFFF'},
+		borderRadius     : {type : String, default:'6rpx'},
+		msg              : {type : String, default:'请向右滑动滑块解锁'},
+		msgUnlock        : {type : String, default:'解锁成功'}
+	},
+	data() {
+		return {
+			maxWidth  : 300,
+			moveX     : 0,
+			disabled  : false,
+			locktimer : null,
+			moving    : false
+		}
+	},
+	created:function(){
+		this.maxWidth = uni.upx2px(this.width - this.padding * 2 - this.size - 2);
+		this.moveX    = uni.upx2px(this.padding); 
+	},
+	methods:{
+		change:function(e){
+			if(this.disabled){return ;}
+			this.moving    = true;
+			if(this.locktimer != null){clearTimeout(this.locktimer);}
+			this.locktimer = setTimeout(() => {
+				if(e.detail.x >= this.maxWidth){
+					this.moveX    = this.width;
+					this.disabled = true;
+					this.moving   = false;
+					this.$emit('unlock');
+				}else{
+					this.moveX = uni.upx2px(this.padding) + Math.random();
+					this.moving   = false;
+				}
+			}, 300);
+		}
+	}
+}
+</script>
+<style scoped>
+.graceSlideToUnlock{position:relative;}
+.movable-area{position:absolute; left:0; top:0; z-index:2;}
+.graceSlideToUnlock-block{text-align:center; opacity:0.88;}
+.graceSlideToUnlock-text{text-align:center; color:#FFFFFF; font-size:24rpx; position:absolute; left:0; top:0; z-index:1;}
+/* #ifndef APP-NVUE */
+@keyframes gui-fade{0%{opacity:1;} 50%{opacity:0;} 100%{opacity:1;}}
+.gui-fade{animation:gui-fade 2s ease-in infinite;}
+/* #endif */
+</style>

+ 44 - 0
lib/GraceUI5/components/gui-speaker.vue

@@ -0,0 +1,44 @@
+<template>
+	<view class="gui-flex gui-rows gui-nowrap gui-align-items-center">
+		<view>
+			<slot name="icon"></slot>
+		</view>
+		<view class="gui-flex1">
+			<swiper :style="styles"
+			:vertical="vertical" @change="change" autoplay="true" :circular="true" 
+			:interval="interval" :current="current" class="gui-speaker-in">
+				<swiper-item  
+				v-for="(item, index) in items" :key="index">
+					<navigator :style="styles" 
+					:url="item.url" :open-type="item.opentype">
+						<text :style="styles" 
+						class="gui-block-text gui-ellipsis">{{item.title}}</text>
+					</navigator>
+				</swiper-item>
+			</swiper>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-speaker",
+	props : {
+		items     : {type:Array, default:function () {return [];}},
+		current   : {type:Number, default:0},
+		vertical  : {type:Boolean, default:false},
+		interval  : {type:Number, default:5000},
+		styles    : {type:String, default:'overflow:hidden; height:60rpx; line-height:60rpx; font-size:28rpx;'}
+	},
+	data() {
+		return {
+		}
+	},
+	methods:{
+		change:function (index) {
+			this.$emit('change', index.detail.current);
+		}
+	}
+}
+</script>
+<style scoped>
+</style>

+ 62 - 0
lib/GraceUI5/components/gui-spread.vue

@@ -0,0 +1,62 @@
+<template name="graceSpread">
+	<view class="gui-spread" 
+	:class="[isShrink ? 'gui-transition-all' : '']" 
+	:style="{height:reHeight}">
+		<view :style="{paddingBottom: !isBtn && isShrink ? '80rpx' : '0rpx'}">
+			<slot></slot>
+		</view>
+		<text v-if="isBtn" @tap="spreadContent" 
+		:style="{color:btnColor, fontSize:btnTxtSize, zIndex:zIndex, width:width}"
+		class="gui-icons gui-block-text gui-spread-btn">&#xe69d; {{btnTxt}}</text>
+		
+		<text v-if="!isBtn && isShrink" @tap="shrinkContent" 
+		:style="{color:btnColor, fontSize:btnTxtSize, zIndex:zIndex, width:width}"
+		class="gui-icons gui-block-text gui-spread-btn">&#xe638; {{shrinkBtnTxt}}</text>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-spread",
+	props : {
+		width       : { type : String, default : "690rpx" },
+		height      : { type : String, default : "600rpx" },
+		btnTxt      : { type : String, default : "展开阅读全文" },
+		btnColor    : { type : String, default : "#999999" },
+		btnTxtSize  : { type : String, default : "28rpx" },
+		zIndex      : { type : Number, default : 1 },
+		isShrink    : { type : Boolean,default : false},
+		shrinkBtnTxt: { type : String, default : "收缩文章"}
+	},
+	data() {
+		return {
+			reHeight: "600px",
+			isBtn : true
+		}
+	},
+	created:function(){
+		this.reHeight = this.height;
+	},
+	methods: {
+		spreadContent : function () {
+			// #ifdef MP-BAIDU
+			this.reHeight = '';
+			// #endif
+			// #ifndef MP-BAIDU
+			this.reHeight = 'auto';
+			// #endif
+			// #ifdef APP-NVUE
+			this.reHeight = '';
+			// #endif
+			this.isBtn    = false;
+		},
+		shrinkContent : function () {
+			this.reHeight = this.height;
+			this.isBtn    = true;
+		}
+	},
+}
+</script>
+<style scoped>
+.gui-spread{overflow:hidden; position:relative;}
+.gui-spread-btn{height:80rpx; line-height:80rpx; background-color:rgba(255,255,255,0.9); position:absolute; z-index:999999; left:0; bottom:0; text-align:center;}
+</style>

+ 115 - 0
lib/GraceUI5/components/gui-stags.vue

@@ -0,0 +1,115 @@
+<template>
+	<view class="gui-flex gui-wrap gui-rows">
+		<text v-if="type != 'remove'" 
+		v-for="(tag, idx) in tagsIn" :key="idx" 
+		:class="['gui-block-text', 'gui-ellipsis',
+			tag.checked ? checkedBg : defaultBg, 
+			tag.checked ? checkedColor : defaultColor]" 
+			:style="{
+				width:width == 0 ? '' : width+'rpx',
+				paddingLeft:padding+'rpx',
+				paddingRight:padding+'rpx',
+				lineHeight:(size*lineHeight)+'rpx',
+				height:(size*lineHeight)+'rpx', 
+				fontSize:size+'rpx',
+				borderRadius:borderRadius+'rpx',
+				marginRight:margin+'rpx',
+				marginBottom:margin+'rpx'
+			}" @tap="tapme(idx)">{{tag.text}}</text>
+		<view class="gui-flex gui-rows gui-space-between gui-align-items-center" 
+		:class="[defaultBg, defaultColor]"
+		v-for="(tag, idx) in tagsIn" :key="idx" 
+		:style="{
+			width:width == 0 ? '' : width+'rpx',
+			paddingLeft:padding+'rpx',
+			paddingRight:padding+'rpx',
+			borderRadius:borderRadius+'rpx',
+			marginRight:margin+'rpx',
+			marginBottom:margin+'rpx'
+		}" v-if="type == 'remove'" @tap="tapme(idx)">
+			<text class="gui-block-text gui-ellipsis" 
+			:style="{
+				lineHeight:(size*lineHeight)+'rpx',
+				height:(size*lineHeight)+'rpx', 
+				fontSize:size+'rpx'
+			}">{{tag.text}}</text>
+			<text class="gui-block-text gui-icons gui-tags-remove-btn"
+			:style="{
+				lineHeight:(size*lineHeight)+'rpx',
+				height:(size*lineHeight)+'rpx', 
+				fontSize:size+'rpx'
+			}">&#xe7a5;</text>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-stags", 
+	props : {
+		width        : {type:Number, default:0},
+		text         : {type:String, default:''},
+		size         : {type:Number, default:26},
+		lineHeight   : {type:Number, default:1.8},
+		padding      : {type:Number, default:15},
+		margin       : {type:Number, default:15},
+		defaultBg    : {type:String, default:'gui-bg-gray'},
+		defaultColor : {type:String, default:'gui-primary-color'},
+		borderRadius : {type:Number, default:6},
+		data         : {type:Array,  default:function(){return [];}},
+		tags         : {type:Array,  default: function(){return [];}},
+		type         : {type:String, default:'radio'},
+		checkedBg    : {type:String, default:'gui-bg-blue'},
+		checkedColor : {type:String, default:'gui-color-white'}
+	},
+	data() {
+		return {
+			tagsIn: []
+		}
+	},
+	created:function () {
+		this.tagsIn = this.tags;
+	},
+	watch:{
+		tags : function (val) {
+			this.tagsIn = val;
+		}
+	},
+	methods:{
+		tapme : function(idx){
+			if(this.type == "radio"){
+				if(this.tagsIn[idx].checked){
+					this.tagsIn[idx].checked  = false;
+					this.tagsIn.splice(idx,1, this.tagsIn[idx]);
+					this.$emit('change', -1, this.tagsIn);
+				}else{
+					for(let i = 0; i < this.tagsIn.length; i++){
+						this.tagsIn[i].checked  = false;
+						this.tagsIn.splice(i,1, this.tagsIn[i]);
+					}
+					this.tagsIn[idx].checked  = true;
+					this.tagsIn.splice(idx,1, this.tagsIn[idx]);
+					this.$emit('change', this.tagsIn[idx], this.tagsIn);
+				}
+				
+			}else if(this.type == 'checkbox'){
+				this.tagsIn[idx].checked  = !this.tagsIn[idx].checked;
+				this.tagsIn.splice(idx, 1, this.tagsIn[idx]);
+				// 记录选中的索引
+				var sedArr = [];
+				for(let i = 0; i < this.tagsIn.length; i++){
+					if(this.tagsIn[i].checked){
+						sedArr.push(i);
+					}
+				}
+				this.$emit('change', sedArr, this.tagsIn);
+			}else{
+				this.tagsIn.splice(idx, 1);
+				this.$emit('change', this.tagsIn);
+			}
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-tags-remove-btn{margin-left:10rpx;}
+</style>

+ 50 - 0
lib/GraceUI5/components/gui-star.vue

@@ -0,0 +1,50 @@
+<template name="graceStart">
+	<view class="gui-flex gui-rows gui-nowrap">
+	  <view v-for="(item, index) in totalstars" 
+	  :style="{padding:padding}" :key="index" 
+	  @tap="changnum" :data-val="index">
+			<text class="gui-icons" 
+			:style="{'color': activecolor, 'font-size' : fontSize}" 
+			v-if="valueIn > index">&#xe634;</text>
+			<text class="gui-icons" 
+			:style="{'color': color, 'font-size' : fontSize}" 
+			v-else>&#xe634;</text>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name: "gui-star",
+	props:{
+		fontSize     : { type : String,  default : '50rpx' },
+		totalstars   : { type : Number,  default : 5 },
+		starnum      : { type : Number,  default : 1 },
+		color        : { type : String,  default : '#E1E1E1' },
+		activecolor  : { type : String,  default : '#F5C359' },
+		cantap       : { type : Boolean, default : true },
+		padding      : { type : String,  default : '5rpx'}
+	},
+	data() {
+		return {
+			valueIn : 0
+		}
+	},
+	created:function(){
+		this.valueIn = this.starnum;	
+	},
+	watch:{
+		starnum : function (val) {
+			this.valueIn = this.starnum;
+		}
+	},
+	methods: {
+		changnum : function(e){
+			if (!this.cantap){return null;}
+			this.valueIn = Number(e.currentTarget.dataset.val) + 1;
+			this.$emit("change", Number(this.valueIn));
+		}
+	}
+}
+</script>
+<style scoped>
+</style>

+ 117 - 0
lib/GraceUI5/components/gui-step-box.vue

@@ -0,0 +1,117 @@
+<template>
+	<view class="gui-flex gui-rows gui-nowrap gui-align-items-center" 
+	:style="{width:width}">
+		<view hover-class="gui-tap">
+			<text class="gui-block-text gui-text-center gui-number-box-button" @tap.stop="reduce"
+			:style="buttonStyle">-</text>
+		</view>
+		<input class="gui-number-box-input" :disabled="disabled"
+		v-model="inputNumber" type="digit" @blur="inputval"  
+		:style="inputStyle" />
+		<view hover-class="gui-tap">
+			<text class="gui-block-text gui-text-center gui-number-box-button" @tap.stop="add"
+			:style="buttonStyle">+</text>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	name  : "gui-step-box",
+	props : {
+		width          : { type : String,   default : '200rpx' },
+		value          : { type : Number,  default : 0 },
+		step           : { type : Number,  default : 1 },
+		maxNum         : { type : Number,  default : 9999 },
+		minNum         : { type : Number,  default : 0 },
+		buttonStyle    : { type : String,  default : 'width:66rpx; font-size:38rpx; color:rgba(69, 90, 100, 0.6);' },
+		inputStyle     : { type : String,  default : 'line-height:58rpx; height:58rpx; font-size:26rpx; color:#2B2E3D; background-color:#F6F7F8; border-radius:8rpx;'},
+		disabled       : { type : Boolean, default : false },
+		index          : { type : Number,  default : 0 },
+		datas          : { type : Array,   default : function () {
+			return [];
+		}},
+		decimal        : { type : Number, default:2}
+	},
+	data() {
+		return {
+			inputNumber    : 0,
+			callbackNumber : 0
+		}
+	},
+	created:function(){
+		this.inputNumber = Number(this.value);
+	},
+	watch:{
+		value       : function(val, vo){
+			this.inputNumber = Number(val);
+		},
+		inputNumber :function(val, vo){
+			val = Number(val);
+			if(isNaN(val)){
+				setTimeout(()=>{this.inputNumber = Number(vo);}, 200);  return; 
+			}
+			var newVal = this.decimalVal(val);
+			if(newVal != val){
+				setTimeout(()=>{this.inputNumber = Number(newVal);}, 200);  
+				return;
+			}
+			if(val > this.maxNum){
+				setTimeout(()=>{this.inputNumber = this.maxNum;}, 200);
+				return ;
+			}
+			if(val < this.minNum){
+				setTimeout(()=>{this.inputNumber = this.minNum;}, 200);
+				return ;
+			}
+		}
+	},
+	methods : {
+		add      : function(){
+			var newVal = Number(this.inputNumber) + Number(this.step);
+			newVal = this.decimalVal(newVal);
+			if(newVal > this.maxNum){return ;}
+			this.inputNumber = Number(newVal);
+			setTimeout(()=>{
+				this.$emit('change', [this.inputNumber, this.index, this.datas]);
+			}, 300);
+		},
+		reduce   : function () {
+			var newVal = Number(this.inputNumber) - Number(this.step);
+			newVal = this.decimalVal(newVal);
+			if(newVal < this.minNum){return ;}
+			this.inputNumber = newVal;
+			setTimeout(()=>{
+				this.$emit('change', [this.inputNumber, this.index, this.datas]);
+			}, 300);
+		},
+		inputval  : function (e) {
+			this.inputNumber = e.detail.value;
+			setTimeout(()=>{
+				this.$emit('change', [this.inputNumber, this.index, this.datas]);
+			}, 300);
+		},
+		decimalVal : function (val) {
+			var isDecimal = String(val).indexOf(".");
+			if(isDecimal != -1){
+				val = val.toFixed(this.decimal);
+				var valArr = String(val).split('.');
+				if(valArr[1].length > this.decimal){
+					valArr[1] = valArr[1].substr(0, this.decimal);
+					val = Number(valArr.join('.'));
+				} 
+			}
+			return val ;
+		}
+	}
+}
+</script>
+<style scoped>
+/* #ifndef APP-NVUE */
+.gui-number-box-input{text-align:center; width:500rpx;}
+.gui-number-box-button{overflow:hidden; flex-shrink:0;}
+/* #endif */
+/* #ifdef APP-NVUE */
+.gui-number-box-input{text-align:center; width:50rpx; flex:1;}
+.gui-number-box-button{overflow:hidden;}
+/* #endif */
+</style>

+ 202 - 0
lib/GraceUI5/components/gui-submit-button.vue

@@ -0,0 +1,202 @@
+<template>
+	<view class="gui-sbutton-in" 
+	:class="[
+	baseClass, 
+	status == 1 ? defaultClass : '' ,
+	status == 2 ? loadingClass : '' ,
+	status == 3 ? successClass : '', 
+	status >= 3 ? 'gui-btn-fade-in' : '', 
+	status == 4 ? failClass : '',]">
+		<view class="gui-sbutton" v-if="status == 1">
+			<slot name="default"></slot>
+		</view>
+		<view 
+		class="gui-sbutton gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center" 
+		:class="[baseClass]" 
+		v-if="status == 2">
+			<view ref="loadingPoints1" :class="[loaingPointClass, 'gui-sbutton-loading1']"></view>
+			<view ref="loadingPoints2" :class="[loaingPointClass, 'gui-sbutton-loading2']"></view>
+			<view ref="loadingPoints3" :class="[loaingPointClass, 'gui-sbutton-loading3']"></view>
+		</view>
+		<view class="gui-sbutton" v-if="status == 3">
+			<slot name="success"></slot>
+		</view>
+		<view class="gui-sbutton" v-if="status == 4">
+			<slot name="error"></slot>
+		</view>
+		<view class="gui-sbutton gui-sbutton-slot"><slot name="realBtn"></slot></view>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const BindingX = uni.requireNativePlugin('bindingx');
+// #endif
+export default{
+	name    : "gui-submit-button",
+	props   : {
+		titleClass        : {type:String, default : 'gui-sbutton-text'},
+		loaingPointClass  : {type:String, default : 'gui-sbutton-loading-point'},
+		baseClass         : {type:String, default : 'gui-sbutton'},
+		defaultClass      : {type:String, default : 'gui-sbutton-default'},
+		loadingClass      : {type:String, default : 'gui-sbutton-loading'},
+		successClass      : {type:String, default : 'gui-sbutton-success'},
+		failClass         : {type:String, default : 'gui-sbutton-fail'}
+	},
+	data() {
+		return {
+			status         : 1,
+			animateTimer   : 800,
+			BindingXObjs   : [null,null,null],
+			AnimateObjs    : [null,null,null],
+			intervalID     : null
+		}
+	},
+	// #ifdef APP-NVUE
+	watch:{
+		status:function(val){
+			switch(val){
+				case 1 :
+					clearInterval(this.intervalID);
+				break;
+				case 2 :
+					setTimeout(()=>{
+						this.getRefs('loadingPoints1', 0, (refs)=>{
+							this.BindingXObjs = [
+								refs.ref,
+								this.$refs.loadingPoints2.ref,
+								this.$refs.loadingPoints3.ref
+							];
+							this.startAnimate();
+						});
+					}, 100);
+					this.intervalID = setInterval(()=>{
+						this.startAnimate();
+					}, 1000);
+				break;
+				case 3 :
+					clearInterval(this.intervalID);
+				break;
+				case 4 :
+					clearInterval(this.intervalID);
+				break;
+				default : 
+					clearInterval(this.intervalID);
+			}
+		}
+	},
+	// #endif
+	methods : {
+		reset : function () {
+			this.status = 1;
+		},
+		loading : function () {
+			this.status = 2;
+		},
+		success : function () {
+			this.status = 3;
+		},
+		fail : function () {
+			this.status = 4;
+		},
+		// #ifdef APP-NVUE
+		startAnimate   : function(){
+			this.loadingAnimate(0);
+			setTimeout(()=>{this.loadingAnimate(1);},300);
+			setTimeout(()=>{this.loadingAnimate(2);},600);
+		},
+		loadingAnimate : function (id) {
+			this.AnimateObjs[id] = BindingX.bind({
+				eventType      : 'timing',
+				exitExpression : 't>'+this.animateTimer,
+				props          : [
+					{
+						element    : this.BindingXObjs[id], 
+						property   : 'transform.scale',
+						expression : "1+t/"+this.animateTimer+"/3"
+					},
+					{
+						element    : this.BindingXObjs[id], 
+						property   : 'opacity',
+						expression : "0.6+t/"+this.animateTimer
+					}
+				]
+			}, (e)=>{
+				if(e.state === 'exit') {
+					BindingX.unbind({
+						token : this.AnimateObjs[id].token,
+						eventType: 'timing'
+					});
+					this.AnimateObjs[id] = BindingX.bind({
+						eventType      : 'timing',
+						exitExpression : 't>'+this.animateTimer,
+						props          : [
+							{
+								element    : this.BindingXObjs[id], 
+								property   : 'transform.scale',
+								expression : "1.35-t/"+this.animateTimer+"/3"
+							},
+							{
+								element    : this.BindingXObjs[id], 
+								property   : 'opacity',
+								expression : "1.6-t/"+this.animateTimer
+							}
+						]
+					}, (e)=>{
+						if(e.state === 'exit') {
+							BindingX.unbind({
+								token : this.AnimateObjs[id].token,
+								eventType: 'timing'
+							});
+						}
+					});
+				}
+			});
+		},
+		// #endif
+		getRefs        : function(ref, count, fun){
+			if(count >= 30){return null;}
+			var refReturn = this.$refs[ref];
+			if(refReturn){
+				fun(refReturn);
+				return;
+			}else{
+				count++;
+				setTimeout(()=>{
+					this.getRefs(ref, count, fun);
+				}, 50);
+			}
+		}
+	}
+}
+</script>
+<style>
+.gui-sbutton-in{position:relative; overflow:hidden;}
+.gui-sbutton-slot{opacity:0; position:absolute; left:0; top:0; z-index:1;}
+
+/* #ifndef APP-NVUE */
+.gui-sbutton-loading1{animation:gui-sbutton-loading1 1200ms ease-in infinite;}
+@keyframes gui-sbutton-loading1{
+	0%{transform: translateY(0px);}
+	25%{transform: translateY(2px);}
+	100%{transform: translateY(0px);}
+}
+.gui-sbutton-loading2{animation:gui-sbutton-loading2 1200ms ease-in infinite;}
+@keyframes gui-sbutton-loading2{
+	0%{transform: translateY(0px);}
+	25%{transform: translateY(0px);}
+	50%{transform: translateY(2px);}
+	75%{transform: translateY(2px);}
+	100%{transform: translateY(0px);}
+}
+.gui-sbutton-loading3{animation:gui-sbutton-loading3 1200ms ease-in infinite;}
+@keyframes gui-sbutton-loading3{
+	0%{transform: translateY(0px);}
+	25%{transform: translateY(0px);}
+	50%{transform: translateY(0px);}
+	75%{transform: translateY(2px);}
+	100%{transform: translateY(0px);}
+}
+@keyframes gui-btn-fade-in{0%{opacity:0.5;} 100%{opacity:1;}}
+.gui-btn-fade-in{animation:gui-btn-fade-in 350ms ease-in forwards;}
+/* #endif */
+</style>

+ 106 - 0
lib/GraceUI5/components/gui-submit-comment.vue

@@ -0,0 +1,106 @@
+<template>
+	<gui-popup 
+	ref="guipopupforsubcomment" 
+	position="bottom" 
+	:canCloseByShade="true" 
+	:zIndex="zIndex">
+		<view class="gui-comments gui-bg-white" 
+		@tap.stop.prevent="stopfun">
+			<text class="gui-comments-at gui-block-text" 
+			:style="{color:atColor}" 
+			v-if="comment.at != ''">@ {{comment.at}}</text>
+			<view style="height:20rpx;" 
+			v-if="comment.at == ''"></view>
+			<view 
+			class="gui-flex gui-rows gui-nowrap gui-space-between">
+				<view class="gui-comments-img gui-relative" 
+				v-if="comment.img != ''">
+					<image :src="comment.img" 
+					class="gui-comments-img-in" 
+					mode="widthFix"></image>
+					<text class="gui-comments-img-remove gui-icons" 
+					@tap="removeImg" 
+					:style="{color:removeBtnColor}">&#xe78a;</text>
+				</view>
+				<textarea :show-confirm-bar="false" 
+				cursor-spacing="200" v-model="comment.content" 
+				class="gui-comments-textarea gui-border-box gui-bg-gray" 
+				:placeholder="placeholder" />
+			</view>
+			<view class="gui-flex gui-rows gui-space-between gui-align-items-center">
+				<text class="gui-comments-btns gui-icons gui-color-gray" 
+				@tap="selectImg" v-if="isImg">&#xe63d;</text>
+				<text class="gui-comments-btns" v-if="!isImg"></text>
+				<view class="gui-comments-submit" 
+				hover-class="gui-tap">
+					<text class="gui-comments-btns gui-comments-submit gui-icons" 
+					:style="{color:submitColor}" 
+					@tap="submit">提交</text>
+				</view>
+			</view>
+			<view class="">
+				<gui-iphone-bottom></gui-iphone-bottom>
+			</view>
+		</view>
+	</gui-popup>
+</template>
+<script>
+export default{
+	name  : "gui-submit-comment",
+	props : {
+		placeholder    : { type : String,  default : "说点什么吧"},
+		isImg          : { type : Boolean, default : true},
+		atColor        : { type : String,  default : '#008AFF'},
+		submitColor    : { type : String,  default : '#008AFF'},
+		removeBtnColor : { type : String,  default : '#FF0036'},
+		zIndex         : { type : Number,  default : 999}
+	},
+	data() {
+		return {
+			comment : {img:'', content:'',at:''}
+		}
+	},
+	methods:{
+		open       : function(){
+			this.$refs.guipopupforsubcomment.open();
+		},
+		close      : function(){
+			this.$refs.guipopupforsubcomment.close();
+		},
+		stopfun    : function(e){
+			e.stopPropagation();
+			return null;
+		},
+		submit     : function () {
+			this.$emit('submit', this.comment); 
+			this.close();
+			this.comment = {img:'', content:'',at:''}
+		},
+		selectImg  : function(){
+			uni.chooseImage({
+				count:1,
+				success:(res)=>{this.comment.img = res.tempFilePaths[0];}
+			});
+		},
+		removeImg  : function () {
+			this.comment.img = '';
+		},
+		setAt      : function(name){
+			this.comment.at = name;
+		},
+		setContent : function (content) {
+			this.comment.content = content;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-comments{padding:10rpx 30rpx;}
+.gui-comments-at{line-height:80rpx; height:80rpx; font-size:28rpx; font-weight:bold;}
+.gui-comments-textarea{width:200rpx; border-radius:8rpx; padding:15rpx; font-size:26rpx; line-height:36rpx; height:160rpx; flex:1;}
+.gui-comments-img{width:160rpx; height:160rpx; margin-right:25rpx; font-size:0; overflow:hidden; border-radius:8rpx;}
+.gui-comments-img-in{width:160rpx;}
+.gui-comments-img-remove{width:60rpx; height:60rpx; line-height:60rpx; position:absolute; right:0; top:0; text-align:center; font-size:50rpx; color:#FF0036;}
+.gui-comments-btns{width:96rpx; height:80rpx; line-height:80rpx; font-size:44rpx;}
+.gui-comments-submit{width:180rpx; text-align:right; font-size:28rpx;}
+</style>

+ 157 - 0
lib/GraceUI5/components/gui-swiper.vue

@@ -0,0 +1,157 @@
+<template>
+	<view class="gui-swiper-card-wrap">
+		<swiper :style="{width:width+'rpx', height:heightIn+'rpx'}" 
+		class="gui-swiper-card" 
+		:indicator-dots="false" :interval="interval" :circular="true" 
+		:autoplay="autoplay" :current="currentIndex" 
+		:previous-margin="spacing+'rpx'" :next-margin="spacing+'rpx'" 
+		@change="swiperchange">
+			<swiper-item v-for="(item, index) in swiperItems" 
+			:key="index" class="gui-swiper-card-item gui-border-box">
+				<navigator class="gui-swiper-card-nav gui-transition-all" 
+				:url="item.url" :open-type="item.opentype" hover-class="none" 
+				v-if="item.opentype != 'click'" 
+				:style="{paddingLeft:current != index ? padding +'rpx':'0rpx',
+				paddingRight:current != index ? padding +'rpx':'0rpx',
+				paddingTop:current != index ? paddingY +'rpx':'0rpx',
+				paddingBottom:current != index ? paddingY +'rpx':'0rpx'}">
+					<image :style="{
+						borderRadius : borderRadius, 
+						width:current != index ? widthInSamll+'rpx':widthIn+'rpx',
+						height:current != index ? heightInSmall+'rpx':heightIn+'rpx',
+						opacity:current != index ? opacity : 1}" 
+						:src="item.img" class="gui-swiper-card-image gui-transition-all" />
+				</navigator>
+				<view class="gui-swiper-card-nav gui-transition-all" 
+				hover-class="none" v-if="item.opentype == 'click'" 
+				@tap.stop="taped" :data-index="index" 
+				:style="{paddingLeft:current != index ? padding +'rpx':'0rpx',
+				paddingRight:current != index ? padding +'rpx':'0rpx',
+				paddingTop:current != index ? paddingY +'rpx':'0rpx',
+				paddingBottom:current != index ? paddingY +'rpx':'0rpx'}">
+					<image :style="{
+						borderRadius : borderRadius, 
+						width:current != index ? widthInSamll+'rpx':widthIn+'rpx',
+						height:current != index ? heightInSmall+'rpx':heightIn+'rpx',
+						opacity:current != index ? opacity : 1}" 
+					:src="item.img" class="gui-swiper-card-image gui-transition-all" />
+				</view>
+				<view v-if="indicatorType == 'number'" 
+				class="gui-indicator-dot-numbers gui-flex gui-rows gui-nowrap" 
+				:style="{
+					height:indicatorBarHeight+'rpx', backgroundColor:indicatorBarBgColor, 
+					'border-bottom-left-radius':borderRadius, 'border-bottom-right-radius':borderRadius,
+					width:current != index ? widthInSamll+'rpx':widthIn+'rpx', 
+					left:current != index ? padding+'rpx':'0rpx', bottom:current != index ? paddingY+'rpx':'0rpx'}">
+					<text class="gui-indicator-dot-text" 
+					:style="{paddingLeft:'20rpx', 'fontStyle':'italic', color:titleColor}">{{index+1}}</text>
+					<text class="gui-indicator-dot-text" 
+					:style="{'fontSize':'36rpx', color:titleColor}">/</text>
+					<text class="gui-indicator-dot-text" 
+					:style="{fontSize:'28rpx', paddingRight:'20rpx', fontStyle:'italic', color:titleColor}">{{swiperItems.length}}</text>
+					<text class="gui-swiper-text gui-block-text gui-flex1 gui-ellipsis" 
+					:style="{color:titleColor, fontSize:titleSize, height:indicatorBarHeight+'rpx', 
+					lineHeight:indicatorBarHeight+'rpx'}">{{item.title}}</text>
+				</view>
+			</swiper-item>
+		</swiper>
+		<view class="gui-indicator-dots gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center gui-border-box" 
+		v-if="indicatorType == 'dot'" 
+		:style="{width:width+'rpx', height:indicatorBarHeight+'rpx', position:indicatorPosition, 
+		paddingLeft:spacing+'rpx', paddingRight:spacing+'rpx', 'justify-content':indicatorDirection}">
+			<view class="gui-indicator-dots-wrap gui-flex gui-rows gui-nowrap gui-justify-content-center">
+				<view v-for="(item, index) in swiperItems" :key="index" 
+				:class="['gui-indicator-dot',current == index ? 'dot-show' : '']" 
+				:style="{
+					width           : current != index ? indicatorWidth+'rpx' : indicatorActiveWidth +'rpx',
+					height          : indicatorHeight+'rpx',
+					borderRadius    : indicatorRadius+'rpx',
+					backgroundColor : current != index ? indicatorColor : indicatorActiveColor}"></view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-swiper",
+	props : {
+		width :{ type : Number, default : 750 },
+		height:{ type : Number, default : 300 },
+		swiperItems : { type : Array, default : function(){return new Array();} },
+		borderRadius : { type : String, default : '10rpx'},
+		indicatorBarHeight:{type : Number, default : 68},
+		indicatorBarBgColor:{type : String, default : 'rgba(0,0,0,0)'},
+		indicatorWidth : { type:Number, default:18 },
+		indicatorActiveWidth :{ type:Number, default:18 },
+		indicatorHeight : { type:Number, default:18 },
+		indicatorRadius:{ type:Number, default:18 },
+		indicatorColor : { type : String, default : "rgba(255, 255, 255, 0.6)" },
+		indicatorActiveColor : { type : String, default : "#2B2E3D" },
+		indicatorType:{ type : String, default : "dot" },
+		indicatorPosition:{ type : String, default : "absolute" },
+		indicatorDirection:{type:String, default:'center'},
+		spacing : { type : Number, default : 50 },
+		padding : { type : Number, default : 26 },
+		interval : { type : Number, default : 5000 },
+		autoplay : { type : Boolean, default : true },
+		currentIndex : { type : Number, default : 0 },
+		opacity:{ type : Number, default:0.66},
+		titleColor:{type:String, default:"#FFFFFF"},
+		titleSize:{type:String, default:"28rpx"}
+	},
+	data() {
+		return {
+			current : 0,
+			isReady : false,
+			widthIn : 750,
+			heightIn  : 300,
+			widthInSamll:700,
+			heightInSmall:280,
+			paddingY:0
+		}
+	},
+	watch:{
+		currentIndex : function (val) {
+			this.current = val;
+		}
+	},
+	created:function(){
+		this.current = this.currentIndex;
+		this.init();
+	},
+	methods:{
+		init : function(){
+			// 图片宽高计算
+			this.widthIn   = this.width - this.spacing*2;
+			this.heightIn  = this.height / this.width * this.widthIn;
+			this.paddingY  = this.padding * this.height / this.width;
+			this.widthInSamll  = this.widthIn -  this.padding * 2;
+			this.heightInSmall = this.heightIn - this.paddingY * 2;
+		},
+		swiperchange : function (e) {
+			var current = e.detail.current;
+			this.current = current;
+			this.$emit('swiperchange', current);
+		},
+		taped : function(e){
+			this.$emit('taped', e.currentTarget.dataset.index);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-swiper-card-wrap{position:relative;}
+.gui-swiper-card{overflow:hidden;}
+.gui-swiper-card-item{font-size:0; overflow:hidden; line-height:0;}
+.gui-swiper-card-nav{font-size:0; position:relative;}
+.gui-indicator-dots{width:750rpx; overflow:hidden; z-index:1; left:0; bottom:0;}
+.gui-indicator-dot{margin:6rpx;}
+.gui-indicator-dots-wrap{padding:0 20rpx;}
+.gui-indicator-dot-text{text-align:center; line-height:68rpx; padding:0 4rpx; color:#FFFFFF; font-size:32rpx;}
+.gui-indicator-dot-numbers{overflow:hidden; align-items:center; position:absolute; z-index:1; left:0; bottom:0;}
+.gui-swiper-text{width:200rpx; line-height:68rpx; padding-right:25rpx; overflow:hidden;}
+/* #ifndef APP-NVUE */
+@keyframes dot-show{from{opacity:0.1;}to{opacity:1;}}
+.dot-show{animation:dot-show 300ms linear forwards;}
+/* #endif */
+</style>

+ 113 - 0
lib/GraceUI5/components/gui-switch-navigation.vue

@@ -0,0 +1,113 @@
+<template>
+	<scroll-view :scroll-with-animation="scorllAnimation" 
+	:scroll-x="true" :show-scrollbar="false" 
+	:class="['gui-scroll-x', isCenter ? 'gui-nav-center' : '']" 
+	:style="{width:width+'rpx'}" 
+	:scroll-left="scrollLeft">
+		<view class="gui-scroll-x-items gui-columns" 
+		:id="'tab-'+index+(random+'')" 
+		:style="{
+			width:size == 0 ? 'auto' : size+'rpx', 
+			marginRight:margin+'rpx', paddingLeft:padding, paddingRight:padding
+		}" 
+		v-for="(item, index) in itemsIn" :key="index" @tap="change" :data-index="index">
+			<text :class="['gui-block-text', 'gui-border-box', currentIndexIn == index ? 'nav-active' : '']"
+			:style="{
+				color:currentIndexIn == index ? activeColor : color, 
+				textAlign : textAlign, lineHeight:lineHeight, 
+				fontSize:currentIndexIn == index ? activeFontSize : fontSize, 
+				fontWeight:currentIndexIn == index ? activeFontWeight : ''}">{{item.name}}</text>
+			<view class="gui-flex gui-rows" :style="{justifyContent:activeDirection}">
+				<view class="nav-active-line" 
+				:class="[currentIndexIn == index && animatie ?'gui-nav-scale':'']" 
+				:style="{
+					backgroundImage:activeLineBg, width:activeLineWidth, 
+					height:activeLineHeight, borderRadius:activeLineRadius
+				}" 
+				v-if="currentIndexIn == index"></view>
+			</view>
+		</view>
+	</scroll-view>
+</template>
+<script>
+export default {
+	name  : "gui-switch-navigation",
+	props : {
+		width              : {type : Number,  default : 690},
+		isCenter           : {type : Boolean, default : false},
+		currentIndex       : {type : Number,  default : 0},
+		size               : {type : Number,  default : 120},
+		fontSize           : {type : String,  default : '28rpx'},
+		activeFontSize     : {type : String,  default : '28rpx'},
+		items              : {type : Array,   default : function () {return []}},
+		activeLineBg       : {type : String,  default : "linear-gradient(to right, #66BFFF,#3388FF)"},
+		color              : {type : String,  default : "#333333"},
+		activeColor        : {type : String,  default : "#333333"},
+		activeLineHeight   : {type : String,  default : '6rpx'},
+		activeLineWidth    : {type : String,  default : "36rpx"},
+		activeLineRadius   : {type : String,  default : "0rpx"},
+		activeDirection    : {type : String,  default : ""},
+		activeFontWeight   : {type : Number,  default : 700},
+		margin             : {type : Number,  default : 0},
+		textAlign          : {type : String,  default : ''},
+		lineHeight         : {type : String,  default : '50rpx'},
+		padding            : {type : String,  default : '0rpx'},
+		animatie           : {type : Boolean, default : true},
+		autoLeft           : {type : String,  default : ''},
+		scorllAnimation    : {type : Boolean, default : true}
+	},
+	data(){
+		return {
+			currentIndexIn : 0,
+			itemsIn        : [],
+			random         : 1,
+			scrollLeft     : 0,
+			scrllTimer     : null
+		}
+	},
+	created:function(){
+		this.currentIndexIn = this.currentIndex;
+		this.itemsIn        = this.items;
+		this.random         = this.randomNum();
+	},
+	watch:{
+		currentIndex : function(value){
+			this.currentIndexIn = value;
+		},
+		currentIndexIn : function(val){
+			if(this.isCenter){return ;}
+			if(this.scrllTimer != null){clearTimeout(this.scrllTimer);}
+			this.scrllTimer = setTimeout(()=>{this.setLeft();}, 200);
+		},
+		items        : function(value){ this.itemsIn = value; }
+	},
+	methods:{
+		change    : function (e){
+			this.currentIndexIn = e.currentTarget.dataset.index;
+			this.$emit('change', Number(e.currentTarget.dataset.index))
+		},
+		randomNum : function () {
+			return parseInt(Math.random() * 1000);
+		},
+		setLeft   : function () {
+			if(this.isCenter){return ;}
+			var itemWidth = Number(this.margin) + Number(this.size);
+			var left      = (Number(this.currentIndexIn) + 1) * itemWidth - Number(this.width) / 2 - itemWidth / 2;
+			var maxLeft   = Number(this.itemsIn.length) * itemWidth - this.width;
+			maxLeft       = uni.upx2px(maxLeft - 30);
+			left          = uni.upx2px(left);
+			if(left > maxLeft){left = maxLeft;}
+			if(left < 0){left = 0;}
+			this.scrollLeft = left;
+		}
+	}
+}
+</script>
+<style scoped>
+.nav-active-line{margin-top:6rpx;}
+.gui-nav-center{justify-content:center; text-align:center;}
+/* #ifndef APP-NVUE */
+@keyframes gui-nav-scale{0%{transform: scale(0.1);} 100%{transform: scale(1);}}
+.gui-nav-scale{animation:gui-nav-scale 350ms forwards;}
+/* #endif */
+</style>

+ 101 - 0
lib/GraceUI5/components/gui-switch-navigation2.vue

@@ -0,0 +1,101 @@
+<template>
+	<scroll-view :scroll-with-animation="scorllAnimation" :scroll-x="true" :show-scrollbar="false" 
+	:class="['gui-scroll-x', isCenter ? 'gui-nav-center' : '']" 
+	:style="{width:width+'rpx'}" 
+	:scroll-left="scrollLeft">
+		<view class="gui-scroll-x-item gui-columns gui-relative" :id="'tab-'+index+(random+'')" 
+		:style="{width:size+'rpx', height:(lineHeight+lineHeightSamll+25)+'rpx'}" 
+		v-for="(item, index) in itemsIn" :key="index" @tap="navchange" :data-index="index">
+			<text 
+			:class="['gui-block-text','gui-text-center']"
+			:style="{
+			color:currentIndexIn == index ? activeColor : color, 
+			lineHeight:lineHeight+'rpx', height:lineHeight+'rpx',
+			fontSize:currentIndexIn == index ? activeFontSize : fontSize, 
+			fontWeight:currentIndexIn == index ? 'bold' : ''}">{{item.title}}</text>
+			<text :class="['gui-block-text','gui-text-center']"
+			:style="{
+			color:currentIndexIn == index ? activeColor : descColor, 
+			lineHeight:lineHeightSamll+'rpx', height:lineHeightSamll+'rpx', 
+			fontSize:fontSizeSmall}">{{item.desc}}</text>
+			<view class="nav2-active-line-in gui-flex gui-rows gui-justify-content-center gui-fade-in" 
+			v-if="currentIndexIn == index">
+				<view class="nav2-active-line" :style="{borderColor:activeColor}"></view>
+			</view>
+		</view>
+	</scroll-view>
+</template>
+<script>
+export default {
+	name  : "gui-switch-navigation2",
+	props : {
+		width           : {type : Number,  default : 690},
+		isCenter        : {type : Boolean, default : false},
+		currentIndex    : {type : Number,  default : 0},
+		size            : {type : Number,  default : 138},
+		fontSize        : {type : String,  default : '28rpx'},
+		activeFontSize  : {type : String,  default : '28rpx'},
+		lineHeight      : {type : Number,  default : 52},
+		fontSizeSmall   : {type : String,  default : '22rpx'},
+		lineHeightSamll : {type : Number,  default : 28},
+		items           : {type : Array,   default : function () {return []}},
+		color           : {type : String,  default : "#2B2E3D"},
+		descColor       : {type : String,  default : "#999999"},
+		activeColor     : {type : String,  default : "#3688FF"},
+		autoLeft        : {type : String,  default : ''},
+		scorllAnimation : {type : Boolean, default : true},
+	},
+	data() {
+		return {
+			currentIndexIn : 0,
+			itemsIn        : [],
+			random         : 1,
+			scrollLeft     : 0,
+			scrllTimer     : null
+		}
+	},
+	created:function(){
+		this.currentIndexIn = this.currentIndex;
+		this.itemsIn        = this.items;
+		this.random         = this.randomNum();
+	},
+	watch:{
+		currentIndex : function(value){ this.currentIndexIn = value; },
+		items        : function(value){ this.itemsIn = value; },
+		currentIndexIn : function(val){
+			if(this.isCenter){return ;}
+			if(this.scrllTimer != null){clearTimeout(this.scrllTimer);}
+			this.scrllTimer = setTimeout(()=>{this.setLeft();}, 200);
+		}
+	},
+	methods:{
+		navchange : function (e){
+			this.currentIndexIn = e.currentTarget.dataset.index;
+			this.$emit('change', Number(e.currentTarget.dataset.index))
+		},
+		randomNum : function () {
+			return parseInt(Math.random() * 1000);
+		},
+		setLeft   : function () {
+			if(this.isCenter){return ;}
+			var itemWidth =  Number(this.size);
+			var left      = (Number(this.currentIndexIn) + 1) * itemWidth - Number(this.width) / 2 - itemWidth / 2;
+			var maxLeft   = Number(this.itemsIn.length) * itemWidth - this.width;
+			maxLeft       = uni.upx2px(maxLeft);
+			left          = uni.upx2px(left);
+			if(left > maxLeft){left = maxLeft;}
+			if(left < 0){left = 0;}
+			this.scrollLeft = left;
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-nav-center{justify-content:center; text-align:center;}
+.nav2-active-line-in{height:18rpx; overflow:hidden; margin-top:6rpx;}
+.nav2-active-line{width:18rpx; height:18rpx; border-radius:20rpx; 
+border-width:6rpx; border-style:solid; margin-top:-15rpx;}
+/* #ifdef APP-NVUE */
+.nav2-active-line{width:30rpx; height:30rpx;}
+/* #endif */
+</style>

+ 52 - 0
lib/GraceUI5/components/gui-tags.vue

@@ -0,0 +1,52 @@
+<template>
+	<text :class="[
+		bgClass, 'gui-block-text', 'gui-tags', 'gui-ellipsis', 'gui-border', 
+		tapping ? 'gui-tag-opacity':'']" 
+		:style="{
+		width:width == 0 ? '' : width+'rpx',
+		color:color,
+		paddingLeft:padding+'rpx',
+		paddingRight:padding+'rpx',
+		lineHeight:(size*lineHeight)+'rpx',
+		height:(size*lineHeight)+'rpx', 
+		fontSize:size+'rpx',
+		borderRadius:borderRadius+'rpx',
+		marginRight:margin+'rpx',
+		marginBottom:margin+'rpx',
+		borderColor:borderColor
+		}" @tap="tapme">{{text}}</text>
+</template>
+<script>
+export default{
+	name  : "gui-tags",
+	props : {
+		width        : {type:Number, default:0},
+		text         : {type:String, default:''},
+		size         : {type:Number, default:26},
+		lineHeight   : {type:Number, default:1.8},
+		padding      : {type:Number, default:15},
+		margin       : {type:Number, default:15},
+		bgClass      : {type:String, default:'gui-bg-blue'},
+		color        : {type:String, default:'#FFFFFF'},
+		borderRadius : {type:Number, default:6},
+		data         : {type:Array, default:function(){return [];}},
+		borderColor  : {type:String, default:'#FFFFFF'}
+	},
+	data() {
+		return {
+			tapping : false
+		}
+	},
+	methods:{
+		tapme : function(){
+			this.tapping = true;
+			setTimeout(()=>{this.tapping = false}, 200);
+			this.$emit('tapme', this.data);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-tags{text-align:center;}
+.gui-tag-opacity{opacity:0.88;}
+</style>

+ 96 - 0
lib/GraceUI5/components/gui-top-message.vue

@@ -0,0 +1,96 @@
+<template>
+	<view class="gui-top-message" 
+	ref="guipopupfortopmsg" 
+	v-if="show" 
+	:style="{top : navHeight+'px'}" 
+	:class="[out ? 'gui-top-message-out' : 'gui-top-message-in']">
+		<slot></slot>
+	</view>
+</template>
+<script>
+// #ifdef APP-NVUE
+const animation = weex.requireModule('animation');
+// #endif
+var graceJS = require('@/GraceUI5/js/grace.js');
+export default{
+	name  : "gui-top-message",
+	props : {
+		duration  : {type:Number,  default:2000},
+		customNav : {type:Boolean, default:false }
+	},
+	data() {
+		return {
+			show    : false,
+			out     : false,
+			navHeight : 0
+		}
+	},
+	created : function (){
+		this.customNavSet();
+	},
+	methods:{
+		customNavSet : function () {
+			if(!this.customNav){
+				// #ifdef H5
+				this.navHeight = 44;
+				// #endif
+				// #ifndef H5
+				this.navHeight = 0;
+				// #endif
+			}else{
+				var system = graceJS.system();
+				this.navHeight = system.statusBarHeight;
+			}
+		},
+		open : function(){
+			this.out  = false;
+			this.show = true;
+			// #ifdef APP-NVUE
+			this.weexAnimateIn();
+			// #endif
+			setTimeout(()=>{this.close();}, this.duration);
+		},
+		close : function(){
+			this.out = true;
+			// #ifdef APP-NVUE
+			this.weexAnimateOut();
+			// #endif
+			setTimeout(()=>{this.show = false;},350);
+		},
+		// #ifdef APP-NVUE
+		weexAnimateIn : function(){
+			graceJS.getRefs('guipopupfortopmsg', this, 0, (guipopupref)=>{
+				animation.transition(guipopupref, {
+					styles: {transform:'translateY(0px)', opacity:1},
+					duration: 350, //ms
+					timingFunction: 'ease',
+					delay: 0 //ms
+				});
+			});
+		},
+		weexAnimateOut : function(){
+			graceJS.getRefs('guipopupfortopmsg', this, 0, (guipopupref)=>{
+				animation.transition(guipopupref, {
+					styles: {transform:'translateY(-200px)', opacity:0},
+					duration: 350, //ms
+					timingFunction: 'ease',
+					delay: 0 //ms
+				});
+			});
+		},
+		// #endif
+	}
+}
+</script>
+<style scoped>
+.gui-top-message{position:fixed; left:0; top:0; width:750rpx; z-index:900; transform:translateY(-200px); opacity:0.1;}
+/* #ifdef H5 */
+.gui-top-message{top:44px;}
+/* #endif */
+/* #ifndef APP-NVUE */
+@keyframes gui-top-message-in{0%{transform:translateY(-200px); opacity:0.1;} 100%{transform:translateY(0px); opacity:1;}}
+.gui-top-message-in{animation:gui-top-message-in 350ms linear forwards;}
+@keyframes gui-top-message-out{0%{transform:translateY(0px);  opacity:1;} 100%{transform:translateY(-200px); opacity:1;}}
+.gui-top-message-out{animation:gui-top-message-out 350ms linear forwards;}
+/* #endif */
+</style>

+ 61 - 0
lib/GraceUI5/components/gui-totop.vue

@@ -0,0 +1,61 @@
+<template>
+	<view class="gui-totop gui-fade-in" 
+	hover-class="gui-tap" 
+	v-if="show" 
+	@tap="totop" 
+	:style="{
+		bottom:bottom,right:right,
+		backgroundColor:background,zIndex:zIndex,
+		borderRadius:borderRadius
+	}">
+		<text class="gui-icons gui-block-text gui-totop-text"
+		:style="{
+			color:color,
+			fontSize:fontSize
+		}">&#xe637;</text>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-totop",
+	props : {
+		top        : { type : Number, default : 0 },
+		color      : { type : String, default : "#008AFF" },
+		bottom     : { type : String, default : "80rpx" },
+		right      : { type : String, default : "30rpx" },
+		background : { type : String, default : "#FFFFFF"},
+		borderRadius  : { type : String, default : "6rpx" },
+		zIndex     : { type : Number, default : 9},
+		fontSize   : { type : String, default : "44rpx" }
+	},
+	data() {
+		return {
+			show  : false,
+			timer : null
+		}
+	},
+	watch:{
+		top : function(topVal){
+			if(this.timer != null){clearTimeout(this.timer);}
+			this.timer = setTimeout(()=>{
+				this.show = topVal > 100 ? true : false;
+			}, 80);
+		}
+	},
+	methods:{
+		totop : function(){
+			// #ifndef APP-NVUE
+			uni.pageScrollTo({
+				scrollTop:0,
+				duration:100
+			})
+			// #endif
+			this.$emit('totop');
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-totop{width:80rpx; height:80rpx; position:fixed;}
+.gui-totop-text{width:80rpx; height:80rpx; line-height:80rpx; font-size:38rpx; text-align:center;}
+</style>

+ 130 - 0
lib/GraceUI5/components/gui-touch.vue

@@ -0,0 +1,130 @@
+<template>
+	<view 
+	@touchstart="touchstart" 
+	@touchmove="touchmove" 
+	@touchend="touchend">
+		<slot></slot>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-touch",
+	props : {
+		datas:{type:Array, default:function(){return [];}}
+	},
+	data() {
+		return {
+			toucheTimer  : 0,
+			fingerRes    : [],
+			distance     : 0,
+			taptimer     : 100
+		}
+	},
+	methods:{
+		toInt : function(arr){
+			var res = [];
+			arr.forEach((item)=>{
+				item.pageX = parseInt(item.pageX);
+				item.pageY = parseInt(item.pageY);
+				res.push(item);
+			});
+			return res;
+		},
+		touchstart : function(e){
+			this.toucheTimer  = new Date().getTime();
+			this.fingerRes    = this.toInt(e.changedTouches);
+			if(this.fingerRes.length > 2){return ;}
+			var moves = [], i = 0;
+			this.fingerRes.forEach((finger)=>{
+				var xTouch = finger.pageX;
+				var yTouch = finger.pageY;
+				moves.push([xTouch, yTouch]);
+				i++;
+			});
+			this.$emit('thStart', moves, this.datas);
+		},
+		touchmove : function(e){
+			if(this.toucheTimer < 50){return ;}
+			var timer = new Date().getTime() - this.toucheTimer;
+			if(timer < this.taptimer){return ;}
+			var touches = this.toInt(e.changedTouches);
+			if(touches.length > 2){return ;}
+			if(touches.length == 1){
+				var i = 0, moves = [];
+				touches.forEach((finger)=>{
+					var xTouch = finger.pageX - this.fingerRes[i].pageX;
+					var yTouch = finger.pageY - this.fingerRes[i].pageY;
+					moves.push([xTouch, yTouch]);
+					i++;
+				});
+				this.$emit('thMove', moves, this.datas);
+			}
+			else if(touches.length == 2){
+				if(this.distance == 0){
+					this.distance = parseInt(this.getDistance(touches[0].pageX,touches[0].pageY, touches[1].pageX, touches[1].pageY));
+				}else{
+					var distance1 = parseInt(this.getDistance(touches[0].pageX,touches[0].pageY, touches[1].pageX, touches[1].pageY));
+					var scale = distance1 / this.distance;
+					scale = Math.floor(scale * 100) / 100;
+					this.$emit('scale', scale, this.datas);
+				}
+			}
+		},
+		touchend : function (e){
+			var timer = new Date().getTime() - this.toucheTimer;
+			if(timer < this.taptimer){
+				this.$emit('tapme'); 
+				return ;
+			}
+			var touches   = this.toInt(e.changedTouches);
+			this.distance = 0;
+			if(touches.length == 1){
+				var i = 0, moves = [];
+				touches.forEach((finger)=>{
+					var xTouch = finger.pageX - this.fingerRes[i].pageX;
+					var yTouch = finger.pageY - this.fingerRes[i].pageY;
+					moves.push([xTouch, yTouch]);
+					i++;
+				});
+				moves.push(timer);
+				this.$emit('thEnd', moves, this.datas);
+				// 根据时间及距离决定滑动时间
+				if(timer < 300){
+					var mx = Math.abs(moves[0][0]);
+					var my = Math.abs(moves[0][1]);
+					if(mx > my){
+						if(mx >= 50){
+							if(moves[0][0] > 0){
+								this.$emit('swipe', 'right', this.datas);
+							}else{
+								this.$emit('swipe', 'left', this.datas);
+							}
+						}
+					}else{
+						if(my >= 50){
+							if(moves[0][1] > 0){
+								this.$emit('swipe', 'down', this.datas);
+							}else{
+								this.$emit('swipe', 'up', this.datas);
+							}
+						}
+					}
+				}
+			}
+		},
+		getDistance : function (lat1,  lng1,  lat2,  lng2){
+			var radLat1  = lat1*Math.PI / 180.0;
+			var radLat2  = lat2*Math.PI / 180.0;
+			var a        = radLat1 - radLat2;
+			var b        = lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;
+			var s        = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
+			s            = s * 6378.137;
+			return Math.round(s * 10000) / 10000;
+		},
+		tapme : function(){
+			this.isTap = true;
+		}
+	}
+}
+</script>
+<style scoped></style>

+ 138 - 0
lib/GraceUI5/components/gui-tree.vue

@@ -0,0 +1,138 @@
+<template>
+	<view>
+		<view 
+		v-for="(tree,index) in treesIN" 
+		:key="index">
+			<view class="gui-flex gui-rows gui-nowrap gui-align-items-center gui-tree" 
+			:data-havsons="tree.children" 
+			:data-treeindexs="indexesIn" 
+			:data-index="index" 
+			:data-id="tree.id" 
+			:data-treelevel="level" 
+			:data-cancheck="(allCanCheck || !tree.children)" 
+			:style="{paddingLeft:(indent*level)+'rpx'}" 
+			@tap.stop="taped">
+				<view class="gui-tree-icons" 
+				:data-id="tree.id" 
+				@tap.stop="fold" 
+				v-if="type == 'text' && isIcon">
+					<text class="gui-tree-icons-text gui-icons" 
+					v-if="tree.children">&#xe62d;</text>
+				</view>
+				<view class="gui-tree-icons" 
+				v-if="type == 'radio' && (allCanCheck || !tree.children)">
+					<text class="gui-tree-icons-text gui-icons gui-tree-current gui-fade-in" 
+					v-if="tree.id == checkedId">&#xe7f8;</text>
+					<text class="gui-tree-icons-text gui-icons" 
+					v-else>&#xe762;</text>
+				</view>
+				<view class="gui-tree-icons" 
+				v-if="type == 'checkbox' && (allCanCheck || !tree.children)">
+					<text class="gui-tree-icons-text gui-icons gui-tree-current gui-fade-in" 
+					v-if="isChecked(tree.id)">&#xe685;</text>
+					<text class="gui-tree-icons-text gui-icons icon-checkbox" v-else>&#xe762;</text>
+				</view>
+				<text class="gui-block-text gui-tree-title gui-flex1">{{tree.label}}</text>
+			</view>
+			<view>
+				<gui-tree v-if="arrayIndexOf(notids, tree.id) == -1" 
+				:trees="tree.children" :indent="indent" 
+				:level="level+1" :allCanCheck="allCanCheck" 
+				:isIcon="isIcon" :checkedId="checkedId" 
+				:checkedIds="checkedIds" 
+				:type="type" :indexes="[indexesIn,index]" @taped="tapbase"></gui-tree>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-tree",
+	props : {
+		trees        : {type:Array,   default:function () {return [];}},
+		indent       : {type:Number,  default:28},
+		level        : {type:Number,  default:0},
+		type         : {type:String,  default:'text'},
+		isIcon       : {type:Boolean, default:true},
+		indexes      : {type:Array,   default:function () {return ['',0];}},
+		checkedId    : {type:[String, Number], default:'-1'},
+		checkedIds   : {type:Array,   default:function () {return [];}},
+		allCanCheck  : {type:Boolean, default:true},
+		isFold       : {type:Boolean, default:true}
+	},
+	data() {
+		return {
+			treesIN   : [],
+			indexesIn : [],
+			notids    : []
+		}
+	},
+	created:function(){
+		this.treesIN = this.trees;
+		if(this.indexes[0] != ''){
+			var indexes  =  this.indexes[0].split(',');
+		}else{
+			var indexes = [];
+		}
+		indexes.push(this.indexes[1]);
+		this.indexesIn = indexes.join(',');
+	},
+	watch:{
+		type : function(){
+			this.notids = [];
+		}
+	},
+	methods:{
+		fold  : function (e) {
+			var id            = e.currentTarget.dataset.id;
+			if(this.isFold){
+				var res = this.arrayIndexOf(this.notids, id);
+				if(res == -1){
+					this.notids.push(id);
+				}else{
+					this.notids.splice(res,1);
+				}
+			}
+			e.stopPropagation();
+			return ;
+		},
+		taped : function(e){
+			var treeindexs    = e.currentTarget.dataset.treeindexs;
+			treeindexs        = treeindexs.split(',');
+			var index         = e.currentTarget.dataset.index;
+			treeindexs.push(index);
+			treeindexs.shift();
+			if(this.type == 'text'){
+				this.tapbase(treeindexs);
+			}else{
+				var cancheck = e.currentTarget.dataset.cancheck;
+				if(cancheck){this.tapbase(treeindexs);}
+			}
+			e.stopPropagation();
+		},
+		tapbase : function(e){
+			this.$emit('taped', e);
+		},
+		setTrees : function (trees) {
+			this.treesIN = trees;
+		},
+		isChecked : function(checkedId){
+			for(let i = 0; i < this.checkedIds.length; i++){
+				if(this.checkedIds[i] == checkedId){
+					return true;
+				}
+			}
+			return false;
+		},
+		arrayIndexOf : function(arr, needFind){
+			var index = -1;
+			for(let i = 0; i < arr.length; i++){
+				if(arr[i] == needFind){index = i; return i;}
+			}
+			return index;
+		}
+	}
+}
+</script>
+<style scoped>
+</style>

+ 173 - 0
lib/GraceUI5/components/gui-turntable.vue

@@ -0,0 +1,173 @@
+<template>
+	<view class="gui-turntable" 
+	:animation="animationData">
+		<view class="gui-turntable-item" 
+		v-for="(item, index) in rewardNames" :key="index" 
+		:style="{
+			transform  : 'rotate('+(inital - averageRotate * index)+'deg)'
+		}">
+			<view class="gui-turntable-inner" 
+			:style="{
+			transform: 'translateX(-300rpx) rotate(' + averageRotate + 'deg)',
+			background : rewardBGColors[index]
+			}">
+				<text class="gui-turntable-text" 
+				:style="{
+					transform : 'translateY(120rpx) translateX('+textTrX+') rotate('+textRotate+')',
+					fontSize  : fontSize,
+					color     : rewardColors[index]
+				}">{{item}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default{
+	name  : "gui-turntable",
+	props : {
+		// 奖品名称
+		rewardNames : {
+			type : Array,
+			default : function(){
+				return ["", "", "", "", "", ""];
+			}
+		},
+		// 奖品展示区背景颜色
+		rewardBGColors : {
+			type : Array,
+			default : function(){
+				return [];
+			}
+		},
+		// 奖品展示区文本颜色
+		rewardColors : {
+			type : Array,
+			default : function(){
+				return [];
+			}
+		},
+		// 文本尺寸
+		fontSize : {
+			type : String,
+			default : '32rpx'
+		}
+	},
+	data() {
+		return {
+			// 是否正在抽奖
+			luckyStatus     : 0,
+			// 动画对象
+			animationData   : {},
+			tpmimgtimmer    : null,
+			// 中奖奖品 index
+			RewardIndex     : -1,
+			// 角度
+			averageRotate   : 0,
+			inital          : 0,
+			textTrX         : '43rpx',
+			textRotate      : '-30deg'
+		}
+	},
+	created:function(){
+		this.init();
+	},
+	watch:{
+		rewardNames:function(){
+			this.init();
+		}
+	},
+	methods:{
+		init : function(){
+			var length          = this.rewardNames.length;
+			this.averageRotate  = 360 / length ;
+			this.inital         = (360 / length / 2) * -1;
+			switch(length){
+				case 4:
+					this.textTrX    = '0rpx';
+					this.textRotate = '-45deg';
+					break
+				case 6:
+					this.textTrX    = '43rpx';
+					this.textRotate = '55deg';
+					break
+				case 8:
+					this.textTrX    = '72rpx';
+					this.textRotate = '65deg';
+					break
+			}
+			var animation      = null;
+			animation = uni.createAnimation({
+				duration: 0,
+				timingFunction: 'ease',
+			});
+			animation.rotateZ(this.averageRotate/2).step();
+			this.animationData = animation.export();
+		},
+		goto : function(index){
+			if(this.luckyStatus != 0){
+				return ;
+			}
+			this.RewardIndex = index;
+			this.animationData = {};
+			this.luckyStatus   = 1;
+			
+			// 轮盘归零
+			var animation      = null;
+			animation = uni.createAnimation({
+				duration: 0,
+				timingFunction: 'ease',
+			});
+			animation.rotateZ(this.averageRotate/2).step();
+			this.animationData = animation.export();
+			
+			// 计算奖品角度
+			var rewardRadiu     = (360 / this.rewardNames.length);
+			var rewardRadiuNeed = 360*6 + rewardRadiu * this.RewardIndex;
+			setTimeout(()=>{
+				animation = uni.createAnimation({
+					duration:5000,
+					timingFunction: 'ease',
+				});
+				animation.rotateZ(rewardRadiuNeed).step();
+				this.animationData = animation.export();
+			},100);
+			setTimeout(()=>{
+				// 停止动画
+				this.luckyStatus = 0;
+				this.$emit('end', index);
+				this.RewardIndex = -1;
+			},5000);
+		}
+	}
+}
+</script>
+<style scoped>
+.gui-turntable{
+  position : relative;
+  transform-origin: center;
+  width    : 600rpx;
+  height   : 600rpx;
+}
+.gui-turntable-item {
+  position : absolute;
+  left     : 50%;
+  width    : 300rpx;
+  height   : 600rpx;
+  border-radius:0px 300rpx 300rpx 0;
+  overflow : hidden;
+  transform-origin : left center;
+}
+
+.gui-turntable-inner {
+  text-align: center;
+  width  : 300rpx;
+  height : 600rpx;
+  transform-origin : right center;
+  border-radius : 300rpx 0 0 300rpx;
+}
+
+.gui-turntable-text {
+  display: block;
+  transform-origin:center;
+}
+</style>

+ 248 - 0
lib/GraceUI5/components/gui-upload-images.vue

@@ -0,0 +1,248 @@
+<template>
+	<view class="gui-flex gui-rows gui-wrap">
+		<view class="gui-add-list-items" :style="{borderRadius:borderRadius}" 
+		v-for="(item, index) in imgLists" :key="index">
+			<image :src="item.url" :data-imgurl="item.url" 
+			:style="{borderRadius:borderRadius}" 
+			@tap="showImgs" class="gui-add-list-img" :mode="imgMode"></image>
+			<!-- 进度条 -->
+			<view class="gui-upload-progress">
+			   <progress :percent="item.progress" 
+			   :stroke-width="progressSize" :activeColor="progressColor" 
+			   :backgroundColor="progressBGColor" />
+			</view>
+			<!-- 上传失败 -->
+			<view class="gui-add-list-reup gui-flex gui-columns gui-justify-content-center gui-align-items-center" 
+			@tap.stop="retry" :data-index="index" v-if="item.error">
+				<text class="gui-add-list-reup-icon gui-icons icon-retry gui-color-white">&#xe635;</text>
+				<text class="gui-add-list-reup-text gui-color-white">失败重试</text>
+			</view>
+			<!-- 删除 -->
+			<text class="gui-add-list-remove gui-icons" 
+			:style="{color:removeBtnColor}" @tap="removeImg" 
+			:id="'gui-items-img-'+index">&#xe632;</text>
+		</view>
+		<view class="gui-add-list-items gui-flex gui-columns gui-justify-content-center gui-align-items-center" 
+		@tap="addImg" v-if="imgLists.length < maxFileNumber" 
+		:style="{borderRadius:borderRadius}">
+			<text class="gui-add-list-btn-icon gui-block-text gui-color-gray">+</text>
+			<text class="gui-add-list-btn-text gui-block-text gui-color-gray">{{btnName}}</text>
+		</view>
+	</view>
+</template>
+<script>
+var graceJS = require('@/GraceUI5/js/grace.js');
+export default {
+	name  : "gui-upload-images",
+	props : {
+		maxFileNumber   : { type : Number, default : 9 },
+		btnName         : { type : String, default : "添加照片" },
+		items           : { type : Array,  default : function () {return []; }},
+		removeBtnColor  : { type : String, default : "rgba(0, 0, 0, 0.8)" },
+		sourceType      : { type : Array,  default : function () {return ['album', 'camera'];}},
+		borderRadius    : { type : String, default : "10rpx" },
+		uploadServerUrl : { type : String, default : '' },
+		progressSize    : { type : Number, default : 2},
+		progressColor   : { type : String, default : '#27BD81' },
+		progressBGColor : { type : String, default : '#F8F8F8' },
+		fileName        : { type : String, default : 'img'},
+		formData        : { type : Object, default : function(){return {};}},
+		imgMode         : { type : String, default : 'aspectFill'},
+		header          : { type : Object, default : function(){return {};}},
+		save2uniCloud   : { type : Boolean, default :false }
+	},
+	data() {
+		return {
+			imgLists  : [],
+			updatting : false
+		}
+	},
+	created : function () {
+		this.initImgs();
+	},
+	watch   : {
+		items : function(){ this.initImgs(); }
+	},
+    methods : {
+		initImgs     : function(){
+			var imgs = [];
+			for(let i = 0; i < this.items.length; i++){
+				imgs.push({url:this.items[i],  progress : 100});
+			}
+			this.imgLists = imgs;
+		},
+        addImg       : function(){
+            var num = this.maxFileNumber - this.imgLists.length;
+            if(num < 1){return false;}
+            uni.chooseImage({
+                count      : num,
+                sizeType   : ['compressed'],
+				sourceType : this.sourceType,
+                success    : (res) => {
+					if(this.imgLists.length >= this.maxFileNumber){return ;}
+					for(let i = 0; i < res.tempFilePaths.length; i++){
+						if(this.imgLists.length >= this.maxFileNumber){break;}
+						this.imgLists.push({url:res.tempFilePaths[i], progress:0});
+					}
+                    this.$emit('change', this.imgLists);
+                },
+				complete   : function(){}
+            });
+        },
+        removeImg    : function(e){
+            var index = e.currentTarget.id.replace('gui-items-img-', '');
+			var removeImg =  this.imgLists.splice(index, 1);
+			this.$emit('removeImg', removeImg[0]);
+			this.$emit('change'   , this.imgLists);
+        },
+        showImgs     : function(e){
+            var currentImg = e.currentTarget.dataset.imgurl;
+			var imgs       = [];
+			for(let i = 0; i < this.imgLists.length; i++){
+				imgs.push(this.imgLists[i].url);
+			}
+            uni.previewImage({urls:imgs, current:currentImg});
+        },
+		setItems     : function(items){
+			this.imgLists = [];
+			for(let i = 0; i < items.length; i++){
+				this.imgLists.push({url:items[i], progress:100});
+			}
+			this.$emit('change'   , this.imgLists);
+		},
+		clearAllImgs : function () { this.imgLists = [];},
+		retry        : function (e) {
+			var index = e.currentTarget.dataset.index;
+			this.upload(index);
+		},
+		upload       : function(index){
+			if(this.updatting){return ;}
+			this.updatting   = true;
+			if(!index){index = 0;}
+			uni.showLoading({title:"图片上传中", mask:true});
+			if(this.save2uniCloud){
+				this.upload2cloud(index);
+			}else{
+				this.uploadBase(index);
+			}
+		},
+		uploadBase : function (index) {
+			// 全部上传完成
+			if(index > (this.imgLists.length - 1)){
+				uni.hideLoading();
+				this.updatting = false;
+				this.$emit('uploaded', this.imgLists);
+				return ;
+			}
+			// 验证后端
+			if(this.uploadServerUrl == ''){
+				uni.showToast({title:"请设置上传服务器地址", icon:"none"});
+				return ;
+			}
+			// 检查是否是默认值
+			if(this.imgLists[index].progress >= 1){
+				this.uploadBase(index+1);
+				return ;
+			}
+			this.imgLists[index].error = false;
+			// 创建上传对象
+			const task = uni.uploadFile({
+				url      : this.uploadServerUrl,
+				filePath : this.imgLists[index].url,
+				name     : this.fileName,
+				formData : this.formData,
+				header   : this.header,
+				success  : (uploadRes) => {
+					try{
+						uploadRes = JSON.parse(uploadRes.data);
+						if(uploadRes.status != 'ok'){
+							uni.showToast({title:"上传失败 : "+uploadRes.data, icon:"none"});
+							this.error(index);
+						}else{
+							//上传图片成功
+							this.imgLists[index].progress = 100;
+							this.imgLists[index].url      = uploadRes.data;
+							this.imgLists[index].result   = uploadRes;
+							this.uploadBase(index+1);
+						}
+					}catch(e){
+						this.error(index);
+					}
+				},
+				fail    : (e) => {
+					uni.showToast({title:"上传失败,请点击图片重试", icon:"none"});
+					this.error(index);
+					
+				}
+			});
+			task.onProgressUpdate((res) => {
+				if(res.progress > 0){
+					this.imgLists[index].progress = res.progress;
+					this.imgLists.splice(index, 1, this.imgLists[index]);
+				}
+			});
+		},
+		// 上传错误
+		error : function(index){
+			uni.hideLoading();
+			this.updatting = false;
+			setTimeout(()=>{
+				this.imgLists[index].progress = 0;
+				this.imgLists[index].error    = true;
+				this.imgLists.splice(index, 1, this.imgLists[index]);
+				this.$emit('uploaderror');
+			}, 500);
+		},
+		upload2cloud:function (index) {
+			// 全部上传完成
+			if(index > (this.imgLists.length - 1)){
+				uni.hideLoading();
+				this.updatting = false;
+				this.$emit('uploaded', this.imgLists);
+				return ;
+			}
+			// 检查是否是默认值
+			if(this.imgLists[index].progress >= 1){
+				this.upload2cloud(index+1);
+				return ;
+			}
+			this.imgLists[index].error = false;
+			// 创建上传对象
+			uniCloud.uploadFile({
+				filePath  : this.imgLists[index].url,
+				cloudPath : graceJS.uuid() + '.png',
+				onUploadProgress:(progressEvent) => {
+					var percentCompleted = Math.round(
+						(progressEvent.loaded * 100) / progressEvent.total
+					);
+					this.imgLists[index].progress = percentCompleted;
+					this.imgLists.splice(index, 1, this.imgLists[index]);
+				},
+				success : (uploadRes)=>{
+					//上传图片成功
+					this.imgLists[index].progress = 100;
+					this.imgLists[index].url      = uploadRes.fileID;
+					this.imgLists[index].result   = uploadRes;
+					this.imgLists.splice(index, 1, this.imgLists[index]);
+					this.upload2cloud(index+1);
+				},
+				fail : ()=>{
+					uni.showToast({title:"上传失败", icon:"none"});
+					this.error(index);
+				}
+			});
+		}
+    }
+}
+</script>
+<style scoped>
+.gui-add-list-btn-text{font-size:26rpx; line-height:36rpx; text-align:center;}
+.gui-add-list-btn-icon{font-size:80rpx; height:80rpx; line-height:80rpx; margin-bottom:20rpx;}
+.gui-add-list-items{width:212rpx; height:212rpx; overflow:hidden; margin:9rpx; background-color:#F8F8F8; font-size:0; position:relative;}
+.gui-add-list-remove{width:60rpx; height:60rpx; line-height:60rpx; text-align:center; font-size:44rpx; position:absolute; z-index:5; right:0; top:0;}
+.gui-add-list-img{width:212rpx;}
+.gui-upload-progress{position:absolute; z-index:2; left:0; bottom:10rpx; width:180rpx; padding:0 16rpx;}
+.gui-add-list-reup{position:absolute; z-index:3; left:0; top:0rpx; width:212rpx; height:212rpx; background-color:rgba(0,0,0,0.3);}
+.gui-add-list-reup-icon{text-align:center; font-size:68rpx; line-height:100rpx;}
+.gui-add-list-reup-text{text-align:center; font-size:20rpx; line-height:30rpx;}
+</style>

File diff suppressed because it is too large
+ 0 - 0
lib/GraceUI5/css/animate.css


+ 168 - 0
lib/GraceUI5/css/colors.css

@@ -0,0 +1,168 @@
+/* 黑色 */
+.gui-color-black{color:#000000;}
+.gui-bg-black{background-color:#000000;}
+.gui-color-black1{color:#212121;}
+.gui-bg-black1{background-color:#212121;}
+.gui-color-black2{color:#303030;}
+.gui-bg-black2{background-color:#303030;}
+.gui-color-black3{color:#424242;}
+.gui-bg-black3{background-color:#424242;}
+
+
+/* 灰色 */
+.gui-color-grey{color:#616161;}
+.gui-bg-grey{background-color:#616161;}
+.gui-color-grey1{color:#757575;}
+.gui-bg-grey1{background-color:#757575;}
+.gui-color-grey2{color:#9E9E9E;}
+.gui-bg-grey2{background-color:#9E9E9E;}
+.gui-color-grey3{color:#BDBDBD;}
+.gui-bg-grey3{background-color:#BDBDBD;}
+.gui-color-grey4{color:#D6D6D6;}
+.gui-bg-grey4{background-color:#D6D6D6;}
+.gui-color-grey5{color:#E0E0E0;}
+.gui-bg-grey5{background-color:#E0E0E0;}
+.gui-color-grey5{color:#EEEEEE;}
+.gui-bg-grey5{background-color:#EEEEEE;}
+.gui-color-grey6{color:#F5F5F5;}
+.gui-bg-grey6{background-color:#F5F5F5;}
+.gui-color-grey7{color:#FAFAFA;}
+.gui-bg-grey7{background-color:#FAFAFA;}
+
+/* 红色 */
+.gui-color-red{color:#FF0000;}
+.gui-bg-red{background-color:#FF0000;}
+.gui-color-red1{color:#FF0036;}
+.gui-bg-red1{background-color:#FF0036;}
+.gui-color-red2{color:#F44336;}
+.gui-bg-red2{background-color:#F44336;}
+.gui-color-red3{color:#EF5350;}
+.gui-bg-red3{background-color:#EF5350;}
+
+/* 粉色 */
+.gui-color-pink{color:#E91E63;}
+.gui-bg-pink{background-color:#E91E63;}
+.gui-color-pink1{color:#FF5081;}
+.gui-bg-pink1{background-color:#FF5081;}
+.gui-color-pink2{color:#F58FB1;}
+.gui-bg-pink2{background-color:#F58FB1;}
+.gui-color-pink3{color:#FCE4EC;}
+.gui-bg-pink3{background-color:#FCE4EC;}
+
+/* 橙色 */
+.gui-color-orange{color:#FF3D00;}
+.gui-bg-orange{background-color:#FF3D00;}
+.gui-color-orange1{color:#FF6E40;}
+.gui-bg-orange1{background-color:#FF6E40;}
+.gui-color-orange2{color:#FFAB91;}
+.gui-bg-orange2{background-color:#FFAB91;}
+.gui-color-orange3{color:#FFCCBC;}
+.gui-bg-orange3{background-color:#FFCCBC;}
+
+/* 黄色 */
+.gui-color-yellow{color:#FFFF00;}
+.gui-bg-yellow{background-color:#FFFF00;}
+.gui-color-yellow1{color:#FFEB3B;}
+.gui-bg-yellow1{background-color:#FFEB3B;}
+.gui-color-yellow2{color:#FFEE58;}
+.gui-bg-yellow2{background-color:#FFEE58;}
+.gui-color-yellow3{color:#FFF9C5;}
+.gui-bg-yellow3{background-color:#FFF9C5;}
+
+/* 绿色 */
+.gui-color-green{color:#00FF00;}
+.gui-bg-green{background-color:#00FF00;}
+.gui-color-green1{color:#4CAF50;}
+.gui-bg-green1{background-color:#4CAF50;}
+.gui-color-green2{color:#66BB6A;}
+.gui-bg-green2{background-color:#66BB6A;}
+.gui-color-green3{color:#81C785;}
+.gui-bg-green3{background-color:#81C785;}
+.gui-color-green4{color:#A5D6A7;}
+.gui-bg-green4{background-color:#A5D6A7;}
+.gui-color-green4{color:#C8E6C9;}
+.gui-bg-green4{background-color:#C8E6C9;}
+.gui-color-green5{color:#E8F5E9;}
+.gui-bg-green5{background-color:#E8F5E9;}
+.gui-color-green5{color:#76FF03;}
+.gui-bg-green5{background-color:#76FF03;}
+.gui-color-green6{color:#9CCC65;}
+.gui-bg-green6{background-color:#9CCC65;}
+.gui-color-green7{color:#F1F8E9;}
+.gui-bg-green7{background-color:#F1F8E9;}
+
+/* 水鸭色 */
+.gui-color-teal{color:#00796B;}
+.gui-bg-teal{background-color:#00796B;}
+.gui-color-teal1{color:#00897B;}
+.gui-bg-teal1{background-color:#00897B;}
+.gui-color-teal2{color:#26A69A;}
+.gui-bg-teal2{background-color:#26A69A;}
+.gui-color-teal3{color:#B2DFDB;}
+.gui-bg-teal3{background-color:#B2DFDB;}
+
+/* 蓝色 */
+.gui-color-blue{color:#1565C0;}
+.gui-bg-blue{background-color:#1565C0;}
+.gui-color-blue1{color:#3688FF;}
+.gui-bg-blue1{background-color:#3688FF;}
+.gui-color-blue2{color:#1E88E5;}
+.gui-bg-blue2{background-color:#1E88E5;}
+.gui-color-blue3{color:#2196F3;}
+.gui-bg-blue3{background-color:#2196F3;}
+.gui-color-blue4{color:#42A5F5;}
+.gui-bg-blue4{background-color:#42A5F5;}
+.gui-color-blue5{color:#90CAF9;}
+.gui-bg-blue5{background-color:#90CAF9;}
+.gui-color-blue6{color:#BBDEFB;}
+.gui-bg-blue6{background-color:#BBDEFB;}
+.gui-color-blue7{color:#E3F2FD;}
+.gui-bg-blue7{background-color:#E3F2FD;}
+
+/* 蓝灰 */
+.gui-color-bluegrey{color:#455A64;}
+.gui-bg-bluegrey{background-color:#455A64;}
+.gui-color-bluegrey1{color:#546E7A;}
+.gui-bg-bluegrey1{background-color:#546E7A;}
+.gui-color-bluegrey2{color:#607D8B;}
+.gui-bg-bluegrey2{background-color:#607D8B;}
+.gui-color-bluegrey3{color:#78909C;}
+.gui-bg-bluegrey3{background-color:#78909C;}
+.gui-color-bluegrey4{color:#90A4Ae;}
+.gui-bg-bluegrey4{background-color:#90A4Ae;}
+.gui-color-bluegrey5{color:#B0BEC5;}
+.gui-bg-bluegrey5{background-color:#B0BEC5;}
+.gui-color-bluegrey6{color:#CFD8DC;}
+.gui-bg-bluegrey6{background-color:#CFD8DC;}
+.gui-color-bluegrey6{color:#ECEFF1;}
+.gui-bg-bluegrey6{background-color:#ECEFF1;}
+
+/* 青色 */
+.gui-color-cyan{color:#006065;}
+.gui-bg-cyan{background-color:#006065;}
+.gui-color-cyan1{color:#0097A7;}
+.gui-bg-cyan1{background-color:#0097A7;}
+.gui-color-cyan2{color:#80DEEA;}
+.gui-bg-cyan2{background-color:#80DEEA;}
+.gui-color-cyan3{color:#E0F7FA;}
+.gui-bg-cyan3{background-color:#E0F7FA;}
+
+/* 紫色 */
+.gui-color-purple{color:#9C27B0;}
+.gui-bg-purple{background-color:#9C27B0;}
+.gui-color-purple1{color:#E040FB;}
+.gui-bg-purple1{background-color:#E040FB;}
+.gui-color-purple2{color:#E1BEE7;}
+.gui-bg-purple2{background-color:#E1BEE7;}
+.gui-color-purple3{color:#F3E5F5;}
+.gui-bg-purple3{background-color:#F3E5F5;}
+
+/* 棕色 */
+.gui-color-brown{color:#5D4037;}
+.gui-bg-brown{background-color:#5D4037;}
+.gui-color-brown1{color:#795558;}
+.gui-bg-brown1{background-color:#795558;}
+.gui-color-brown2{color:#8D6E63;}
+.gui-bg-brown2{background-color:#8D6E63;}
+.gui-color-brown3{color:#D7CCC8;}
+.gui-bg-brown3{background-color:#D7CCC8;}

+ 307 - 0
lib/GraceUI5/css/graceUI.css

@@ -0,0 +1,307 @@
+/* #ifdef MP-BAIDU */
+@import "iconsforbaidu.css";
+/* #endif */
+
+/* 规划 H5 端字体 */
+/* #ifdef H5 */
+body{font-family:-apple-system,Helvetica,sans-serif,Arial;}
+/* #endif */
+
+/* 图标加载 */
+/* #ifndef APP-NVUE */
+	/* #ifndef MP-BAIDU */
+	@font-face{
+		font-family : "gui-iconfont";
+		font-weight : normal;
+		font-style  : normal; 
+		src         : url('@/static/grace.ttf') format('truetype');
+	}
+	/* #endif */
+.gui-icons{font-family:"gui-iconfont"; font-style:normal;}
+/* #endif */
+
+/* 页面主体结构 */
+.gui-body{width:750rpx;}
+
+/* 去除图片空白 */
+.gui-img-in{font-size:0;}
+
+/* #ifndef APP-NVUE */
+.gui-flex{display:flex;}
+.gui-border-box{box-sizing:border-box;}
+.gui-body{width:750rpx; box-sizing:border-box;}
+/* #endif */
+
+
+/* flex 布局 */
+.gui-rows{flex-direction:row;}
+.gui-columns{flex-direction:column;}
+.gui-wrap{flex-direction:row; flex-wrap:wrap;}
+.gui-nowrap{flex-direction:row; flex-wrap:nowrap;}
+.gui-space-around{justify-content:space-around;}
+.gui-space-between{justify-content:space-between;}
+.gui-justify-content-start{justify-content:flex-start;}
+.gui-justify-content-center{justify-content:center;}
+.gui-justify-content-end{justify-content:flex-end;}
+.gui-align-items-start{align-items:flex-start;}
+.gui-align-items-center{align-items:center;}
+.gui-align-items-end{align-items:flex-end;}
+.gui-flex1{flex:1;}
+
+/* 文本对齐 */
+.gui-text-left{text-align:left;}
+.gui-text-center{text-align:center;}
+.gui-text-right{text-align:right;}
+.gui-ellipsis{overflow:hidden;}
+/* #ifndef APP-NVUE */
+.gui-ellipsis{white-space:nowrap; text-overflow:ellipsis;}
+.gui-block-text{display:block;}
+/* #endif */
+
+/* 文本修饰 */
+.gui-bold{font-weight:bold;}
+.gui-line-through{text-decoration:line-through;}
+.gui-underline{text-decoration:underline;}
+.gui-italic{font-style:italic;}
+
+/* 定位 */
+.gui-relative{position:relative;}
+.gui-absolute-lt{position:absolute; z-index:2; left:0; top:0;}
+.gui-absolute-rt{position:absolute; z-index:2; right:0; top:0;}
+.gui-absolute-lb{position:absolute; z-index:2; left:0; bottom:0;}
+.gui-absolute-rb{position:absolute; z-index:2; right:0; bottom:0;}
+.gui-fixed-lt{position:fixed; z-index:2; left:0; top:0;}
+.gui-fixed-rt{position:fixed; z-index:2; right:0; top:0;}
+.gui-fixed-lb{position:fixed; z-index:2; left:0; bottom:0;}
+.gui-fixed-rb{position:fixed; z-index:2; right:0; bottom:0;}
+
+/* 背景色 */
+.gui-bg-red{background-color:#EE0A25 !important;}
+.gui-bg-green{background-color:#07C160 !important;}
+.gui-bg-blue{background-color:#008AFF !important;}
+.gui-bg-orange{background-color:#ED6A0C !important;}
+.gui-bg-yellow{background-color:#FBDE4E !important;}
+.gui-bg-purple{background-color:#8A3FD4 !important;}
+.gui-bg-white{background-color:#FFFFFF !important;}
+.gui-bg-black{background-color:#2B2E3D !important;}
+.gui-bg-black{background-color:#2B2E3D !important;}
+.gui-bg-black2{background-color:#656565 !important;}
+.gui-bg-black3{background-color:#969799 !important;}
+.gui-bg-black4{background-color:#C8C9CC !important;}
+.gui-bg-black-opacity7{background-color:rgba(0,0,0,0.7);}
+.gui-bg-black-opacity5{background-color:rgba(0,0,0,0.5);}
+.gui-bg-black-opacity3{background-color:rgba(0,0,0,0.3);}
+.gui-gtbg-red{background-image:linear-gradient(45deg, #FF0066 , #D50000) !important;}
+.gui-gtbg-blue{background-image:linear-gradient(45deg, #5887DF , #008AFF) !important;}
+.gui-gtbg-green{background-image:linear-gradient(45deg, #39B55A , #8DC63E) !important;}
+.gui-bg-gray{background-color:#F7F8FA !important;}
+.gui-bg-white{background-color:#FFFFFF !important;}
+
+
+/* 内置颜色 */
+.gui-color-black{color:#2B2E3D !important;}
+.gui-color-white{color:#FFFFFF !important;}
+.gui-color-gray{color:rgba(69, 90, 100, 0.6) !important;}
+.gui-color-gray-light{color:rgba(69, 90, 100, 0.3) !important;}
+.gui-color-blue{color:#008AFF !important;}
+.gui-color-red{color:#EE0A25 !important;}
+.gui-color-orange{color:#ED6A0C !important;}
+.gui-color-purple{color:#8A3FD4 !important;}
+.gui-color-green{color:#39B55A !important;}
+.gui-color-yellow{color:#FBDE4E !important;}
+
+
+
+/* 边框 */
+/* #ifdef APP-NVUE */
+.gui-border{border-style:solid; border-width:1rpx; border-color:#F1F2F3;}
+.gui-border-l{border-left-style:solid; border-left-width:1rpx; border-left-color:#F1F2F3;}
+.gui-border-r{border-right-style:solid; border-right-width:1rpx; border-right-color:#F1F2F3;}
+.gui-border-t{border-top-style:solid; border-top-width:1rpx; border-top-color:#F1F2F3;}
+.gui-border-b{border-bottom-style:solid; border-bottom-width:1rpx; border-bottom-color:#F1F2F3;}
+.gui-noborder{border-right-width:0; border-top-width:0; border-left-width:0; border-bottom-width:0;}
+/* #endif */
+/* #ifndef APP-NVUE */
+.gui-border{border:1rpx solid #F1F2F3;}
+.gui-border-l{border-left:1rpx solid #F1F2F3;}
+.gui-border-r{border-right:1rpx solid #F1F2F3;}
+.gui-border-t{border-top:1rpx solid #F1F2F3;}
+.gui-border-b{border-bottom:1rpx solid #F1F2F3;}
+.gui-noborder{border:none !important;}
+/* #endif */
+
+/* 自定义头部导航相关 */
+.gui-header-content{width:100rpx; flex:1; text-align:center; margin-left:10rpx; margin-right:168rpx;}
+.gui-headr-back{width:148rpx; line-height:40px; font-size:32rpx;}
+
+
+/* 宫格布局 */
+.gui-grids{padding:0;}
+.gui-grids-items{width:138rpx;}
+/* #ifndef APP-NVUE */
+.gui-grids-items{box-sizing:border-box;}
+/* #endif */
+.gui-grids-icon{height:80rpx; font-size:68rpx; line-height:80rpx; text-align:center;}
+/* #ifndef APP-NVUE */
+.gui-grids-icon{display:block; width:100%;}
+/* #endif */
+.gui-grids-icon-img{width:80rpx; height:80rpx; border-radius:6rpx;}
+.gui-grids-text{line-height:50rpx; text-align:center; font-size:24rpx; margin-top:2px;}
+/* #ifndef APP-NVUE */
+.gui-grids-text{display:block; width:100%;}
+/* #endif */
+
+
+/* 列表样式 */
+/* #ifndef APP-NVUE */
+.gui-list-items, .gui-list-title{display:flex;}
+.gui-list-icon, .gui-list-title-text, .gui-list-title-desc, .gui-list-body-desc, .gui-list-arrow-right{display:block;}
+/* #endif */
+.gui-list-items{flex-direction:row; flex-wrap:nowrap; align-items:center; justify-content:center;}
+.gui-list-icon{width:80rpx; height:80rpx; line-height:80rpx; text-align:center; font-size:44rpx;}
+.gui-list-image{width:80rpx; height:80rpx; border-radius:80rpx; font-size:0;}
+.gui-list-body{padding:25rpx 0; margin-left:25rpx; width:100rpx; flex:1;}
+.gui-list-title{flex-direction:row; flex-wrap:nowrap; justify-content:space-between; align-items:center;}
+.gui-list-one-line{line-height:60rpx !important;}
+.gui-list-title-text{font-size:26rpx; line-height:44rpx;}
+.gui-list-title-desc{font-size:22rpx; line-height:30rpx;}
+.gui-list-body-desc{font-size:22rpx; line-height:32rpx;}
+.gui-list-arrow-right{width:50rpx; height:50rpx; line-height:50rpx; font-size:30rpx; text-align:right;}
+
+
+/* 徽章 */
+.gui-badge{border-radius:38rpx; height:38rpx; line-height:38rpx; padding:0 13rpx; font-size:22rpx;}
+.gui-badge-absolute{position:absolute; right:0rpx; top:4rpx; z-index:1;}
+.gui-badge-point{width:20rpx; height:20rpx; border-radius:12rpx; position:absolute; right:4rpx; top:4rpx; z-index:1; background-color:#FF0000;}
+.gui-badge-gender{width:38rpx; height:38rpx; border-radius:30rpx; text-align:center; font-size:22rpx !important; line-height:38rpx; position:absolute; right:6rpx; top:4rpx; z-index:1;}
+
+
+/* 滚动区域 */
+/* #ifndef APP-NVUE */
+.gui-scroll-x{display:flex; white-space:nowrap;}
+.gui-scroll-x-item, .gui-scroll-x-items{display:inline-flex; vertical-align:top;}
+/* #endif */
+/* #ifdef MP-ALIPAY */
+.gui-scroll-x{display:block; white-space:nowrap;}
+/* #endif */
+.gui-scroll-x{width:750rpx; flex-direction:row; overflow:hidden;}
+
+
+/* 卡片列表 */
+.gui-card-list{}
+.gui-card-item{width:330rpx; margin-bottom:30rpx;}
+.gui-card-img{width:330rpx; height:191rpx; overflow:hidden; position:relative;}
+.gui-card-title{margin-top:3px;}
+.gui-card-desc{margin-top:3px;}
+.gui-card-tip{width:68rpx; height:40rpx; line-height:40rpx; text-align:center;}
+.gui-card-mask-title{line-height:60rpx; height:60rpx; padding:0 10rpx; width:330rpx;}
+
+
+/* 底部导航相关 */
+.gui-footer-icon-buttons{width:80rpx; height:80rpx; margin:10rpx;}
+.gui-footer-icon-buttons-icon{text-align:center; font-size:38rpx; line-height:50rpx;}
+.gui-footer-icon-buttons-text{text-align:center; font-size:20rpx; line-height:30rpx;}
+.gui-footer-large-buttons{margin-left:25rpx; margin-right:25rpx;}
+.gui-footer-large-button{width:218rpx; height:80rpx;}
+.gui-footer-large-button-text{line-height:80rpx !important;}
+
+/* 通用标题布局 */
+.gui-title-line{width:50rpx; height:1px; background-color:#E1E2E3; flex:1;}
+.gui-title-text{line-height:60rpx;}
+.gui-title-icon{width:50rpx; font-size:32rpx;}
+
+/* 表单 */
+.gui-form{overflow:hidden;}
+.gui-form-item{flex-direction:row; flex-wrap:nowrap; align-items:center;}
+.gui-form-label{width:130rpx; height:100rpx; font-size:28rpx; line-height:100rpx; overflow:hidden;}
+.gui-form-icon{width:60rpx; height:60rpx; line-height:60rpx; font-size:28rpx;}
+.gui-form-body{width:200rpx; margin-left:20rpx; overflow:hidden; flex:1;}
+.gui-form-input{height:40rpx; line-height:40rpx; margin:20rpx 0; background-color:rgba(255,255,255,0); border-width:0px; font-size:28rpx;}
+.gui-check-item{margin:10rpx 10rpx 0 0; padding:0 10rpx; font-size:28rpx; flex-direction:row; flex-wrap:nowrap; align-items:center;}
+.gui-check-item-y{margin:10rpx 0; font-size:28rpx;}
+.gui-textarea{height:120rpx; padding:15rpx; line-height:38rpx; background-color:rgba(255,255,255,0); border-width:0px; font-size:28rpx;}
+@font-face{font-family:"gui-formicons"; src:url('data:application/ttf;charset=utf-8;base64,OLh6+EVGahJS0OU2yaKO26Kiu6Zv+fbC+9P6l/wm8ZwtrOU5zo2XwdDjj7ilb9szx6Pz8hzzU1DUMrbXMHC2NbU15WTlxOxUdK2llbX0DSSdFF0GClXLlRPIOJppGChZi5s6MnpKNvaqMLkwKoD8NsI9B7wqBANQgCNQhGDQgBAwhFKwhHGhBeDCDCOAI2YElRARjiAS2EBlMIQx4iGInC9nJQTHaVXQA5E8EE500AB910O4gBKhATdCAWWEFskIYcQBnigDbEBX2IBwYQHyQhIThBohj9KScAF0gKAuQMEpALsJAHSEG+/kuiIgA4aBqIoCiQhzQx6qgEABMoBTShNDCC5oAC1AQWUAuIQRYwhzaCM7QFGOgo6EHXQAn6DDbQJNjjczuo4gsok+FuApClC9pt9nPwK3ehR05loNUk');}
+
+/* 底部导航 */
+/* #ifndef APP-NVUE */
+.gui-form-item{display:flex;}
+.gui-form-label, .gui-form-icon{display:block;}
+.gui-form-picker{display:flex;}
+.gui-check-item{display:flexbox;}
+.gui-check-item-y{display:block;}
+.gui-textarea{box-sizing:border-box;}
+/* #endif */
+
+/* 评论列表 */
+.gui-comments{}
+.gui-comments-items{margin-top:35rpx;}
+.gui-comments-face{width:80rpx; height:80rpx; border-radius:80rpx; margin-right:25rpx;}
+.gui-comments-body{width:580rpx; overflow:hidden;}
+.gui-comments-header-text{line-height:40rpx;}
+.gui-comments-info{margin-top:2px;}
+.gui-comments-info-text{font-size:22rpx; line-height:40rpx; margin-top:10rpx;}
+.gui-comments-content{line-height:36rpx; font-size:26rpx; padding:8rpx 0;}
+.gui-comments-replay{font-size:24rpx; color:#666666; border-radius:3px; margin:3px 0; padding:15rpx; line-height:36rpx;}
+.gui-comments-replay-btn{font-size:20rpx; line-height:44rpx; padding:0rpx 20rpx; border-radius:44rpx;}
+.gui-comments-imgs{margin:8rpx 0;}
+.gui-comments-image{width:180rpx; height:128rpx; margin-right:10rpx; margin-bottom:10rpx; font-size:0; overflow:hidden;}
+
+/* 底部导航相关 */
+.gui-footer-input-body{padding:0 20rpx; height:70rpx; border-radius:66rpx; margin:0 30rpx;}
+.gui-footer-input-icon{width:66rpx; text-align:center; line-height:66rpx; font-size:30rpx; margin-right:10rpx;}
+.gui-footer-input{width:100rpx; flex:1; font-size:26rpx; height:32rpx; line-height:32rpx; padding:0; overflow:hidden;}
+
+.gui-common-line{height:20rpx; background-color:#F7F8FA;}
+
+
+/* css3 动画 不支持 nvue */
+/* #ifndef APP-NVUE */
+.gui-transition-all{transition:all 0.2s ease-in 0s;}
+/* 使用记录 : gui-switch-navigation2 gui-popup */
+@keyframes gui-fade-in{0%{opacity:0;} 100%{opacity:1;}}
+.gui-fade-in{animation:gui-fade-in 350ms ease-in forwards;}
+/* 使用记录 : gui-image gui-popup */
+@keyframes gui-fade-out{0%{opacity:1;} 100%{opacity:0;}}
+.gui-fade-out{animation:gui-fade-out 350ms ease-out forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-top-in{0%{transform:translateY(-1000px);} 100%{transform:translateY(0px);}}
+.gui-top-in{animation:gui-top-in 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-top-out{0%{transform:translateY(0px);} 100%{transform:translateY(-1000px);}}
+.gui-top-out{animation:gui-top-out 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-bottom-in{0%{transform:translateY(600px);} 100%{transform:translateY(0px);}}
+.gui-bottom-in{animation:gui-bottom-in 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-bottom-out{0%{transform:translateY(0px);} 100%{transform:translateY(600px);}}
+.gui-bottom-out{animation:gui-bottom-out 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-left-in{0%{transform:translateX(-600px);} 100%{transform:translateX(0px);}}
+.gui-left-in{animation:gui-left-in 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-left-out{0%{transform:translateX(0px);} 100%{transform:translateX(-600px);}}
+.gui-left-out{animation:gui-left-out 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-right-in{0%{transform:translateX(600px);} 100%{transform:translateX(0px);}}
+.gui-right-in{animation:gui-right-in 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-right-out{0%{transform:translateX(0px);} 100%{transform:translateX(600px);}}
+.gui-right-out{animation:gui-right-out 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-scale-in{0%{transform:scale(0.3,0.3);} 100%{transform:scale(1,1);}}
+.gui-scale-in{animation:gui-scale-in 350ms linear forwards;}
+/* 使用记录 : gui-popup */
+@keyframes gui-scale-out{0%{transform:scale(1,1);} 100%{transform:scale(0.3,0.3);}}
+.gui-scale-out{animation:gui-scale-out 350ms linear forwards;}
+/* 使用记录 : gui-page */
+@keyframes gui-rotate360{0%{transform:rotate(0deg);} 50%{transform:rotate(180deg);} 100%{transform:rotate(360deg);}}
+.gui-rotate360{animation:gui-rotate360 1200ms infinite linear;}
+/* #endif */
+
+
+/* 不支持 nvue 的常用样式 */
+/* #ifndef APP-NVUE */
+.gui-box-shadow{box-shadow:0px 0px 16rpx #323232;}
+.gui-transition-all{transition:all 0.2s ease-in 0s;}
+::-webkit-scrollbar {display: none;}
+/* #endif */

File diff suppressed because it is too large
+ 4 - 0
lib/GraceUI5/css/iconsforbaidu.css


+ 12548 - 0
lib/GraceUI5/data/city-data/area.js

@@ -0,0 +1,12548 @@
+/* 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"
+		}]
+	],
+	[
+		[{
+			"label": "钓鱼岛全岛",
+			"value": "690101"
+		}]
+	]
+]
+export default areaData;

+ 434 - 0
lib/GraceUI5/data/city-data/city.js

@@ -0,0 +1,434 @@
+/* 本数据由 GraceUI 团队精心整理,版权归 GraceUI 所有,未经允许不得发布到公开渠道及抄袭! */
+var cityData = [
+	[{"label": "北京市","value": "110000"}],
+	[{"label": "天津市","value": "120000"}],
+	[
+		{"label": "石家庄市","value": "130100"},
+		{"label": "唐山市","value": "130200"},
+		{"label": "秦皇岛市","value": "130300"},
+		{"label": "邯郸市","value": "130400"},
+		{"label": "邢台市","value": "130500"},
+		{"label": "保定市","value": "130600"},
+		{"label": "张家口市","value": "130700"},
+		{"label": "承德市","value": "130800"},
+		{"label": "沧州市","value": "130900"},
+		{"label": "廊坊市","value": "131000"},
+		{"label": "衡水市","value": "131100"
+		}
+	],
+	[
+		{"label": "太原市","value": "140100"},
+		{"label": "大同市","value": "140200"},
+		{"label": "阳泉市","value": "140300"},
+		{"label": "长治市","value": "140400"},
+		{"label": "晋城市","value": "140500"},
+		{"label": "朔州市","value": "140600"},
+		{"label": "晋中市","value": "140700"},
+		{"label": "运城市","value": "140800"},
+		{"label": "忻州市","value": "140900"},
+		{"label": "临汾市","value": "141000"},
+		{"label": "吕梁市","value": "141100"}
+	],
+	[
+		{"label": "呼和浩特市","value": "150100"},
+		{"label": "包头市","value": "150200"},
+		{"label": "乌海市","value": "150300"},
+		{"label": "赤峰市","value": "150400"},
+		{"label": "通辽市","value": "150500"},
+		{"label": "鄂尔多斯市","value": "150600"},
+		{"label": "呼伦贝尔市","value": "150700"},
+		{"label": "巴彦淖尔市","value": "150800"},
+		{"label": "乌兰察布市","value": "150900"},
+		{"label": "兴安盟","value": "152200"},
+		{"label": "锡林郭勒盟","value": "152500"},
+		{"label": "阿拉善盟","value": "152900"}
+	],
+	[
+		{"label": "沈阳市","value": "210100"},
+		{"label": "大连市","value": "210200"},
+		{"label": "鞍山市","value": "210300"},
+		{"label": "抚顺市","value": "210400"},
+		{"label": "本溪市","value": "210500"},
+		{"label": "丹东市","value": "210600"},
+		{"label": "锦州市","value": "210700"},
+		{"label": "营口市","value": "210800"},
+		{"label": "阜新市","value": "210900"},
+		{"label": "辽阳市","value": "211000"},
+		{"label": "盘锦市","value": "211100"},
+		{"label": "铁岭市","value": "211200"},
+		{"label": "朝阳市","value": "211300"},
+		{"label": "葫芦岛市","value": "211400"}
+	],
+	[
+		{"label": "长春市","value": "220100"},
+		{"label": "吉林市","value": "220200"},
+		{"label": "四平市","value": "220300"},
+		{"label": "辽源市","value": "220400"},
+		{"label": "通化市","value": "220500"},
+		{"label": "白山市","value": "220600"},
+		{"label": "松原市","value": "220700"},
+		{"label": "白城市","value": "220800"},
+		{"label": "延边朝鲜族自治州","value": "222400"}
+	],
+	[
+		{"label": "哈尔滨市","value": "230100"},
+		{"label": "齐齐哈尔市","value": "230200"},
+		{"label": "鸡西市","value": "230300"},
+		{"label": "鹤岗市","value": "230400"},
+		{"label": "双鸭山市","value": "230500"},
+		{"label": "大庆市","value": "230600"},
+		{"label": "伊春市","value": "230700"},
+		{"label": "佳木斯市","value": "230800"},
+		{"label": "七台河市","value": "230900"},
+		{"label": "牡丹江市","value": "231000"},
+		{"label": "黑河市","value": "231100"},
+		{"label": "绥化市","value": "231200"},
+		{"label": "大兴安岭地区","value": "232700"}
+	],
+	[{"label": "上海市","value": "310100"}],
+	[
+		{"label": "南京市","value": "320100"},
+		{"label": "无锡市","value": "320200"},
+		{"label": "徐州市","value": "320300"},
+		{"label": "常州市","value": "320400"},
+		{"label": "苏州市","value": "320500"},
+		{"label": "南通市","value": "320600"},
+		{"label": "连云港市","value": "320700"},
+		{"label": "淮安市","value": "320800"},
+		{"label": "盐城市","value": "320900"},
+		{"label": "扬州市","value": "321000"},
+		{"label": "镇江市","value": "321100"},
+		{"label": "泰州市","value": "321200"},
+		{"label": "宿迁市","value": "321300"}
+	],
+	[
+		{"label": "杭州市","value": "330100"},
+		{"label": "宁波市","value": "330200"},
+		{"label": "温州市","value": "330300"},
+		{"label": "嘉兴市","value": "330400"},
+		{"label": "湖州市","value": "330500"},
+		{"label": "绍兴市","value": "330600"},
+		{"label": "金华市","value": "330700"},
+		{"label": "衢州市","value": "330800"},
+		{"label": "舟山市","value": "330900"},
+		{"label": "台州市","value": "331000"},
+		{"label": "丽水市","value": "331100"}
+	],
+	[
+		{"label": "合肥市","value": "340100"},
+		{"label": "芜湖市","value": "340200"},
+		{"label": "蚌埠市","value": "340300"},
+		{"label": "淮南市","value": "340400"},
+		{"label": "马鞍山市","value": "340500"},
+		{"label": "淮北市","value": "340600"},
+		{"label": "铜陵市","value": "340700"},
+		{"label": "安庆市","value": "340800"},
+		{"label": "黄山市","value": "341000"},
+		{"label": "滁州市","value": "341100"},
+		{"label": "阜阳市","value": "341200"},
+		{"label": "宿州市","value": "341300"},
+		{"label": "六安市","value": "341500"},
+		{"label": "亳州市","value": "341600"},
+		{"label": "池州市","value": "341700"},
+		{"label": "宣城市","value": "341800"}
+	],
+	[
+		{"label": "福州市","value": "350100"},
+		{"label": "厦门市","value": "350200"},
+		{"label": "莆田市","value": "350300"},
+		{"label": "三明市","value": "350400"},
+		{"label": "泉州市","value": "350500"},
+		{"label": "漳州市","value": "350600"},
+		{"label": "南平市","value": "350700"},
+		{"label": "龙岩市","value": "350800"},
+		{"label": "宁德市","value": "350900"}
+	],
+	[
+		{"label": "南昌市","value": "360100"},
+		{"label": "景德镇市","value": "360200"},
+		{"label": "萍乡市","value": "360300"},
+		{"label": "九江市","value": "360400"},
+		{"label": "新余市","value": "360500"},
+		{"label": "鹰潭市","value": "360600"},
+		{"label": "赣州市","value": "360700"},
+		{"label": "吉安市","value": "360800"},
+		{"label": "宜春市","value": "360900"},
+		{"label": "抚州市","value": "361000"},
+		{"label": "上饶市","value": "361100"}
+	],
+	[
+		{"label": "济南市","value": "370100"},
+		{"label": "青岛市","value": "370200"},
+		{"label": "淄博市","value": "370300"},
+		{"label": "枣庄市","value": "370400"},
+		{"label": "东营市","value": "370500"},
+		{"label": "烟台市","value": "370600"},
+		{"label": "潍坊市","value": "370700"},
+		{"label": "济宁市","value": "370800"},
+		{"label": "泰安市","value": "370900"},
+		{"label": "威海市","value": "371000"},
+		{"label": "日照市","value": "371100"},
+		{"label": "莱芜市","value": "371200"},
+		{"label": "临沂市","value": "371300"},
+		{"label": "德州市","value": "371400"},
+		{"label": "聊城市","value": "371500"},
+		{"label": "滨州市","value": "371600"},
+		{"label": "菏泽市","value": "371700"}
+	],
+	[
+		{"label": "郑州市","value": "410100"},
+		{"label": "开封市","value": "410200"},
+		{"label": "洛阳市","value": "410300"},
+		{"label": "平顶山市","value": "410400"},
+		{"label": "安阳市","value": "410500"},
+		{"label": "鹤壁市","value": "410600"},
+		{"label": "新乡市","value": "410700"},
+		{"label": "焦作市","value": "410800"},
+		{"label": "濮阳市","value": "410900"},
+		{"label": "许昌市","value": "411000"},
+		{"label": "漯河市","value": "411100"},
+		{"label": "三门峡市","value": "411200"},
+		{"label": "南阳市","value": "411300"},
+		{"label": "商丘市","value": "411400"},
+		{"label": "信阳市","value": "411500"},
+		{"label": "周口市","value": "411600"},
+		{"label": "驻马店市","value": "411700"},
+		{"label": "省直辖县级行政区划","value": "419000"}
+	],
+	[
+		{"label": "武汉市","value": "420100"},
+		{"label": "黄石市","value": "420200"},
+		{"label": "十堰市","value": "420300"},
+		{"label": "宜昌市","value": "420500"},
+		{"label": "襄阳市","value": "420600"},
+		{"label": "鄂州市","value": "420700"},
+		{"label": "荆门市","value": "420800"},
+		{"label": "孝感市","value": "420900"},
+		{"label": "荆州市","value": "421000"},
+		{"label": "黄冈市","value": "421100"},
+		{"label": "咸宁市","value": "421200"},
+		{"label": "随州市","value": "421300"},
+		{"label": "恩施土家族苗族自治州","value": "422800"},
+		{"label": "省直辖县级行政区划","value": "429000"}
+	],
+	[
+		{"label": "长沙市","value": "430100"},
+		{"label": "株洲市","value": "430200"},
+		{"label": "湘潭市","value": "430300"},
+		{"label": "衡阳市","value": "430400"},
+		{"label": "邵阳市","value": "430500"},
+		{"label": "岳阳市","value": "430600"},
+		{"label": "常德市","value": "430700"},
+		{"label": "张家界市","value": "430800"},
+		{"label": "益阳市","value": "430900"},
+		{"label": "郴州市","value": "431000"},
+		{"label": "永州市","value": "431100"},
+		{"label": "怀化市","value": "431200"},
+		{"label": "娄底市","value": "431300"},
+		{"label": "湘西土家族苗族自治州","value": "433100"}
+	],
+	[
+		{"label": "广州市","value": "440100"},
+		{"label": "韶关市","value": "440200"},
+		{"label": "深圳市","value": "440300"},
+		{"label": "珠海市","value": "440400"},
+		{"label": "汕头市","value": "440500"},
+		{"label": "佛山市","value": "440600"},
+		{"label": "江门市","value": "440700"},
+		{"label": "湛江市","value": "440800"},
+		{"label": "茂名市","value": "440900"},
+		{"label": "肇庆市","value": "441200"},
+		{"label": "惠州市","value": "441300"},
+		{"label": "梅州市","value": "441400"},
+		{"label": "汕尾市","value": "441500"},
+		{"label": "河源市","value": "441600"},
+		{"label": "阳江市","value": "441700"},
+		{"label": "清远市","value": "441800"},
+		{"label": "东莞市","value": "441900"},
+		{"label": "中山市","value": "442000"},
+		{"label": "潮州市","value": "445100"},
+		{"label": "揭阳市","value": "445200"},
+		{"label": "云浮市","value": "445300"}
+	],
+	[
+		{"label": "南宁市","value": "450100"},
+		{"label": "柳州市","value": "450200"},
+		{"label": "桂林市","value": "450300"},
+		{"label": "梧州市","value": "450400"},
+		{"label": "北海市","value": "450500"},
+		{"label": "防城港市","value": "450600"},
+		{"label": "钦州市","value": "450700"},
+		{"label": "贵港市","value": "450800"},
+		{"label": "玉林市","value": "450900"},
+		{"label": "百色市","value": "451000"},
+		{"label": "贺州市","value": "451100"},
+		{"label": "河池市","value": "451200"},
+		{"label": "来宾市","value": "451300"},
+		{"label": "崇左市","value": "451400"}
+	],
+	[
+		{"label": "海口市","value": "460100"},
+		{"label": "三亚市","value": "460200"},
+		{"label": "三沙市","value": "460300"},
+		{"label": "儋州市","value": "460400"},
+		{"label": "省直辖县级行政区划","value": "469000"}
+	],
+	[
+		{"label": "市辖区","value": "500100"},
+		{"label": "县","value": "500200"}
+	],
+	[
+		{"label": "成都市","value": "510100"},
+		{"label": "自贡市","value": "510300"},
+		{"label": "攀枝花市","value": "510400"},
+		{"label": "泸州市","value": "510500"},
+		{"label": "德阳市","value": "510600"},
+		{"label": "绵阳市","value": "510700"},
+		{"label": "广元市","value": "510800"},
+		{"label": "遂宁市","value": "510900"},
+		{"label": "内江市","value": "511000"},
+		{"label": "乐山市","value": "511100"},
+		{"label": "南充市","value": "511300"},
+		{"label": "眉山市","value": "511400"},
+		{"label": "宜宾市","value": "511500"},
+		{"label": "广安市","value": "511600"},
+		{"label": "达州市","value": "511700"},
+		{"label": "雅安市","value": "511800"},
+		{"label": "巴中市","value": "511900"},
+		{"label": "资阳市","value": "512000"},
+		{"label": "阿坝藏族羌族自治州","value": "513200"},
+		{"label": "甘孜藏族自治州","value": "513300"},
+		{"label": "凉山彝族自治州","value": "513400"}
+	],
+	[
+		{"label": "贵阳市","value": "520100"},
+		{"label": "六盘水市","value": "520200"},
+		{"label": "遵义市","value": "520300"},
+		{"label": "安顺市","value": "520400"},
+		{"label": "毕节市","value": "520500"},
+		{"label": "铜仁市","value": "520600"},
+		{"label": "黔西南布依族苗族自治州","value": "522300"},
+		{"label": "黔东南苗族侗族自治州","value": "522600"},
+		{"label": "黔南布依族苗族自治州","value": "522700"}
+	],
+	[
+		{"label": "昆明市","value": "530100"},
+		{"label": "曲靖市","value": "530300"},
+		{"label": "玉溪市","value": "530400"},
+		{"label": "保山市","value": "530500"},
+		{"label": "昭通市","value": "530600"},
+		{"label": "丽江市","value": "530700"},
+		{"label": "普洱市","value": "530800"},
+		{"label": "临沧市","value": "530900"},
+		{"label": "楚雄彝族自治州","value": "532300"},
+		{"label": "红河哈尼族彝族自治州","value": "532500"},
+		{"label": "文山壮族苗族自治州","value": "532600"},
+		{"label": "西双版纳傣族自治州","value": "532800"},
+		{"label": "大理白族自治州","value": "532900"},
+		{"label": "德宏傣族景颇族自治州","value": "533100"},
+		{"label": "怒江傈僳族自治州","value": "533300"},
+		{"label": "迪庆藏族自治州","value": "533400"}
+	],
+	[
+		{"label": "拉萨市","value": "540100"},
+		{"label": "日喀则市","value": "540200"},
+		{"label": "昌都市","value": "540300"},
+		{"label": "林芝市","value": "540400"},
+		{"label": "山南市","value": "540500"},
+		{"label": "那曲地区","value": "542400"},
+		{"label": "阿里地区","value": "542500"}
+	],
+	[
+		{"label": "西安市","value": "610100"},
+		{"label": "铜川市","value": "610200"},
+		{"label": "宝鸡市","value": "610300"},
+		{"label": "咸阳市","value": "610400"},
+		{"label": "渭南市","value": "610500"},
+		{"label": "延安市","value": "610600"},
+		{"label": "汉中市","value": "610700"},
+		{"label": "榆林市","value": "610800"},
+		{"label": "安康市","value": "610900"},
+		{"label": "商洛市","value": "611000"}
+	],
+	[
+		{"label": "兰州市","value": "620100"},
+		{"label": "嘉峪关市","value": "620200"},
+		{"label": "金昌市","value": "620300"},
+		{"label": "白银市","value": "620400"},
+		{"label": "天水市","value": "620500"},
+		{"label": "武威市","value": "620600"},
+		{"label": "张掖市","value": "620700"},
+		{"label": "平凉市","value": "620800"},
+		{"label": "酒泉市","value": "620900"},
+		{"label": "庆阳市","value": "621000"},
+		{"label": "定西市","value": "621100"},
+		{"label": "陇南市","value": "621200"},
+		{"label": "临夏回族自治州","value": "622900"},
+		{"label": "甘南藏族自治州","value": "623000"}
+	],
+	[
+		{"label": "西宁市","value": "630100"},
+		{"label": "海东市","value": "630200"},
+		{"label": "海北藏族自治州","value": "632200"},
+		{"label": "黄南藏族自治州","value": "632300"},
+		{"label": "海南藏族自治州","value": "632500"},
+		{"label": "果洛藏族自治州","value": "632600"},
+		{"label": "玉树藏族自治州","value": "632700"},
+		{"label": "海西蒙古族藏族自治州","value": "632800"}
+	],
+	[
+		{"label": "银川市","value": "640100"},
+		{"label": "石嘴山市","value": "640200"},
+		{"label": "吴忠市","value": "640300"},
+		{"label": "固原市","value": "640400"},
+		{"label": "中卫市","value": "640500"}
+	],
+	[
+		{"label": "乌鲁木齐市","value": "650100"},
+		{"label": "克拉玛依市","value": "650200"},
+		{"label": "吐鲁番市","value": "650400"},
+		{"label": "哈密市","value": "650500"},
+		{"label": "昌吉回族自治州","value": "652300"},
+		{"label": "博尔塔拉蒙古自治州","value": "652700"},
+		{"label": "巴音郭楞蒙古自治州","value": "652800"},
+		{"label": "阿克苏地区","value": "652900"},
+		{"label": "克孜勒苏柯尔克孜自治州","value": "653000"},
+		{"label": "喀什地区","value": "653100"},
+		{"label": "和田地区","value": "653200"},
+		{"label": "伊犁哈萨克自治州","value": "654000"},
+		{"label": "塔城地区","value": "654200"},
+		{"label": "阿勒泰地区","value": "654300"},
+		{"label": "自治区直辖县级行政区划","value": "659000"}
+	],
+	[
+		{"label": "台北","value": "660100"},
+		{"label": "高雄","value": "660200"},
+		{"label": "基隆","value": "660300"},
+		{"label": "台中","value": "660400"},
+		{"label": "台南","value": "660500"},
+		{"label": "新竹","value": "660600"},
+		{"label": "嘉义","value": "660700"},
+		{"label": "宜兰","value": "660800"},
+		{"label": "桃园","value": "660900"},
+		{"label": "苗栗","value": "661000"},
+		{"label": "彰化","value": "661100"},
+		{"label": "南投","value": "661200"},
+		{"label": "云林","value": "661300"},
+		{"label": "屏东","value": "661400"},
+		{"label": "台东","value": "661500"},
+		{"label": "花莲","value": "661600"},
+		{"label": "澎湖","value": "661700"}
+	],
+	[
+		{"label": "香港岛","value": "670100"},
+		{"label": "九龙","value": "670200"},
+		{"label": "新界","value": "670300"}
+	],
+	[
+		{"label": "澳门半岛","value": "680100"},
+		{"label": "氹仔岛","value": "680200"},
+		{"label": "路环岛","value": "680300"},
+		{"label": "路氹城","value": "680400"}
+	]
+]
+export default cityData;

+ 38 - 0
lib/GraceUI5/data/city-data/province.js

@@ -0,0 +1,38 @@
+/* 本数据由 GraceUI 团队精心整理,版权归 GraceUI 所有,未经允许不得发布到公开渠道及抄袭! */
+var provinceData = [
+	{"label": "北京市", "value": "110000"},
+	{ "label": "天津市", "value": "120000"},
+	{"label": "河北省","value": "130000"},
+	{"label": "山西省","value": "140000"},
+	{"label": "内蒙古自治区","value": "150000"},
+	{"label": "辽宁省","value": "210000"},
+	{"label": "吉林省","value": "220000"},
+	{"label": "黑龙江省","value": "230000"},
+	{"label": "上海市","value": "310000"},
+	{"label": "江苏省","value": "320000"},
+	{"label": "浙江省","value": "330000"},
+	{"label": "安徽省","value": "340000"},
+	{"label": "福建省","value": "350000"},
+	{"label": "江西省","value": "360000"},
+	{"label": "山东省","value": "370000"},
+	{"label": "河南省","value": "410000"},
+	{"label": "湖北省","value": "420000"},
+	{"label": "湖南省","value": "430000"},
+	{"label": "广东省","value": "440000"},
+	{"label": "广西壮族自治区", "value": "450000"},
+	{"label": "海南省","value": "460000"},
+	{"label": "重庆市","value": "500000"},
+	{"label": "四川省","value": "510000"},
+	{"label": "贵州省","value": "520000"},
+	{"label": "云南省","value": "530000"},
+	{"label": "西藏自治区","value": "540000"},
+	{"label": "陕西省","value": "610000"},
+	{"label": "甘肃省","value": "620000"},
+	{"label": "青海省","value": "630000"},
+	{"label": "宁夏回族自治区","value": "640000"},
+	{"label": "新疆维吾尔自治区","value": "650000"},
+	{"label": "台湾","value": "710000"},
+	{"label": "香港","value": "810000"},
+	{"label": "澳门","value": "820000"}
+]
+export default provinceData;

+ 742 - 0
lib/GraceUI5/data/cityData.js

@@ -0,0 +1,742 @@
+/*
+本数据由 GraceUI 团队精心整理
+版权归 GraceUI 所有,未经允许不得发布到公开渠道及抄袭
+*/
+var cityData = {
+	A: [
+		
+		{ name: "安达市", code: "231281", pinyin: "andashi231281"},
+		{ name: "安国市", code: "130683", pinyin: "anguoshi130683"},
+		{ name: "安康市", code: "610900", pinyin: "ankangshi610900"},
+		{ name: "安陆市", code: "420982", pinyin: "anlushi420982"},
+		{ name: "安宁市", code: "530181", pinyin: "anningshi530181"},
+		{ name: "安庆市", code: "340800", pinyin: "anqingshi340800"},
+		{ name: "安丘市", code: "370784", pinyin: "anqiushi370784"},
+		{ name: "鞍山市", code: "210300", pinyin: "anshanshi210300"},
+		{ name: "安顺市", code: "520400", pinyin: "anshunshi520400"},
+		{ name: "安阳市", code: "410500", pinyin: "anyangshi410500"},
+		{ name: "澳门", code:"820000", pinyin:"aomen820000"}
+	],
+	B: [
+		{ name: "白城市", code: "220800", pinyin: "baichengshi220800"},
+		{ name: "百色市", code: "451000", pinyin: "baiseshi451000"},
+		{ name: "白山市", code: "220600", pinyin: "baishanshi220600"},
+		{ name: "白银市", code: "620400", pinyin: "baiyinshi620400"},
+		{ name: "保定市", code: "130600", pinyin: "baodingshi130600"},
+		{ name: "宝鸡市", code: "610300", pinyin: "baojishi610300"},
+		{ name: "保山市", code: "530500", pinyin: "baoshanshi530500"},
+		{ name: "包头市", code: "150200", pinyin: "baotoushi150200"},
+		{ name: "巴彦淖尔市", code: "150800", pinyin: "bayannaoershi150800"},
+		{ name: "巴中市", code: "511900", pinyin: "bazhongshi511900"},
+		{ name: "霸州市", code: "131081", pinyin: "bazhoushi131081"},
+		{ name: "北安市", code: "231181", pinyin: "beianshi231181"},
+		{ name: "北海市", code: "450500", pinyin: "beihaishi450500"},
+		{ name: "北京市", code: "110000", pinyin: "beijingshi110000"},
+		{ name: "北流市", code: "450981", pinyin: "beiliushi450981"},
+		{ name: "北票市", code: "211381", pinyin: "beipiaoshi211381"},
+		{ name: "北屯市", code: "659005", pinyin: "beitunshi659005"},
+		{ name: "北镇市", code: "210782", pinyin: "beizhenshi210782"},
+		{ name: "蚌埠市", code: "340300", pinyin: "bengbushi340300"},
+		{ name: "本溪市", code: "210500", pinyin: "benxishi210500"},
+		{ name: "毕节市", code: "520500", pinyin: "bijieshi520500"},
+		{ name: "滨州市", code: "371600", pinyin: "binzhoushi371600"},
+		{ name: "彬州市", code: "610482", pinyin: "binzhoushi610482"},
+		{ name: "博乐市", code: "652701", pinyin: "boleshi652701"},
+		{ name: "泊头市", code: "130981", pinyin: "botoushi130981"},
+		{ name: "亳州市", code: "341600", pinyin: "bozhoushi341600"}
+	],
+	C: [
+		{ name: "沧州市", code: "130900", pinyin: "cangzhoushi130900"},
+		{ name: "岑溪市", code: "450481", pinyin: "cenxishi450481"},
+		{ name: "长春市", code: "220100", pinyin: "changchunshi220100"},
+		{ name: "常德市", code: "430700", pinyin: "changdeshi430700"},
+		{ name: "昌都市", code: "540300", pinyin: "changdoushi540300"},
+		{ name: "长葛市", code: "411082", pinyin: "changgeshi411082"},
+		{ name: "昌吉市", code: "652301", pinyin: "changjishi652301"},
+		{ name: "常宁市", code: "430482", pinyin: "changningshi430482"},
+		{ name: "长沙市", code: "430100", pinyin: "changshashi430100"},
+		{ name: "常熟市", code: "320581", pinyin: "changshushi320581"},
+		{ name: "昌邑市", code: "370786", pinyin: "changyishi370786"},
+		{ name: "长垣市", code: "410783", pinyin: "changyuanshi410783"},
+		{ name: "长治市", code: "140400", pinyin: "changzhishi140400"},
+		{ name: "常州市", code: "320400", pinyin: "changzhoushi320400"},
+		{ name: "巢湖市", code: "340181", pinyin: "chaohushi340181"},
+		{ name: "朝阳市", code: "211300", pinyin: "chaoyangshi211300"},
+		{ name: "潮州市", code: "445100", pinyin: "chaozhoushi445100"},
+		{ name: "承德市", code: "130800", pinyin: "chengdeshi130800"},
+		{ name: "成都市", code: "510100", pinyin: "chengdoushi510100"},
+		{ name: "澄江市", code: "530481", pinyin: "chengjiangshi530481"},
+		{ name: "郴州市", code: "431000", pinyin: "chenzhoushi431000"},
+		{ name: "赤壁市", code: "421281", pinyin: "chibishi421281"},
+		{ name: "赤峰市", code: "150400", pinyin: "chifengshi150400"},
+		{ name: "赤水市", code: "520381", pinyin: "chishuishi520381"},
+		{ name: "池州市", code: "341700", pinyin: "chizhoushi341700"},
+		{ name: "崇州市", code: "510184", pinyin: "chongzhoushi510184"},
+		{ name: "崇左市", code: "451400", pinyin: "chongzuoshi451400"},
+		{ name: "楚雄市", code: "532301", pinyin: "chuxiongshi532301"},
+		{ name: "滁州市", code: "341100", pinyin: "chuzhoushi341100"},
+		{ name: "慈溪市", code: "330282", pinyin: "cixishi330282"}
+	],
+	D: [
+		{ name: "大安市", code: "220882", pinyin: "daanshi220882"},
+		{ name: "大连市", code: "210200", pinyin: "dalianshi210200"},
+		{ name: "大理市", code: "532901", pinyin: "dalishi532901"},
+		{ name: "丹东市", code: "210600", pinyin: "dandongshi210600"},
+		{ name: "当阳市", code: "420582", pinyin: "dangyangshi420582"},
+		{ name: "丹江口市", code: "420381", pinyin: "danjiangkoushi420381"},
+		{ name: "丹阳市", code: "321181", pinyin: "danyangshi321181"},
+		{ name: "儋州市", code: "460400", pinyin: "danzhoushi460400"},
+		{ name: "邛崃市", code: "510183", pinyin: "daolaishi510183"},
+		{ name: "大庆市", code: "230600", pinyin: "daqingshi230600"},
+		{ name: "大石桥市", code: "210882", pinyin: "dashiqiaoshi210882"},
+		{ name: "大同市", code: "140200", pinyin: "datongshi140200"},
+		{ name: "大冶市", code: "420281", pinyin: "dayeshi420281"},
+		{ name: "达州市", code: "511700", pinyin: "dazhoushi511700"},
+		{ name: "德惠市", code: "220183", pinyin: "dehuishi220183"},
+		{ name: "德令哈市", code: "632802", pinyin: "delinghashi632802"},
+		{ name: "登封市", code: "410185", pinyin: "dengfengshi410185"},
+		{ name: "灯塔市", code: "211081", pinyin: "dengtashi211081"},
+		{ name: "邓州市", code: "411381", pinyin: "dengzhoushi411381"},
+		{ name: "德兴市", code: "361181", pinyin: "dexingshi361181"},
+		{ name: "德阳市", code: "510600", pinyin: "deyangshi510600"},
+		{ name: "德州市", code: "371400", pinyin: "dezhoushi371400"},
+		{ name: "定西市", code: "621100", pinyin: "dingxishi621100"},
+		{ name: "定州市", code: "130682", pinyin: "dingzhoushi130682"},
+		{ name: "东方市", code: "469007", pinyin: "dongfangshi469007"},
+		{ name: "东港市", code: "210681", pinyin: "donggangshi210681"},
+		{ name: "东莞市", code: "441900", pinyin: "dongguanshi441900"},
+		{ name: "东宁市", code: "231086", pinyin: "dongningshi231086"},
+		{ name: "东台市", code: "320981", pinyin: "dongtaishi320981"},
+		{ name: "东兴市", code: "450681", pinyin: "dongxingshi450681"},
+		{ name: "东阳市", code: "330783", pinyin: "dongyangshi330783"},
+		{ name: "东营市", code: "370500", pinyin: "dongyingshi370500"},
+		{ name: "都江堰市", code: "510181", pinyin: "doujiangyanshi510181"},
+		{ name: "都匀市", code: "522701", pinyin: "douyunshi522701"},
+		{ name: "敦煌市", code: "620982", pinyin: "dunhuangshi620982"},
+		{ name: "敦化市", code: "222403", pinyin: "dunhuashi222403"}
+	],
+	E: [
+		{ name: "鄂尔多斯市", code: "150600", pinyin: "eerduosishi150600"},
+		{ name: "额尔古纳市", code: "150784", pinyin: "eergunashi150784"},
+		{ name: "阿尔山市", code: "152202", pinyin: "eershanshi152202"},
+		{ name: "阿克苏市", code: "652901", pinyin: "ekesushi652901"},
+		{ name: "阿拉尔市", code: "659002", pinyin: "elaershi659002"},
+		{ name: "阿拉山口市", code: "652702", pinyin: "elashankoushi652702"},
+		{ name: "阿勒泰市", code: "654301", pinyin: "eletaishi654301"},
+		{ name: "峨眉山市", code: "511181", pinyin: "emeishanshi511181"},
+		{ name: "恩平市", code: "440785", pinyin: "enpingshi440785"},
+		{ name: "恩施市", code: "422801", pinyin: "enshishi422801"},
+		{ name: "二连浩特市", code: "152501", pinyin: "erlianhaoteshi152501"},
+		{ name: "阿图什市", code: "653001", pinyin: "etushenshi653001"},
+		{ name: "鄂州市", code: "420700", pinyin: "ezhoushi420700"}
+	],
+	F: [
+		{ name: "防城港市", code: "450600", pinyin: "fangchenggangshi450600"},
+		{ name: "肥城市", code: "370983", pinyin: "feichengshi370983"},
+		{ name: "凤城市", code: "210682", pinyin: "fengchengshi210682"},
+		{ name: "丰城市", code: "360981", pinyin: "fengchengshi360981"},
+		{ name: "丰镇市", code: "150981", pinyin: "fengzhenshi150981"},
+		{ name: "汾阳市", code: "141182", pinyin: "fenyangshi141182"},
+		{ name: "佛山市", code: "440600", pinyin: "foshanshi440600"},
+		{ name: "福安市", code: "350981", pinyin: "fuanshi350981"},
+		{ name: "福鼎市", code: "350982", pinyin: "fudingshi350982"},
+		{ name: "富锦市", code: "230882", pinyin: "fujinshi230882"},
+		{ name: "阜康市", code: "652302", pinyin: "fukangshi652302"},
+		{ name: "福清市", code: "350181", pinyin: "fuqingshi350181"},
+		{ name: "福泉市", code: "522702", pinyin: "fuquanshi522702"},
+		{ name: "抚顺市", code: "210400", pinyin: "fushunshi210400"},
+		{ name: "阜新市", code: "210900", pinyin: "fuxinshi210900"},
+		{ name: "阜阳市", code: "341200", pinyin: "fuyangshi341200"},
+		{ name: "抚远市", code: "230883", pinyin: "fuyuanshi230883"},
+		{ name: "扶余市", code: "220781", pinyin: "fuyushi220781"},
+		{ name: "福州市", code: "350100", pinyin: "fuzhoushi350100"},
+		{ name: "抚州市", code: "361000", pinyin: "fuzhoushi361000"}
+	],
+	G: [
+		{ name: "贵溪市", code: "360681", pinyin: "guixishi360681"},
+		{ name: "贵阳市", code: "520100", pinyin: "guiyangshi520100"},
+		{ name: "盖州市", code: "210881", pinyin: "gaizhoushi210881"},
+		{ name: "赣州市", code: "360700", pinyin: "ganzhoushi360700"},
+		{ name: "高安市", code: "360983", pinyin: "gaoanshi360983"},
+		{ name: "高碑店市", code: "130684", pinyin: "gaobeidianshi130684"},
+		{ name: "高密市", code: "370785", pinyin: "gaomishi370785"},
+		{ name: "高平市", code: "140581", pinyin: "gaopingshi140581"},
+		{ name: "高邮市", code: "321084", pinyin: "gaoyoushi321084"},
+		{ name: "高州市", code: "440981", pinyin: "gaozhoushi440981"},
+		{ name: "格尔木市", code: "632801", pinyin: "geermushi632801"},
+		{ name: "个旧市", code: "532501", pinyin: "gejiushi532501"},
+		{ name: "根河市", code: "150785", pinyin: "genheshi150785"},
+		{ name: "共青城市", code: "360482", pinyin: "gongqingchengshi360482"},
+		{ name: "巩义市", code: "410181", pinyin: "gongyishi410181"},
+		{ name: "公主岭市", code: "220381", pinyin: "gongzhulingshi220381"},
+		{ name: "广安市", code: "511600", pinyin: "guanganshi511600"},
+		{ name: "广德市", code: "341882", pinyin: "guangdeshi341882"},
+		{ name: "广汉市", code: "510681", pinyin: "guanghanshi510681"},
+		{ name: "广水市", code: "421381", pinyin: "guangshuishi421381"},
+		{ name: "广元市", code: "510800", pinyin: "guangyuanshi510800"},
+		{ name: "广州市", code: "440100", pinyin: "guangzhoushi440100"},
+		{ name: "贵港市", code: "450800", pinyin: "guigangshi450800"},
+		{ name: "桂林市", code: "450300", pinyin: "guilinshi450300"},
+		{ name: "桂平市", code: "450881", pinyin: "guipingshi450881"},
+		{ name: "古交市", code: "140181", pinyin: "gujiaoshi140181"},
+		{ name: "固原市", code: "640400", pinyin: "guyuanshi640400"}
+	],
+	H: [
+		{ name: "哈尔滨市", code: "230100", pinyin: "haerbinshi230100"},
+		{ name: "海安市", code: "320685", pinyin: "haianshi320685"},
+		{ name: "海城市", code: "210381", pinyin: "haichengshi210381"},
+		{ name: "海东市", code: "630200", pinyin: "haidongshi630200"},
+		{ name: "海口市", code: "460100", pinyin: "haikoushi460100"},
+		{ name: "海林市", code: "231083", pinyin: "hailinshi231083"},
+		{ name: "海伦市", code: "231283", pinyin: "hailunshi231283"},
+		{ name: "海门市", code: "320684", pinyin: "haimenshi320684"},
+		{ name: "海宁市", code: "330481", pinyin: "hainingshi330481"},
+		{ name: "海阳市", code: "370687", pinyin: "haiyangshi370687"},
+		{ name: "哈密市", code: "650500", pinyin: "hamishi650500"},
+		{ name: "韩城市", code: "610581", pinyin: "hanchengshi610581"},
+		{ name: "汉川市", code: "420984", pinyin: "hanchuanshi420984"},
+		{ name: "邯郸市", code: "130400", pinyin: "handanshi130400"},
+		{ name: "杭州市", code: "330100", pinyin: "hangzhoushi330100"},
+		{ name: "汉中市", code: "610700", pinyin: "hanzhongshi610700"},
+		{ name: "鹤壁市", code: "410600", pinyin: "hebishi410600"},
+		{ name: "河池市", code: "451200", pinyin: "hechishi451200"},
+		{ name: "合肥市", code: "340100", pinyin: "hefeishi340100"},
+		{ name: "鹤岗市", code: "230400", pinyin: "hegangshi230400"},
+		{ name: "黑河市", code: "231100", pinyin: "heiheshi231100"},
+		{ name: "河间市", code: "130984", pinyin: "hejianshi130984"},
+		{ name: "河津市", code: "140882", pinyin: "hejinshi140882"},
+		{ name: "和龙市", code: "222406", pinyin: "helongshi222406"},
+		{ name: "衡水市", code: "131100", pinyin: "hengshuishi131100"},
+		{ name: "衡阳市", code: "430400", pinyin: "hengyangshi430400"},
+		{ name: "鹤山市", code: "440784", pinyin: "heshanshi440784"},
+		{ name: "合山市", code: "451381", pinyin: "heshanshi451381"},
+		{ name: "和田市", code: "653201", pinyin: "hetianshi653201"},
+		{ name: "河源市", code: "441600", pinyin: "heyuanshi441600"},
+		{ name: "菏泽市", code: "371700", pinyin: "hezeshi371700"},
+		{ name: "贺州市", code: "451100", pinyin: "hezhoushi451100"},
+		{ name: "合作市", code: "623001", pinyin: "hezuoshi623001"},
+		{ name: "洪湖市", code: "421083", pinyin: "honghushi421083"},
+		{ name: "洪江市", code: "431281", pinyin: "hongjiangshi431281"},
+		{ name: "侯马市", code: "141081", pinyin: "houmashi141081"},
+		{ name: "桦甸市", code: "220282", pinyin: "huadianshi220282"},
+		{ name: "淮安市", code: "320800", pinyin: "huaianshi320800"},
+		{ name: "淮北市", code: "340600", pinyin: "huaibeishi340600"},
+		{ name: "怀化市", code: "431200", pinyin: "huaihuashi431200"},
+		{ name: "淮南市", code: "340400", pinyin: "huainanshi340400"},
+		{ name: "怀仁市", code: "140681", pinyin: "huairenshi140681"},
+		{ name: "黄冈市", code: "421100", pinyin: "huanggangshi421100"},
+		{ name: "黄骅市", code: "130983", pinyin: "huanghuashi130983"},
+		{ name: "黄山市", code: "341000", pinyin: "huangshanshi341000"},
+		{ name: "黄石市", code: "420200", pinyin: "huangshishi420200"},
+		{ name: "华亭市", code: "620881", pinyin: "huatingshi620881"},
+		{ name: "华蓥市", code: "511681", pinyin: "huayingshi511681"},
+		{ name: "华阴市", code: "610582", pinyin: "huayinshi610582"},
+		{ name: "化州市", code: "440982", pinyin: "huazhoushi440982"},
+		{ name: "呼和浩特市", code: "150100", pinyin: "huhehaoteshi150100"},
+		{ name: "辉县市", code: "410782", pinyin: "huixianshi410782"},
+		{ name: "惠州市", code: "441300", pinyin: "huizhoushi441300"},
+		{ name: "虎林市", code: "230381", pinyin: "hulinshi230381"},
+		{ name: "葫芦岛市", code: "211400", pinyin: "huludaoshi211400"},
+		{ name: "呼伦贝尔市", code: "150700", pinyin: "hulunbeiershi150700"},
+		{ name: "珲春市", code: "222404", pinyin: "hunchunshi222404"},
+		{ name: "霍尔果斯市", code: "654004", pinyin: "huoerguosishi654004"},
+		{ name: "霍林郭勒市", code: "150581", pinyin: "huolinguoleshi150581"},
+		{ name: "霍州市", code: "141082", pinyin: "huozhoushi141082"},
+		{ name: "胡杨河市", code: "659010", pinyin: "huyangheshi659010"},
+		{ name: "湖州市", code: "330500", pinyin: "huzhoushi330500"}
+	],
+	J: [
+		{ name: "佳木斯市", code: "230800", pinyin: "jiamusishi230800"},
+		{ name: "建德市", code: "330182", pinyin: "jiandeshi330182"},
+		{ name: "江门市", code: "440700", pinyin: "jiangmenshi440700"},
+		{ name: "江山市", code: "330881", pinyin: "jiangshanshi330881"},
+		{ name: "江阴市", code: "320281", pinyin: "jiangyinshi320281"},
+		{ name: "江油市", code: "510781", pinyin: "jiangyoushi510781"},
+		{ name: "建瓯市", code: "350783", pinyin: "jianoushi350783"},
+		{ name: "集安市", code: "220582", pinyin: "jianshi220582"},
+		{ name: "吉安市", code: "360800", pinyin: "jianshi360800"},
+		{ name: "简阳市", code: "510185", pinyin: "jianyangshi510185"},
+		{ name: "蛟河市", code: "220281", pinyin: "jiaoheshi220281"},
+		{ name: "胶州市", code: "370281", pinyin: "jiaozhoushi370281"},
+		{ name: "焦作市", code: "410800", pinyin: "jiaozuoshi410800"},
+		{ name: "嘉兴市", code: "330400", pinyin: "jiaxingshi330400"},
+		{ name: "嘉峪关市", code: "620200", pinyin: "jiayuguanshi620200"},
+		{ name: "界首市", code: "341282", pinyin: "jieshoushi341282"},
+		{ name: "介休市", code: "140781", pinyin: "jiexiushi140781"},
+		{ name: "揭阳市", code: "445200", pinyin: "jieyangshi445200"},
+		{ name: "吉林市", code: "220200", pinyin: "jilinshi220200"},
+		{ name: "济南市", code: "370100", pinyin: "jinanshi370100"},
+		{ name: "金昌市", code: "620300", pinyin: "jinchangshi620300"},
+		{ name: "晋城市", code: "140500", pinyin: "jinchengshi140500"},
+		{ name: "景德镇市", code: "360200", pinyin: "jingdezhenshi360200"},
+		{ name: "井冈山市", code: "360881", pinyin: "jinggangshanshi360881"},
+		{ name: "景洪市", code: "532801", pinyin: "jinghongshi532801"},
+		{ name: "靖江市", code: "321282", pinyin: "jingjiangshi321282"},
+		{ name: "荆门市", code: "420800", pinyin: "jingmenshi420800"},
+		{ name: "京山市", code: "420882", pinyin: "jingshanshi420882"},
+		{ name: "靖西市", code: "451081", pinyin: "jingxishi451081"},
+		{ name: "荆州市", code: "421000", pinyin: "jingzhoushi421000"},
+		{ name: "金华市", code: "330700", pinyin: "jinhuashi330700"},
+		{ name: "济宁市", code: "370800", pinyin: "jiningshi370800"},
+		{ name: "晋江市", code: "350582", pinyin: "jinjiangshi350582"},
+		{ name: "津市市", code: "430781", pinyin: "jinshishi430781"},
+		{ name: "晋中市", code: "140700", pinyin: "jinzhongshi140700"},
+		{ name: "晋州市", code: "130183", pinyin: "jinzhoushi130183"},
+		{ name: "锦州市", code: "210700", pinyin: "jinzhoushi210700"},
+		{ name: "吉首市", code: "433101", pinyin: "jishoushi433101"},
+		{ name: "九江市", code: "360400", pinyin: "jiujiangshi360400"},
+		{ name: "酒泉市", code: "620900", pinyin: "jiuquanshi620900"},
+		{ name: "鸡西市", code: "230300", pinyin: "jixishi230300"},
+		{ name: "济源市", code: "419001", pinyin: "jiyuanshi419001"},
+		{ name: "句容市", code: "321183", pinyin: "jurongshi321183"}
+	],
+	K: [
+		{ name: "开封市", code: "410200", pinyin: "kaifengshi410200"},
+		{ name: "凯里市", code: "522601", pinyin: "kailishi522601"},
+		{ name: "开平市", code: "440783", pinyin: "kaipingshi440783"},
+		{ name: "开原市", code: "211282", pinyin: "kaiyuanshi211282"},
+		{ name: "开远市", code: "532502", pinyin: "kaiyuanshi532502"},
+		{ name: "康定市", code: "513301", pinyin: "kangdingshi513301"},
+		{ name: "喀什市", code: "653101", pinyin: "kashenshi653101"},
+		{ name: "可克达拉市", code: "659008", pinyin: "kekedalashi659008"},
+		{ name: "克拉玛依市", code: "650200", pinyin: "kelamayishi650200"},
+		{ name: "库车市", code: "652902", pinyin: "kucheshi652902"},
+		{ name: "库尔勒市", code: "652801", pinyin: "kuerleshi652801"},
+		{ name: "奎屯市", code: "654003", pinyin: "kuitunshi654003"},
+		{ name: "昆明市", code: "530100", pinyin: "kunmingshi530100"},
+		{ name: "昆山市", code: "320583", pinyin: "kunshanshi320583"},
+		{ name: "昆玉市", code: "659009", pinyin: "kunyushi659009"}
+	],
+	L: [
+		{ name: "来宾市", code: "451300", pinyin: "laibinshi451300"},
+		{ name: "莱西市", code: "370285", pinyin: "laixishi370285"},
+		{ name: "莱阳市", code: "370682", pinyin: "laiyangshi370682"},
+		{ name: "莱州市", code: "370683", pinyin: "laizhoushi370683"},
+		{ name: "廊坊市", code: "131000", pinyin: "langfangshi131000"},
+		{ name: "阆中市", code: "511381", pinyin: "langzhongshi511381"},
+		{ name: "兰溪市", code: "330781", pinyin: "lanxishi330781"},
+		{ name: "兰州市", code: "620100", pinyin: "lanzhoushi620100"},
+		{ name: "老河口市", code: "420682", pinyin: "laohekoushi420682"},
+		{ name: "拉萨市", code: "540100", pinyin: "lasashi540100"},
+		{ name: "乐昌市", code: "440281", pinyin: "lechangshi440281"},
+		{ name: "耒阳市", code: "430481", pinyin: "leiyangshi430481"},
+		{ name: "雷州市", code: "440882", pinyin: "leizhoushi440882"},
+		{ name: "乐陵市", code: "371481", pinyin: "lelingshi371481"},
+		{ name: "冷水江市", code: "431381", pinyin: "lengshuijiangshi431381"},
+		{ name: "乐平市", code: "360281", pinyin: "lepingshi360281"},
+		{ name: "乐清市", code: "330382", pinyin: "leqingshi330382"},
+		{ name: "乐山市", code: "511100", pinyin: "leshanshi511100"},
+		{ name: "廉江市", code: "440881", pinyin: "lianjiangshi440881"},
+		{ name: "涟源市", code: "431382", pinyin: "lianyuanshi431382"},
+		{ name: "连云港市", code: "320700", pinyin: "lianyungangshi320700"},
+		{ name: "连州市", code: "441882", pinyin: "lianzhoushi441882"},
+		{ name: "聊城市", code: "371500", pinyin: "liaochengshi371500"},
+		{ name: "辽阳市", code: "211000", pinyin: "liaoyangshi211000"},
+		{ name: "辽源市", code: "220400", pinyin: "liaoyuanshi220400"},
+		{ name: "利川市", code: "422802", pinyin: "lichuanshi422802"},
+		{ name: "丽江市", code: "530700", pinyin: "lijiangshi530700"},
+		{ name: "醴陵市", code: "430281", pinyin: "lilingshi430281"},
+		{ name: "临沧市", code: "530900", pinyin: "lincangshi530900"},
+		{ name: "临汾市", code: "141000", pinyin: "linfenshi141000"},
+		{ name: "灵宝市", code: "411282", pinyin: "lingbaoshi411282"},
+		{ name: "凌海市", code: "210781", pinyin: "linghaishi210781"},
+		{ name: "灵武市", code: "640181", pinyin: "lingwushi640181"},
+		{ name: "凌源市", code: "211382", pinyin: "lingyuanshi211382"},
+		{ name: "临海市", code: "331082", pinyin: "linhaishi331082"},
+		{ name: "临江市", code: "220681", pinyin: "linjiangshi220681"},
+		{ name: "临清市", code: "371581", pinyin: "linqingshi371581"},
+		{ name: "临湘市", code: "430682", pinyin: "linxiangshi430682"},
+		{ name: "临夏市", code: "622901", pinyin: "linxiashi622901"},
+		{ name: "临沂市", code: "371300", pinyin: "linyishi371300"},
+		{ name: "林芝市", code: "540400", pinyin: "linzhishi540400"},
+		{ name: "林州市", code: "410581", pinyin: "linzhoushi410581"},
+		{ name: "荔浦市", code: "450381", pinyin: "lipushi450381"},
+		{ name: "丽水市", code: "331100", pinyin: "lishuishi331100"},
+		{ name: "六安市", code: "341500", pinyin: "liuanshi341500"},
+		{ name: "六盘水市", code: "520200", pinyin: "liupanshuishi520200"},
+		{ name: "浏阳市", code: "430181", pinyin: "liuyangshi430181"},
+		{ name: "柳州市", code: "450200", pinyin: "liuzhoushi450200"},
+		{ name: "溧阳市", code: "320481", pinyin: "liyangshi320481"},
+		{ name: "隆昌市", code: "511083", pinyin: "longchangshi511083"},
+		{ name: "龙港市", code: "330383", pinyin: "longgangshi330383"},
+		{ name: "龙海市", code: "350681", pinyin: "longhaishi350681"},
+		{ name: "龙井市", code: "222405", pinyin: "longjingshi222405"},
+		{ name: "龙口市", code: "370681", pinyin: "longkoushi370681"},
+		{ name: "陇南市", code: "621200", pinyin: "longnanshi621200"},
+		{ name: "龙泉市", code: "331181", pinyin: "longquanshi331181"},
+		{ name: "龙岩市", code: "350800", pinyin: "longyanshi350800"},
+		{ name: "娄底市", code: "431300", pinyin: "loudishi431300"},
+		{ name: "滦州市", code: "130284", pinyin: "luanzhoushi130284"},
+		{ name: "陆丰市", code: "441581", pinyin: "lufengshi441581"},
+		{ name: "罗定市", code: "445381", pinyin: "luodingshi445381"},
+		{ name: "漯河市", code: "411100", pinyin: "luoheshi411100"},
+		{ name: "洛阳市", code: "410300", pinyin: "luoyangshi410300"},
+		{ name: "庐山市", code: "360483", pinyin: "lushanshi360483"},
+		{ name: "泸水市", code: "533301", pinyin: "lushuishi533301"},
+		{ name: "泸州市", code: "510500", pinyin: "luzhoushi510500"},
+		{ name: "吕梁市", code: "141100", pinyin: "lvliangshi141100"}
+	],
+	M: [
+		{ name: "马鞍山市", code: "340500", pinyin: "maanshanshi340500"},
+		{ name: "麻城市", code: "421181", pinyin: "machengshi421181"},
+		{ name: "马尔康市", code: "513201", pinyin: "maerkangshi513201"},
+		{ name: "芒市", code: "533103", pinyin: "mangshi533103"},
+		{ name: "茫崖市", code: "632803", pinyin: "mangyashi632803"},
+		{ name: "满洲里市", code: "150781", pinyin: "manzhoulishi150781"},
+		{ name: "茂名市", code: "440900", pinyin: "maomingshi440900"},
+		{ name: "梅河口市", code: "220581", pinyin: "meihekoushi220581"},
+		{ name: "眉山市", code: "511400", pinyin: "meishanshi511400"},
+		{ name: "梅州市", code: "441400", pinyin: "meizhoushi441400"},
+		{ name: "孟州市", code: "410883", pinyin: "mengzhoushi410883"},
+		{ name: "蒙自市", code: "532503", pinyin: "mengzishi532503"},
+		{ name: "绵阳市", code: "510700", pinyin: "mianyangshi510700"},
+		{ name: "绵竹市", code: "510683", pinyin: "mianzhushi510683"},
+		{ name: "弥勒市", code: "532504", pinyin: "mileshi532504"},
+		{ name: "汨罗市", code: "430681", pinyin: "miluoshi430681"},
+		{ name: "明光市", code: "341182", pinyin: "mingguangshi341182"},
+		{ name: "密山市", code: "230382", pinyin: "mishanshi230382"},
+		{ name: "漠河市", code: "232701", pinyin: "moheshi232701"},
+		{ name: "牡丹江市", code: "231000", pinyin: "mudanjiangshi231000"},
+		{ name: "穆棱市", code: "231085", pinyin: "mulengshi231085"}
+	],
+	N: [
+		{ name: "南安市", code: "350583", pinyin: "nananshi350583"},
+		{ name: "南昌市", code: "360100", pinyin: "nanchangshi360100"},
+		{ name: "南充市", code: "511300", pinyin: "nanchongshi511300"},
+		{ name: "南宫市", code: "130581", pinyin: "nangongshi130581"},
+		{ name: "南京市", code: "320100", pinyin: "nanjingshi320100"},
+		{ name: "南宁市", code: "450100", pinyin: "nanningshi450100"},
+		{ name: "南平市", code: "350700", pinyin: "nanpingshi350700"},
+		{ name: "南通市", code: "320600", pinyin: "nantongshi320600"},
+		{ name: "南雄市", code: "440282", pinyin: "nanxiongshi440282"},
+		{ name: "南阳市", code: "411300", pinyin: "nanyangshi411300"},
+		{ name: "那曲市", code: "540600", pinyin: "naqushi540600"},
+		{ name: "讷河市", code: "230281", pinyin: "neheshi230281"},
+		{ name: "内江市", code: "511000", pinyin: "neijiangshi511000"},
+		{ name: "嫩江市", code: "231183", pinyin: "nenjiangshi231183"},
+		{ name: "宁安市", code: "231084", pinyin: "ninganshi231084"},
+		{ name: "宁波市", code: "330200", pinyin: "ningboshi330200"},
+		{ name: "宁德市", code: "350900", pinyin: "ningdeshi350900"},
+		{ name: "宁国市", code: "341881", pinyin: "ningguoshi341881"},
+		{ name: "宁乡市", code: "430182", pinyin: "ningxiangshi430182"}
+	],
+	P: [
+		{ name: "盘锦市", code: "211100", pinyin: "panjinshi211100"},
+		{ name: "磐石市", code: "220284", pinyin: "panshishi220284"},
+		{ name: "攀枝花市", code: "510400", pinyin: "panzhihuashi510400"},
+		{ name: "盘州市", code: "520281", pinyin: "panzhoushi520281"},
+		{ name: "蓬莱市", code: "370684", pinyin: "penglaishi370684"},
+		{ name: "彭州市", code: "510182", pinyin: "pengzhoushi510182"},
+		{ name: "平顶山市", code: "410400", pinyin: "pingdingshanshi410400"},
+		{ name: "平度市", code: "370283", pinyin: "pingdushi370283"},
+		{ name: "平果市", code: "451082", pinyin: "pingguoshi451082"},
+		{ name: "平湖市", code: "330482", pinyin: "pinghushi330482"},
+		{ name: "平凉市", code: "620800", pinyin: "pingliangshi620800"},
+		{ name: "平泉市", code: "130881", pinyin: "pingquanshi130881"},
+		{ name: "萍乡市", code: "360300", pinyin: "pingxiangshi360300"},
+		{ name: "凭祥市", code: "451481", pinyin: "pingxiangshi451481"},
+		{ name: "邳州市", code: "320382", pinyin: "pizhoushi320382"},
+		{ name: "普洱市", code: "530800", pinyin: "puershi530800"},
+		{ name: "普宁市", code: "445281", pinyin: "puningshi445281"},
+		{ name: "莆田市", code: "350300", pinyin: "putianshi350300"},
+		{ name: "濮阳市", code: "410900", pinyin: "puyangshi410900"}
+	],
+	Q: [
+		{ name: "迁安市", code: "130283", pinyin: "qiananshi130283"},
+		{ name: "潜江市", code: "429005", pinyin: "qianjiangshi429005"},
+		{ name: "潜山市", code: "340882", pinyin: "qianshanshi340882"},
+		{ name: "启东市", code: "320681", pinyin: "qidongshi320681"},
+		{ name: "青岛市", code: "370200", pinyin: "qingdaoshi370200"},
+		{ name: "青铜峡市", code: "640381", pinyin: "qingtongxiashi640381"},
+		{ name: "庆阳市", code: "621000", pinyin: "qingyangshi621000"},
+		{ name: "清远市", code: "441800", pinyin: "qingyuanshi441800"},
+		{ name: "清镇市", code: "520181", pinyin: "qingzhenshi520181"},
+		{ name: "青州市", code: "370781", pinyin: "qingzhoushi370781"},
+		{ name: "秦皇岛市", code: "130300", pinyin: "qinhuangdaoshi130300"},
+		{ name: "沁阳市", code: "410882", pinyin: "qinyangshi410882"},
+		{ name: "钦州市", code: "450700", pinyin: "qinzhoushi450700"},
+		{ name: "琼海市", code: "469002", pinyin: "qionghaishi469002"},
+		{ name: "齐齐哈尔市", code: "230200", pinyin: "qiqihaershi230200"},
+		{ name: "七台河市", code: "230900", pinyin: "qitaiheshi230900"},
+		{ name: "栖霞市", code: "370686", pinyin: "qixiashi370686"},
+		{ name: "泉州市", code: "350500", pinyin: "quanzhoushi350500"},
+		{ name: "曲阜市", code: "370881", pinyin: "qufushi370881"},
+		{ name: "曲靖市", code: "530300", pinyin: "qujingshi530300"},
+		{ name: "衢州市", code: "330800", pinyin: "quzhoushi330800"}
+	],
+	R: [
+		{ name: "仁怀市", code: "520382", pinyin: "renhuaishi520382"},
+		{ name: "任丘市", code: "130982", pinyin: "renqiushi130982"},
+		{ name: "日喀则市", code: "540200", pinyin: "rikazeshi540200"},
+		{ name: "日照市", code: "371100", pinyin: "rizhaoshi371100"},
+		{ name: "荣成市", code: "371082", pinyin: "rongchengshi371082"},
+		{ name: "如皋市", code: "320682", pinyin: "rugaoshi320682"},
+		{ name: "瑞安市", code: "330381", pinyin: "ruianshi330381"},
+		{ name: "瑞昌市", code: "360481", pinyin: "ruichangshi360481"},
+		{ name: "瑞金市", code: "360781", pinyin: "ruijinshi360781"},
+		{ name: "瑞丽市", code: "533102", pinyin: "ruilishi533102"},
+		{ name: "乳山市", code: "371083", pinyin: "rushanshi371083"},
+		{ name: "汝州市", code: "410482", pinyin: "ruzhoushi410482"}
+	],
+	S: [
+		{ name: "三河市", code: "131082", pinyin: "sanheshi131082"},
+		{ name: "三门峡市", code: "411200", pinyin: "sanmenxiashi411200"},
+		{ name: "三明市", code: "350400", pinyin: "sanmingshi350400"},
+		{ name: "三沙市", code: "460300", pinyin: "sanshashi460300"},
+		{ name: "三亚市", code: "460200", pinyin: "sanyashi460200"},
+		{ name: "沙河市", code: "130582", pinyin: "shaheshi130582"},
+		{ name: "上海市", code: "310000", pinyin: "shanghaishi310000"},
+		{ name: "商洛市", code: "611000", pinyin: "shangluoshi611000"},
+		{ name: "商丘市", code: "411400", pinyin: "shangqiushi411400"},
+		{ name: "上饶市", code: "361100", pinyin: "shangraoshi361100"},
+		{ name: "尚志市", code: "230183", pinyin: "shangzhishi230183"},
+		{ name: "山南市", code: "540500", pinyin: "shannanshi540500"},
+		{ name: "汕头市", code: "440500", pinyin: "shantoushi440500"},
+		{ name: "汕尾市", code: "441500", pinyin: "shanweishi441500"},
+		{ name: "邵东市", code: "430582", pinyin: "shaodongshi430582"},
+		{ name: "韶关市", code: "440200", pinyin: "shaoguanshi440200"},
+		{ name: "韶山市", code: "430382", pinyin: "shaoshanshi430382"},
+		{ name: "邵武市", code: "350781", pinyin: "shaowushi350781"},
+		{ name: "绍兴市", code: "330600", pinyin: "shaoxingshi330600"},
+		{ name: "邵阳市", code: "430500", pinyin: "shaoyangshi430500"},
+		{ name: "射洪市", code: "510981", pinyin: "shehongshi510981"},
+		{ name: "什邡市", code: "510682", pinyin: "shenfangshi510682"},
+		{ name: "嵊州市", code: "330683", pinyin: "shengzhoushi330683"},
+		{ name: "神木市", code: "610881", pinyin: "shenmushi610881"},
+		{ name: "沈阳市", code: "210100", pinyin: "shenyangshi210100"},
+		{ name: "深圳市", code: "440300", pinyin: "shenzhenshi440300"},
+		{ name: "深州市", code: "131182", pinyin: "shenzhoushi131182"},
+		{ name: "石河子市", code: "659001", pinyin: "shihezishi659001"},
+		{ name: "石家庄市", code: "130100", pinyin: "shijiazhuangshi130100"},
+		{ name: "石狮市", code: "350581", pinyin: "shishishi350581"},
+		{ name: "石首市", code: "421081", pinyin: "shishoushi421081"},
+		{ name: "十堰市", code: "420300", pinyin: "shiyanshi420300"},
+		{ name: "石嘴山市", code: "640200", pinyin: "shizuishanshi640200"},
+		{ name: "寿光市", code: "370783", pinyin: "shouguangshi370783"},
+		{ name: "双河市", code: "659007", pinyin: "shuangheshi659007"},
+		{ name: "双辽市", code: "220382", pinyin: "shuangliaoshi220382"},
+		{ name: "双鸭山市", code: "230500", pinyin: "shuangyashanshi230500"},
+		{ name: "水富市", code: "530681", pinyin: "shuifushi530681"},
+		{ name: "舒兰市", code: "220283", pinyin: "shulanshi220283"},
+		{ name: "朔州市", code: "140600", pinyin: "shuozhoushi140600"},
+		{ name: "四会市", code: "441284", pinyin: "sihuishi441284"},
+		{ name: "四平市", code: "220300", pinyin: "sipingshi220300"},
+		{ name: "松原市", code: "220700", pinyin: "songyuanshi220700"},
+		{ name: "松滋市", code: "421087", pinyin: "songzishi421087"},
+		{ name: "绥芬河市", code: "231081", pinyin: "suifenheshi231081"},
+		{ name: "绥化市", code: "231200", pinyin: "suihuashi231200"},
+		{ name: "遂宁市", code: "510900", pinyin: "suiningshi510900"},
+		{ name: "随州市", code: "421300", pinyin: "suizhoushi421300"},
+		{ name: "苏州市", code: "320500", pinyin: "suzhoushi320500"}
+	],
+	T: [
+		{ name: "塔城市", code: "654201", pinyin: "tachengshi654201"},
+		{ name: "泰安市", code: "370900", pinyin: "taianshi370900"},
+		{ name: "太仓市", code: "320585", pinyin: "taicangshi320585"},
+		{ name: "台山市", code: "440781", pinyin: "taishanshi440781"},
+		{ name: "泰兴市", code: "321283", pinyin: "taixingshi321283"},
+		{ name: "太原市", code: "140100", pinyin: "taiyuanshi140100"},
+		{ name: "泰州市", code: "321200", pinyin: "taizhoushi321200"},
+		{ name: "台州市", code: "331000", pinyin: "taizhoushi331000"},
+		{ name: "唐山市", code: "130200", pinyin: "tangshanshi130200"},
+		{ name: "洮南市", code: "220881", pinyin: "taonanshi220881"},
+		{ name: "腾冲市", code: "530581", pinyin: "tengchongshi530581"},
+		{ name: "滕州市", code: "370481", pinyin: "tengzhoushi370481"},
+		{ name: "天长市", code: "341181", pinyin: "tianchangshi341181"},
+		{ name: "天津市", code: "120000", pinyin: "tianjinshi120000"},
+		{ name: "天门市", code: "429006", pinyin: "tianmenshi429006"},
+		{ name: "天水市", code: "620500", pinyin: "tianshuishi620500"},
+		{ name: "调兵山市", code: "211281", pinyin: "tiaobingshanshi211281"},
+		{ name: "铁岭市", code: "211200", pinyin: "tielingshi211200"},
+		{ name: "铁力市", code: "230781", pinyin: "tielishi230781"},
+		{ name: "铁门关市", code: "659006", pinyin: "tiemenguanshi659006"},
+		{ name: "桐城市", code: "340881", pinyin: "tongchengshi340881"},
+		{ name: "铜川市", code: "610200", pinyin: "tongchuanshi610200"},
+		{ name: "通化市", code: "220500", pinyin: "tonghuashi220500"},
+		{ name: "同江市", code: "230881", pinyin: "tongjiangshi230881"},
+		{ name: "通辽市", code: "150500", pinyin: "tongliaoshi150500"},
+		{ name: "铜陵市", code: "340700", pinyin: "tonglingshi340700"},
+		{ name: "铜仁市", code: "520600", pinyin: "tongrenshi520600"},
+		{ name: "桐乡市", code: "330483", pinyin: "tongxiangshi330483"},
+		{ name: "吐鲁番市", code: "650400", pinyin: "tulufanshi650400"},
+		{ name: "图们市", code: "222402", pinyin: "tumenshi222402"},
+		{ name: "图木舒克市", code: "659003", pinyin: "tumushukeshi659003"}
+	],
+	W: [
+		{ name: "瓦房店市", code: "210281", pinyin: "wafangdianshi210281"},
+		{ name: "万宁市", code: "469006", pinyin: "wanningshi469006"},
+		{ name: "万源市", code: "511781", pinyin: "wanyuanshi511781"},
+		{ name: "潍坊市", code: "370700", pinyin: "weifangshi370700"},
+		{ name: "威海市", code: "371000", pinyin: "weihaishi371000"},
+		{ name: "卫辉市", code: "410781", pinyin: "weihuishi410781"},
+		{ name: "渭南市", code: "610500", pinyin: "weinanshi610500"},
+		{ name: "文昌市", code: "469005", pinyin: "wenchangshi469005"},
+		{ name: "温岭市", code: "331081", pinyin: "wenlingshi331081"},
+		{ name: "文山市", code: "532601", pinyin: "wenshanshi532601"},
+		{ name: "温州市", code: "330300", pinyin: "wenzhoushi330300"},
+		{ name: "武安市", code: "130481", pinyin: "wuanshi130481"},
+		{ name: "五常市", code: "230184", pinyin: "wuchangshi230184"},
+		{ name: "吴川市", code: "440883", pinyin: "wuchuanshi440883"},
+		{ name: "五大连池市", code: "231182", pinyin: "wudalianchishi231182"},
+		{ name: "舞钢市", code: "410481", pinyin: "wugangshi410481"},
+		{ name: "武冈市", code: "430581", pinyin: "wugangshi430581"},
+		{ name: "乌海市", code: "150300", pinyin: "wuhaishi150300"},
+		{ name: "武汉市", code: "420100", pinyin: "wuhanshi420100"},
+		{ name: "芜湖市", code: "340200", pinyin: "wuhushi340200"},
+		{ name: "五家渠市", code: "659004", pinyin: "wujiaqushi659004"},
+		{ name: "乌兰察布市", code: "150900", pinyin: "wulanchabushi150900"},
+		{ name: "乌兰浩特市", code: "152201", pinyin: "wulanhaoteshi152201"},
+		{ name: "乌鲁木齐市", code: "650100", pinyin: "wulumuqishi650100"},
+		{ name: "乌苏市", code: "654202", pinyin: "wusushi654202"},
+		{ name: "无为市", code: "340281", pinyin: "wuweishi340281"},
+		{ name: "武威市", code: "620600", pinyin: "wuweishi620600"},
+		{ name: "无锡市", code: "320200", pinyin: "wuxishi320200"},
+		{ name: "武穴市", code: "421182", pinyin: "wuxueshi421182"},
+		{ name: "武夷山市", code: "350782", pinyin: "wuyishanshi350782"},
+		{ name: "五指山市", code: "469001", pinyin: "wuzhishanshi469001"},
+		{ name: "吴忠市", code: "640300", pinyin: "wuzhongshi640300"},
+		{ name: "梧州市", code: "450400", pinyin: "wuzhoushi450400"}
+	],
+	X: [
+		{ name: "厦门市", code: "350200", pinyin: "xiamenshi350200"},
+		{ name: "项城市", code: "411681", pinyin: "xiangchengshi411681"},
+		{ name: "香格里拉市", code: "533401", pinyin: "xianggelilashi533401"},
+		{ name: "湘潭市", code: "430300", pinyin: "xiangtanshi430300"},
+		{ name: "湘乡市", code: "430381", pinyin: "xiangxiangshi430381"},
+		{ name: "襄阳市", code: "420600", pinyin: "xiangyangshi420600"},
+		{ name: "咸宁市", code: "421200", pinyin: "xianningshi421200"},
+		{ name: "西安市", code: "610100", pinyin: "xianshi610100"},
+		{ name: "仙桃市", code: "429004", pinyin: "xiantaoshi429004"},
+		{ name: "咸阳市", code: "610400", pinyin: "xianyangshi610400"},
+		{ name: "孝感市", code: "420900", pinyin: "xiaoganshi420900"},
+		{ name: "孝义市", code: "141181", pinyin: "xiaoyishi141181"},
+		{ name: "西昌市", code: "513401", pinyin: "xichangshi513401"},
+		{ name: "锡林浩特市", code: "152502", pinyin: "xilinhaoteshi152502"},
+		{ name: "兴城市", code: "211481", pinyin: "xingchengshi211481"},
+		{ name: "兴化市", code: "321281", pinyin: "xinghuashi321281"},
+		{ name: "兴宁市", code: "441481", pinyin: "xingningshi441481"},
+		{ name: "兴平市", code: "610481", pinyin: "xingpingshi610481"},
+		{ name: "兴仁市", code: "522302", pinyin: "xingrenshi522302"},
+		{ name: "邢台市", code: "130500", pinyin: "xingtaishi130500"},
+		{ name: "兴义市", code: "522301", pinyin: "xingyishi522301"},
+		{ name: "西宁市", code: "630100", pinyin: "xiningshi630100"},
+		{ name: "辛集市", code: "130181", pinyin: "xinjishi130181"},
+		{ name: "新乐市", code: "130184", pinyin: "xinleshi130184"},
+		{ name: "新民市", code: "210181", pinyin: "xinminshi210181"},
+		{ name: "新密市", code: "410183", pinyin: "xinmishi410183"},
+		{ name: "新泰市", code: "370982", pinyin: "xintaishi370982"},
+		{ name: "新乡市", code: "410700", pinyin: "xinxiangshi410700"},
+		{ name: "信阳市", code: "411500", pinyin: "xinyangshi411500"},
+		{ name: "新沂市", code: "320381", pinyin: "xinyishi320381"},
+		{ name: "信宜市", code: "440983", pinyin: "xinyishi440983"},
+		{ name: "新余市", code: "360500", pinyin: "xinyushi360500"},
+		{ name: "新郑市", code: "410184", pinyin: "xinzhengshi410184"},
+		{ name: "忻州市", code: "140900", pinyin: "xinzhoushi140900"},
+		{ name: "宿迁市", code: "321300", pinyin: "xiuqianshi321300"},
+		{ name: "宿州市", code: "341300", pinyin: "xiuzhoushi341300"},
+		{ name: "宣城市", code: "341800", pinyin: "xuanchengshi341800"},
+		{ name: "宣威市", code: "530381", pinyin: "xuanweishi530381"},
+		{ name: "许昌市", code: "411000", pinyin: "xuchangshi411000"},
+		{ name: "徐州市", code: "320300", pinyin: "xuzhoushi320300"},
+		{ name: "香港特别行政区", coder:"810000", pinyin:"xianggang81000"}
+	],
+	Y: [
+		{ name: "雅安市", code: "511800", pinyin: "yaanshi511800"},
+		{ name: "牙克石市", code: "150782", pinyin: "yakeshishi150782"},
+		{ name: "延安市", code: "610600", pinyin: "yananshi610600"},
+		{ name: "盐城市", code: "320900", pinyin: "yanchengshi320900"},
+		{ name: "阳春市", code: "441781", pinyin: "yangchunshi441781"},
+		{ name: "阳江市", code: "441700", pinyin: "yangjiangshi441700"},
+		{ name: "阳泉市", code: "140300", pinyin: "yangquanshi140300"},
+		{ name: "扬中市", code: "321182", pinyin: "yangzhongshi321182"},
+		{ name: "扬州市", code: "321000", pinyin: "yangzhoushi321000"},
+		{ name: "延吉市", code: "222401", pinyin: "yanjishi222401"},
+		{ name: "偃师市", code: "410381", pinyin: "yanshishi410381"},
+		{ name: "烟台市", code: "370600", pinyin: "yantaishi370600"},
+		{ name: "宜宾市", code: "511500", pinyin: "yibinshi511500"},
+		{ name: "宜昌市", code: "420500", pinyin: "yichangshi420500"},
+		{ name: "宜城市", code: "420684", pinyin: "yichengshi420684"},
+		{ name: "伊春市", code: "230700", pinyin: "yichunshi230700"},
+		{ name: "宜春市", code: "360900", pinyin: "yichunshi360900"},
+		{ name: "宜都市", code: "420581", pinyin: "yidoushi420581"},
+		{ name: "义马市", code: "411281", pinyin: "yimashi411281"},
+		{ name: "银川市", code: "640100", pinyin: "yinchuanshi640100"},
+		{ name: "应城市", code: "420981", pinyin: "yingchengshi420981"},
+		{ name: "英德市", code: "441881", pinyin: "yingdeshi441881"},
+		{ name: "营口市", code: "210800", pinyin: "yingkoushi210800"},
+		{ name: "鹰潭市", code: "360600", pinyin: "yingtanshi360600"},
+		{ name: "荥阳市", code: "410182", pinyin: "yingyangshi410182"},
+		{ name: "伊宁市", code: "654002", pinyin: "yiningshi654002"},
+		{ name: "义乌市", code: "330782", pinyin: "yiwushi330782"},
+		{ name: "宜兴市", code: "320282", pinyin: "yixingshi320282"},
+		{ name: "益阳市", code: "430900", pinyin: "yiyangshi430900"},
+		{ name: "仪征市", code: "321081", pinyin: "yizhengshi321081"},
+		{ name: "永安市", code: "350481", pinyin: "yonganshi350481"},
+		{ name: "永城市", code: "411481", pinyin: "yongchengshi411481"},
+		{ name: "永济市", code: "140881", pinyin: "yongjishi140881"},
+		{ name: "永康市", code: "330784", pinyin: "yongkangshi330784"},
+		{ name: "永州市", code: "431100", pinyin: "yongzhoushi431100"},
+		{ name: "沅江市", code: "430981", pinyin: "yuanjiangshi430981"},
+		{ name: "原平市", code: "140981", pinyin: "yuanpingshi140981"},
+		{ name: "禹城市", code: "371482", pinyin: "yuchengshi371482"},
+		{ name: "岳阳市", code: "430600", pinyin: "yueyangshi430600"},
+		{ name: "玉环市", code: "331083", pinyin: "yuhuanshi331083"},
+		{ name: "玉林市", code: "450900", pinyin: "yulinshi450900"},
+		{ name: "榆林市", code: "610800", pinyin: "yulinshi610800"},
+		{ name: "玉门市", code: "620981", pinyin: "yumenshi620981"},
+		{ name: "运城市", code: "140800", pinyin: "yunchengshi140800"},
+		{ name: "云浮市", code: "445300", pinyin: "yunfushi445300"},
+		{ name: "榆树市", code: "220182", pinyin: "yushushi220182"},
+		{ name: "玉树市", code: "632701", pinyin: "yushushi632701"},
+		{ name: "玉溪市", code: "530400", pinyin: "yuxishi530400"},
+		{ name: "余姚市", code: "330281", pinyin: "yuyaoshi330281"},
+		{ name: "禹州市", code: "411081", pinyin: "yuzhoushi411081"}
+	],
+	Z: [
+		{ name: "枣阳市", code: "420683", pinyin: "zaoyangshi420683"},
+		{ name: "枣庄市", code: "370400", pinyin: "zaozhuangshi370400"},
+		{ name: "扎兰屯市", code: "150783", pinyin: "zhalantunshi150783"},
+		{ name: "张家港市", code: "320582", pinyin: "zhangjiagangshi320582"},
+		{ name: "张家界市", code: "430800", pinyin: "zhangjiajieshi430800"},
+		{ name: "张家口市", code: "130700", pinyin: "zhangjiakoushi130700"},
+		{ name: "漳平市", code: "350881", pinyin: "zhangpingshi350881"},
+		{ name: "樟树市", code: "360982", pinyin: "zhangshushi360982"},
+		{ name: "张掖市", code: "620700", pinyin: "zhangyeshi620700"},
+		{ name: "漳州市", code: "350600", pinyin: "zhangzhoushi350600"},
+		{ name: "湛江市", code: "440800", pinyin: "zhanjiangshi440800"},
+		{ name: "肇东市", code: "231282", pinyin: "zhaodongshi231282"},
+		{ name: "肇庆市", code: "441200", pinyin: "zhaoqingshi441200"},
+		{ name: "昭通市", code: "530600", pinyin: "zhaotongshi530600"},
+		{ name: "招远市", code: "370685", pinyin: "zhaoyuanshi370685"},
+		{ name: "郑州市", code: "410100", pinyin: "zhengzhoushi410100"},
+		{ name: "镇江市", code: "321100", pinyin: "zhenjiangshi321100"},
+		{ name: "枝江市", code: "420583", pinyin: "zhijiangshi420583"},
+		{ name: "重庆市", code: "500000", pinyin: "zhongqingshi500000"},
+		{ name: "中山市", code: "442000", pinyin: "zhongshanshi442000"},
+		{ name: "中卫市", code: "640500", pinyin: "zhongweishi640500"},
+		{ name: "钟祥市", code: "420881", pinyin: "zhongxiangshi420881"},
+		{ name: "周口市", code: "411600", pinyin: "zhoukoushi411600"},
+		{ name: "舟山市", code: "330900", pinyin: "zhoushanshi330900"},
+		{ name: "庄河市", code: "210283", pinyin: "zhuangheshi210283"},
+		{ name: "诸城市", code: "370782", pinyin: "zhuchengshi370782"},
+		{ name: "珠海市", code: "440400", pinyin: "zhuhaishi440400"},
+		{ name: "诸暨市", code: "330681", pinyin: "zhujishi330681"},
+		{ name: "驻马店市", code: "411700", pinyin: "zhumadianshi411700"},
+		{ name: "涿州市", code: "130681", pinyin: "zhuozhoushi130681"},
+		{ name: "株洲市", code: "430200", pinyin: "zhuzhoushi430200"},
+		{ name: "淄博市", code: "370300", pinyin: "ziboshi370300"},
+		{ name: "子长市", code: "610681", pinyin: "zichangshi610681"},
+		{ name: "自贡市", code: "510300", pinyin: "zigongshi510300"},
+		{ name: "资兴市", code: "431081", pinyin: "zixingshi431081"},
+		{ name: "资阳市", code: "512000", pinyin: "ziyangshi512000"},
+		{ name: "邹城市", code: "370883", pinyin: "zouchengshi370883"},
+		{ name: "邹平市", code: "371681", pinyin: "zoupingshi371681"},
+		{ name: "遵化市", code: "130281", pinyin: "zunhuashi130281"},
+		{ name: "遵义市", code: "520300", pinyin: "zunyishi520300"}
+	]
+};
+var AZ = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'W', 'X', 'Y', 'Z'];
+module.exports = {
+	cityData: cityData,
+	AZ : AZ
+} 

+ 106 - 0
lib/GraceUI5/demoData/article.js

@@ -0,0 +1,106 @@
+module.exports  = {
+	articleList : [
+		{
+			id         : 1, 
+			title      : '新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : ['https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/18.png'],
+			views      : 98052
+		},
+		{
+			id         : 2, 
+			title      : '新闻标题文本长文本新闻标题文本长文本新闻标题文本长文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/1.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/2.png'
+			],
+			views      : 8052
+		},
+		{
+			id         : 3, 
+			title      : '新闻标题文本,新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/17.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/17.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/19.png'
+			],
+			views      : 62012
+		},
+		{
+			id         : 4, 
+			title      : '新闻标题文本新闻标题文本新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [],
+			views      : 680
+		},
+		{
+			id         : 5, 
+			title      : '新闻标题文本新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/17.png'
+			],
+			views      : 5201
+		},
+		{
+			id         : 6, 
+			title      : '新闻标题文本新闻标题文本新闻标题文本新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/21.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/26.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/27.png'
+			],
+			views      : 5200
+		},
+		{
+			id         : 7, 
+			title      : '新闻标题文本新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/7.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/8.png'
+			],
+			views      : 36801
+		},
+		{
+			id         : 8, 
+			title      : '新闻标题文本新闻标题文本新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [],
+			views      : 58660
+		},
+		{
+			id         : 9, 
+			title      : '新闻标题文本,新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/19.png'
+			],
+			views      : 98665
+		},
+		{
+			id         : 10, 
+			title      : '新闻标题文本新闻标题文本',
+			author     : '某某作者',
+			createTime : '2020.09.05',
+			imgs       : [
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',
+				'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png'
+			],
+			views      : 13205
+		}
+	]
+} 

+ 100 - 0
lib/GraceUI5/demoData/cateChange.js

@@ -0,0 +1,100 @@
+module.exports  = {
+	products : [
+		{ cateid: 1, name: '分类 · 01' , products:[
+			{id:11,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:12,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:13,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:14,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:15,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:16,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 2, name: '分类 · 02', products:[
+			{id:21,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:22,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:23,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:24,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:25,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:26,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 3, name: '分类 · 03' ,products:[
+			{id:31,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:32,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:33,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:34,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:35,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:36,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 4, name: '分类 · 04' ,products:[
+			{id:41,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:42,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:43,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:44,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:45,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:46,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 5, name: '分类 · 05' ,products:[
+			{id:51,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:52,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:53,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:54,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:55,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:56,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 6, name: '分类 · 06' ,products:[
+			{id:61,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:62,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:63,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:64,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:65,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:66,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 7, name: '分类 · 07' ,products:[
+			{id:71,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:72,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:73,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:74,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:75,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:76,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 8, name: '分类 · 08' ,products:[
+			{id:81,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:82,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:83,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:84,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:85,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:86,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 9, name: '分类 · 09' ,products:[
+			{id:91,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:92,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:93,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:94,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:95,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:96,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 10, name: '分类 · 10' ,products:[
+			{id:101,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:102,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:103,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:104,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:105,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:106,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 11, name: '分类 · 11' ,products:[
+			{id:111,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:112,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:113,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:114,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:115,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:116,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]},
+		{ cateid: 12, name: '分类 · 12' ,products:[
+			{id:121,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',price:12.88},
+			{id:122,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/29.png',price:12.88},
+			{id:123,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/30.png',price:12.88},
+			{id:124,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/31.png',price:12.88},
+			{id:125,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/34.png',price:12.88},
+			{id:126,name:"标题",img:'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/37.png',price:12.88}
+		]}
+	]
+}

+ 65 - 0
lib/GraceUI5/demoData/data.js

@@ -0,0 +1,65 @@
+var products = [
+	{
+		"img": "https://img.alicdn.com/tfs/TB1Q2Org4rI8KJjy0FpXXb5hVXa-468-1236.jpg",
+		"title": "精品女装 限时出售",
+		"price": "¥99.88",
+		"tip": "HOT"
+	},
+	{
+		"img": "https://img.alicdn.com/bao/uploaded/i1/2146742267/O1CN011ScKLXPJaX9UQyq_!!0-item_pic.jpg",
+		"title": "女装特价",
+		"price": "¥16.99",
+		"tip": "名牌"
+	},
+	{
+		"img": "https://img.alicdn.com/tps/i4/TB1q42TjMTqK1RjSZPhSutfOFXa.jpg",
+		"title": "千元手机爆款",
+		"price": "¥999.99",
+		"tip": "推荐"
+	},
+	{
+		"img": "https://img.alicdn.com/tps/i4/TB1bhT6kr2pK1RjSZFswu1NlXXa.png",
+		"title": "进口儿童座椅",
+		"price": "¥698.99",
+		"tip": "进口"
+	},
+	{
+		"img": "https://img.alicdn.com/bao/uploaded/i1/2787417447/O1CN0124sly8iXb80L4OS_!!0-item_pic.jpg",
+		"title": "品牌T恤",
+		"price": "¥22.99",
+		"tip": "nike"
+	},
+	{
+		"img": "https://img.alicdn.com/tfs/TB13FixCeuSBuNjy1XcXXcYjFXa-468-1236.jpg",
+		"title": "好吃坚果",
+		"price": "¥55.99",
+		"tip": "吃货"
+	},
+	{
+		"img": "https://img.alicdn.com/bao/uploaded/i2/452325706/O1CN011s1OQAszoPWK8Rt_!!0-item_pic.jpg",
+		"title": "进口化妆品特价",
+		"price": "¥22.99",
+		"tip": "热卖"
+	},
+	{
+		"img": "https://img.alicdn.com/tps/i4/TB1bhT6kr2pK1RjSZFswu1NlXXa.png",
+		"title": "进口儿童座椅",
+		"price": "¥698.99",
+		"tip": "进口"
+	}
+];
+
+var getArrRandomly = function (arr) {
+	var len = arr.length;
+	for (var i = 0; i < len; i++) {
+		var randomIndex = Math.floor(Math.random() * (len - i));
+		var itemAtIndex = arr[randomIndex];
+		arr[randomIndex] = arr[i];
+		arr[i] = itemAtIndex;
+	}
+	return arr;
+}
+module.exports  = {
+	products : products,
+	getArrRandomly : getArrRandomly
+} 

+ 70 - 0
lib/GraceUI5/demoData/immessages.js

@@ -0,0 +1,70 @@
+var msgs = [
+	{
+		group         : 'group1',
+		uindex        : '10001',
+		uname         : '李晓燕',
+		contentType   : 'txt',
+		uface         : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/15.png',
+		content       : '昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否,知否?应是绿肥红瘦。',
+		date          : '2021.01.11 18:00'
+	},
+	{
+		group         : 'group1',
+		uindex        : '10000',
+		uname         : '老兵张嘎',
+		contentType   : 'txt',
+		uface         : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/13.png',
+		content       : '鼓掌 ...',
+		date          : '2021.01.11 19:20'
+	},
+	{
+		group         : 'group1',
+		uindex        : '10001',
+		uname         : '李晓燕',
+		contentType   : 'img',
+		uface         : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/15.png',
+		content       : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/25.png',
+		date          : '2021.01.11 19:22'
+	},
+	{
+		group         : 'group1',
+		uindex        : '10001',
+		uname         : 'system',
+		contentType   : 'system',
+		uface         : '',
+		msg       : '系统消息,GraceUI 欢迎您!',
+		date          : '2021.01.11 19:22'
+	},
+	{
+		group         : 'group1',
+		uindex        : '10000',
+		uname         : '老兵张嘎',
+		contentType   : 'img',
+		uface         : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/13.png',
+		content       : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/28.png',
+		date          : '2021.01.11 19:25'
+	},
+	{
+		group         : 'group1',
+		uindex        : '10001',
+		uname         : '李晓燕',
+		contentType   : 'voice',
+		uface         : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/15.png',
+		content       : 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3',
+		length        : 23,
+		date          : '一小时前'
+	},
+	{
+		group         : 'group1',
+		uindex        : '10000',
+		uname         : '老兵张嘎',
+		contentType   : 'voice',
+		uface         : 'https://cmsuse.oss-cn-beijing.aliyuncs.com/g5/13.png',
+		content       : 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3',
+		length        : 150,
+		date          : '15 分钟前'
+	}
+];
+module.exports  = {
+	msgs : msgs
+} 

+ 1265 - 0
lib/GraceUI5/js/WeCropper.js

@@ -0,0 +1,1265 @@
+/**
+ * we-cropper v1.3.9
+ * (c) 2020 dlhandsome
+ * @license MIT
+ */
+(function(global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+		typeof define === 'function' && define.amd ? define(factory) :
+		(global.WeCropper = factory());
+}(this, (function() {
+	'use strict';
+
+	var device = void 0;
+	var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended'];
+
+	function firstLetterUpper(str) {
+		return str.charAt(0).toUpperCase() + str.slice(1)
+	}
+
+	function setTouchState(instance) {
+		var arg = [],
+			len = arguments.length - 1;
+		while (len-- > 0) arg[len] = arguments[len + 1];
+
+		TOUCH_STATE.forEach(function(key, i) {
+			if (arg[i] !== undefined) {
+				instance[key] = arg[i];
+			}
+		});
+	}
+
+	function validator(instance, o) {
+		Object.defineProperties(instance, o);
+	}
+
+	function getDevice() {
+		if (!device) {
+			device = uni.getSystemInfoSync();
+		}
+		return device
+	}
+
+	var tmp = {};
+
+	var ref = getDevice();
+	var pixelRatio = ref.pixelRatio;
+
+	var DEFAULT = {
+		id: {
+			default: 'cropper',
+			get: function get() {
+				return tmp.id
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'string') {
+					console.error(("id:" + value + " is invalid"));
+				}
+				tmp.id = value;
+			}
+		},
+		width: {
+			default: 750,
+			get: function get() {
+				return tmp.width
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'number') {
+					console.error(("width:" + value + " is invalid"));
+				}
+				tmp.width = value;
+			}
+		},
+		height: {
+			default: 750,
+			get: function get() {
+				return tmp.height
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'number') {
+					console.error(("height:" + value + " is invalid"));
+				}
+				tmp.height = value;
+			}
+		},
+		pixelRatio: {
+			default: pixelRatio,
+			get: function get() {
+				return tmp.pixelRatio
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'number') {
+					console.error(("pixelRatio:" + value + " is invalid"));
+				}
+				tmp.pixelRatio = value;
+			}
+		},
+		scale: {
+			default: 2.5,
+			get: function get() {
+				return tmp.scale
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'number') {
+					console.error(("scale:" + value + " is invalid"));
+				}
+				tmp.scale = value;
+			}
+		},
+		zoom: {
+			default: 5,
+			get: function get() {
+				return tmp.zoom
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'number') {
+					console.error(("zoom:" + value + " is invalid"));
+				} else if (value < 0 || value > 10) {
+					console.error("zoom should be ranged in 0 ~ 10");
+				}
+				tmp.zoom = value;
+			}
+		},
+		src: {
+			default: '',
+			get: function get() {
+				return tmp.src
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'string') {
+					console.error(("src:" + value + " is invalid"));
+				}
+				tmp.src = value;
+			}
+		},
+		cut: {
+			default: {},
+			get: function get() {
+				return tmp.cut
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'object') {
+					console.error(("cut:" + value + " is invalid"));
+				}
+				tmp.cut = value;
+			}
+		},
+		boundStyle: {
+			default: {},
+			get: function get() {
+				return tmp.boundStyle
+			},
+			set: function set(value) {
+				if (typeof(value) !== 'object') {
+					console.error(("boundStyle:" + value + " is invalid"));
+				}
+				tmp.boundStyle = value;
+			}
+		},
+		onReady: {
+			default: null,
+			get: function get() {
+				return tmp.ready
+			},
+			set: function set(value) {
+				tmp.ready = value;
+			}
+		},
+		onBeforeImageLoad: {
+			default: null,
+			get: function get() {
+				return tmp.beforeImageLoad
+			},
+			set: function set(value) {
+				tmp.beforeImageLoad = value;
+			}
+		},
+		onImageLoad: {
+			default: null,
+			get: function get() {
+				return tmp.imageLoad
+			},
+			set: function set(value) {
+				tmp.imageLoad = value;
+			}
+		},
+		onBeforeDraw: {
+			default: null,
+			get: function get() {
+				return tmp.beforeDraw
+			},
+			set: function set(value) {
+				tmp.beforeDraw = value;
+			}
+		}
+	};
+
+	var ref$1 = getDevice();
+	var windowWidth = ref$1.windowWidth;
+
+	function prepare() {
+		var self = this;
+
+		// v1.4.0 版本中将不再自动绑定we-cropper实例
+		self.attachPage = function() {
+			var pages = getCurrentPages();
+			// 获取到当前page上下文
+			var pageContext = pages[pages.length - 1];
+			// 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问
+			Object.defineProperty(pageContext, 'wecropper', {
+				get: function get() {
+					console.warn(
+						'Instance will not be automatically bound to the page after v1.4.0\n\n' +
+						'Please use a custom instance name instead\n\n' +
+						'Example: \n' +
+						'this.mycropper = new WeCropper(options)\n\n' +
+						'// ...\n' +
+						'this.mycropper.getCropperImage()'
+					);
+					return self
+				},
+				configurable: true
+			});
+		};
+
+		self.createCtx = function() {
+			var id = self.id;
+			var targetId = self.targetId;
+
+			if (id) {
+				self.ctx = self.ctx || uni.createCanvasContext(id);
+				self.targetCtx = self.targetCtx || uni.createCanvasContext(targetId);
+			} else {
+				console.error("constructor: create canvas context failed, 'id' must be valuable");
+			}
+		};
+
+		self.deviceRadio = windowWidth / 750;
+	}
+
+	var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !==
+		'undefined' ? self : {};
+
+
+
+
+
+	function createCommonjsModule(fn, module) {
+		return module = {
+			exports: {}
+		}, fn(module, module.exports), module.exports;
+	}
+
+	var tools = createCommonjsModule(function(module, exports) {
+		/**
+		 * String type check
+		 */
+		exports.isStr = function(v) {
+			return typeof v === 'string';
+		};
+		/**
+		 * Number type check
+		 */
+		exports.isNum = function(v) {
+			return typeof v === 'number';
+		};
+		/**
+		 * Array type check
+		 */
+		exports.isArr = Array.isArray;
+		/**
+		 * undefined type check
+		 */
+		exports.isUndef = function(v) {
+			return v === undefined;
+		};
+
+		exports.isTrue = function(v) {
+			return v === true;
+		};
+
+		exports.isFalse = function(v) {
+			return v === false;
+		};
+		/**
+		 * Function type check
+		 */
+		exports.isFunc = function(v) {
+			return typeof v === 'function';
+		};
+		/**
+		 * Quick object check - this is primarily used to tell
+		 * Objects from primitive values when we know the value
+		 * is a JSON-compliant type.
+		 */
+		exports.isObj = exports.isObject = function(obj) {
+			return obj !== null && typeof obj === 'object'
+		};
+
+		/**
+		 * Strict object type check. Only returns true
+		 * for plain JavaScript objects.
+		 */
+		var _toString = Object.prototype.toString;
+		exports.isPlainObject = function(obj) {
+			return _toString.call(obj) === '[object Object]'
+		};
+
+		/**
+		 * Check whether the object has the property.
+		 */
+		var hasOwnProperty = Object.prototype.hasOwnProperty;
+		exports.hasOwn = function(obj, key) {
+			return hasOwnProperty.call(obj, key)
+		};
+
+		/**
+		 * Perform no operation.
+		 * Stubbing args to make Flow happy without leaving useless transpiled code
+		 * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+		 */
+		exports.noop = function(a, b, c) {};
+
+		/**
+		 * Check if val is a valid array index.
+		 */
+		exports.isValidArrayIndex = function(val) {
+			var n = parseFloat(String(val));
+			return n >= 0 && Math.floor(n) === n && isFinite(val)
+		};
+	});
+
+	var tools_7 = tools.isFunc;
+	var tools_10 = tools.isPlainObject;
+
+	var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad'];
+
+	function observer() {
+		var self = this;
+
+		self.on = function(event, fn) {
+			if (EVENT_TYPE.indexOf(event) > -1) {
+				if (tools_7(fn)) {
+					event === 'ready' ?
+						fn(self) :
+						self[("on" + (firstLetterUpper(event)))] = fn;
+				}
+			} else {
+				console.error(("event: " + event + " is invalid"));
+			}
+			return self
+		};
+	}
+
+	function wxPromise(fn) {
+		return function(obj) {
+			var args = [],
+				len = arguments.length - 1;
+			while (len-- > 0) args[len] = arguments[len + 1];
+
+			if (obj === void 0) obj = {};
+			return new Promise(function(resolve, reject) {
+				obj.success = function(res) {
+					resolve(res);
+				};
+				obj.fail = function(err) {
+					reject(err);
+				};
+				fn.apply(void 0, [obj].concat(args));
+			})
+		}
+	}
+
+	function draw(ctx, reserve) {
+		if (reserve === void 0) reserve = false;
+
+		return new Promise(function(resolve) {
+			ctx.draw(reserve, resolve);
+		})
+	}
+
+	var getImageInfo = wxPromise(uni.getImageInfo);
+
+	var canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath);
+
+	var base64 = createCommonjsModule(function(module, exports) {
+		/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */
+		(function(root) {
+
+			// Detect free variables `exports`.
+			var freeExports = 'object' == 'object' && exports;
+
+			// Detect free variable `module`.
+			var freeModule = 'object' == 'object' && module &&
+				module.exports == freeExports && module;
+
+			// Detect free variable `global`, from Node.js or Browserified code, and use
+			// it as `root`.
+			var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;
+			if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+				root = freeGlobal;
+			}
+
+			/*--------------------------------------------------------------------------*/
+
+			var InvalidCharacterError = function(message) {
+				this.message = message;
+			};
+			InvalidCharacterError.prototype = new Error;
+			InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+
+			var error = function(message) {
+				// Note: the error messages used throughout this file match those used by
+				// the native `atob`/`btoa` implementation in Chromium.
+				throw new InvalidCharacterError(message);
+			};
+
+			var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+			// http://whatwg.org/html/common-microsyntaxes.html#space-character
+			var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g;
+
+			// `decode` is designed to be fully compatible with `atob` as described in the
+			// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob
+			// The optimized base64-decoding algorithm used is based on @atk’s excellent
+			// implementation. https://gist.github.com/atk/1020396
+			var decode = function(input) {
+				input = String(input)
+					.replace(REGEX_SPACE_CHARACTERS, '');
+				var length = input.length;
+				if (length % 4 == 0) {
+					input = input.replace(/==?$/, '');
+					length = input.length;
+				}
+				if (
+					length % 4 == 1 ||
+					// http://whatwg.org/C#alphanumeric-ascii-characters
+					/[^+a-zA-Z0-9/]/.test(input)
+				) {
+					error(
+						'Invalid character: the string to be decoded is not correctly encoded.'
+					);
+				}
+				var bitCounter = 0;
+				var bitStorage;
+				var buffer;
+				var output = '';
+				var position = -1;
+				while (++position < length) {
+					buffer = TABLE.indexOf(input.charAt(position));
+					bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;
+					// Unless this is the first of a group of 4 characters…
+					if (bitCounter++ % 4) {
+						// …convert the first 8 bits to a single ASCII character.
+						output += String.fromCharCode(
+							0xFF & bitStorage >> (-2 * bitCounter & 6)
+						);
+					}
+				}
+				return output;
+			};
+
+			// `encode` is designed to be fully compatible with `btoa` as described in the
+			// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa
+			var encode = function(input) {
+				input = String(input);
+				if (/[^\0-\xFF]/.test(input)) {
+					// Note: no need to special-case astral symbols here, as surrogates are
+					// matched, and the input is supposed to only contain ASCII anyway.
+					error(
+						'The string to be encoded contains characters outside of the ' +
+						'Latin1 range.'
+					);
+				}
+				var padding = input.length % 3;
+				var output = '';
+				var position = -1;
+				var a;
+				var b;
+				var c;
+				var buffer;
+				// Make sure any padding is handled outside of the loop.
+				var length = input.length - padding;
+
+				while (++position < length) {
+					// Read three bytes, i.e. 24 bits.
+					a = input.charCodeAt(position) << 16;
+					b = input.charCodeAt(++position) << 8;
+					c = input.charCodeAt(++position);
+					buffer = a + b + c;
+					// Turn the 24 bits into four chunks of 6 bits each, and append the
+					// matching character for each of them to the output.
+					output += (
+						TABLE.charAt(buffer >> 18 & 0x3F) +
+						TABLE.charAt(buffer >> 12 & 0x3F) +
+						TABLE.charAt(buffer >> 6 & 0x3F) +
+						TABLE.charAt(buffer & 0x3F)
+					);
+				}
+
+				if (padding == 2) {
+					a = input.charCodeAt(position) << 8;
+					b = input.charCodeAt(++position);
+					buffer = a + b;
+					output += (
+						TABLE.charAt(buffer >> 10) +
+						TABLE.charAt((buffer >> 4) & 0x3F) +
+						TABLE.charAt((buffer << 2) & 0x3F) +
+						'='
+					);
+				} else if (padding == 1) {
+					buffer = input.charCodeAt(position);
+					output += (
+						TABLE.charAt(buffer >> 2) +
+						TABLE.charAt((buffer << 4) & 0x3F) +
+						'=='
+					);
+				}
+
+				return output;
+			};
+
+			var base64 = {
+				'encode': encode,
+				'decode': decode,
+				'version': '0.1.0'
+			};
+
+			// Some AMD build optimizers, like r.js, check for specific condition patterns
+			// like the following:
+			if (
+				typeof undefined == 'function' &&
+				typeof undefined.amd == 'object' &&
+				undefined.amd
+			) {
+				undefined(function() {
+					return base64;
+				});
+			} else if (freeExports && !freeExports.nodeType) {
+				if (freeModule) { // in Node.js or RingoJS v0.8.0+
+					freeModule.exports = base64;
+				} else { // in Narwhal or RingoJS v0.7.0-
+					for (var key in base64) {
+						base64.hasOwnProperty(key) && (freeExports[key] = base64[key]);
+					}
+				}
+			} else { // in Rhino or a web browser
+				root.base64 = base64;
+			}
+
+		}(commonjsGlobal));
+	});
+
+	function makeURI(strData, type) {
+		return 'data:' + type + ';base64,' + strData
+	}
+
+	function fixType(type) {
+		type = type.toLowerCase().replace(/jpg/i, 'jpeg');
+		var r = type.match(/png|jpeg|bmp|gif/)[0];
+		return 'image/' + r
+	}
+
+	function encodeData(data) {
+		var str = '';
+		if (typeof data === 'string') {
+			str = data;
+		} else {
+			for (var i = 0; i < data.length; i++) {
+				str += String.fromCharCode(data[i]);
+			}
+		}
+		return base64.encode(str)
+	}
+
+	/**
+	 * 获取图像区域隐含的像素数据
+	 * @param canvasId canvas标识
+	 * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标
+	 * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标
+	 * @param width 将要被提取的图像数据矩形区域的宽度
+	 * @param height 将要被提取的图像数据矩形区域的高度
+	 * @param done 完成回调
+	 */
+	function getImageData(canvasId, x, y, width, height, done) {
+		uni.canvasGetImageData({
+			canvasId: canvasId,
+			x: x,
+			y: y,
+			width: width,
+			height: height,
+			success: function success(res) {
+				done(res, null);
+			},
+			fail: function fail(res) {
+				done(null, res);
+			}
+		});
+	}
+
+	/**
+	 * 生成bmp格式图片
+	 * 按照规则生成图片响应头和响应体
+	 * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData
+	 * @returns {*} base64字符串
+	 */
+	function genBitmapImage(oData) {
+		//
+		// BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx
+		// BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx
+		//
+		var biWidth = oData.width;
+		var biHeight = oData.height;
+		var biSizeImage = biWidth * biHeight * 3;
+		var bfSize = biSizeImage + 54; // total header size = 54 bytes
+
+		//
+		//  typedef struct tagBITMAPFILEHEADER {
+		//  	WORD bfType;
+		//  	DWORD bfSize;
+		//  	WORD bfReserved1;
+		//  	WORD bfReserved2;
+		//  	DWORD bfOffBits;
+		//  } BITMAPFILEHEADER;
+		//
+		var BITMAPFILEHEADER = [
+			// WORD bfType -- The file type signature; must be "BM"
+			0x42, 0x4D,
+			// DWORD bfSize -- The size, in bytes, of the bitmap file
+			bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff,
+			// WORD bfReserved1 -- Reserved; must be zero
+			0, 0,
+			// WORD bfReserved2 -- Reserved; must be zero
+			0, 0,
+			// DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
+			54, 0, 0, 0
+		];
+
+		//
+		//  typedef struct tagBITMAPINFOHEADER {
+		//  	DWORD biSize;
+		//  	LONG  biWidth;
+		//  	LONG  biHeight;
+		//  	WORD  biPlanes;
+		//  	WORD  biBitCount;
+		//  	DWORD biCompression;
+		//  	DWORD biSizeImage;
+		//  	LONG  biXPelsPerMeter;
+		//  	LONG  biYPelsPerMeter;
+		//  	DWORD biClrUsed;
+		//  	DWORD biClrImportant;
+		//  } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+		//
+		var BITMAPINFOHEADER = [
+			// DWORD biSize -- The number of bytes required by the structure
+			40, 0, 0, 0,
+			// LONG biWidth -- The width of the bitmap, in pixels
+			biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff,
+			// LONG biHeight -- The height of the bitmap, in pixels
+			biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff,
+			// WORD biPlanes -- The number of planes for the target device. This value must be set to 1
+			1, 0,
+			// WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap
+			// has a maximum of 2^24 colors (16777216, Truecolor)
+			24, 0,
+			// DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed
+			0, 0, 0, 0,
+			// DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps
+			biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff,
+			// LONG biXPelsPerMeter, unused
+			0, 0, 0, 0,
+			// LONG biYPelsPerMeter, unused
+			0, 0, 0, 0,
+			// DWORD biClrUsed, the number of color indexes of palette, unused
+			0, 0, 0, 0,
+			// DWORD biClrImportant, unused
+			0, 0, 0, 0
+		];
+
+		var iPadding = (4 - ((biWidth * 3) % 4)) % 4;
+
+		var aImgData = oData.data;
+
+		var strPixelData = '';
+		var biWidth4 = biWidth << 2;
+		var y = biHeight;
+		var fromCharCode = String.fromCharCode;
+
+		do {
+			var iOffsetY = biWidth4 * (y - 1);
+			var strPixelRow = '';
+			for (var x = 0; x < biWidth; x++) {
+				var iOffsetX = x << 2;
+				strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +
+					fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +
+					fromCharCode(aImgData[iOffsetY + iOffsetX]);
+			}
+
+			for (var c = 0; c < iPadding; c++) {
+				strPixelRow += String.fromCharCode(0);
+			}
+
+			strPixelData += strPixelRow;
+		} while (--y)
+
+		var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData);
+
+		return strEncoded
+	}
+
+	/**
+	 * 转换为图片base64
+	 * @param canvasId canvas标识
+	 * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标
+	 * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标
+	 * @param width 将要被提取的图像数据矩形区域的宽度
+	 * @param height 将要被提取的图像数据矩形区域的高度
+	 * @param type 转换图片类型
+	 * @param done 完成回调
+	 */
+	function convertToImage(canvasId, x, y, width, height, type, done) {
+		if (done === void 0) done = function() {};
+
+		if (type === undefined) {
+			type = 'png';
+		}
+		type = fixType(type);
+		if (/bmp/.test(type)) {
+			getImageData(canvasId, x, y, width, height, function(data, err) {
+				var strData = genBitmapImage(data);
+				tools_7(done) && done(makeURI(strData, 'image/' + type), err);
+			});
+		} else {
+			console.error('暂不支持生成\'' + type + '\'类型的base64图片');
+		}
+	}
+
+	var CanvasToBase64 = {
+		convertToImage: convertToImage,
+		// convertToPNG: function (width, height, done) {
+		//   return convertToImage(width, height, 'png', done)
+		// },
+		// convertToJPEG: function (width, height, done) {
+		//   return convertToImage(width, height, 'jpeg', done)
+		// },
+		// convertToGIF: function (width, height, done) {
+		//   return convertToImage(width, height, 'gif', done)
+		// },
+		convertToBMP: function(ref, done) {
+			if (ref === void 0) ref = {};
+			var canvasId = ref.canvasId;
+			var x = ref.x;
+			var y = ref.y;
+			var width = ref.width;
+			var height = ref.height;
+			if (done === void 0) done = function() {};
+
+			return convertToImage(canvasId, x, y, width, height, 'bmp', done)
+		}
+	};
+
+	function methods() {
+		var self = this;
+
+		var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
+		var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度
+
+		var id = self.id;
+		var targetId = self.targetId;
+		var pixelRatio = self.pixelRatio;
+
+		var ref = self.cut;
+		var x = ref.x;
+		if (x === void 0) x = 0;
+		var y = ref.y;
+		if (y === void 0) y = 0;
+		var width = ref.width;
+		if (width === void 0) width = boundWidth;
+		var height = ref.height;
+		if (height === void 0) height = boundHeight;
+
+		self.updateCanvas = function(done) {
+			if (self.croperTarget) {
+				//  画布绘制图片
+				self.ctx.drawImage(
+					self.croperTarget,
+					self.imgLeft,
+					self.imgTop,
+					self.scaleWidth,
+					self.scaleHeight
+				);
+			}
+			tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self);
+
+			self.setBoundStyle(self.boundStyle); //	设置边界样式
+
+			self.ctx.draw(false, done);
+			return self
+		};
+
+		self.pushOrigin = self.pushOrign = function(src) {
+			self.src = src;
+
+			tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self);
+
+			return getImageInfo({
+					src: src
+				})
+				.then(function(res) {
+					var innerAspectRadio = res.width / res.height;
+					var customAspectRadio = width / height;
+
+					self.croperTarget = res.path;
+
+					if (innerAspectRadio < customAspectRadio) {
+						self.rectX = x;
+						self.baseWidth = width;
+						self.baseHeight = width / innerAspectRadio;
+						self.rectY = y - Math.abs((height - self.baseHeight) / 2);
+					} else {
+						self.rectY = y;
+						self.baseWidth = height * innerAspectRadio;
+						self.baseHeight = height;
+						self.rectX = x - Math.abs((width - self.baseWidth) / 2);
+					}
+
+					self.imgLeft = self.rectX;
+					self.imgTop = self.rectY;
+					self.scaleWidth = self.baseWidth;
+					self.scaleHeight = self.baseHeight;
+
+					self.update();
+
+					return new Promise(function(resolve) {
+						self.updateCanvas(resolve);
+					})
+				})
+				.then(function() {
+					tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self);
+				})
+		};
+
+		self.removeImage = function() {
+			self.src = '';
+			self.croperTarget = '';
+			return draw(self.ctx)
+		};
+
+		self.getCropperBase64 = function(done) {
+			if (done === void 0) done = function() {};
+
+			CanvasToBase64.convertToBMP({
+				canvasId: id,
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			}, done);
+		};
+
+		self.getCropperImage = function(opt, fn) {
+			var customOptions = opt;
+
+			var canvasOptions = {
+				canvasId: id,
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			};
+
+			var task = function() {
+				return Promise.resolve();
+			};
+
+			if (
+				tools_10(customOptions) &&
+				customOptions.original
+			) {
+				// original mode
+				task = function() {
+					self.targetCtx.drawImage(
+						self.croperTarget,
+						self.imgLeft * pixelRatio,
+						self.imgTop * pixelRatio,
+						self.scaleWidth * pixelRatio,
+						self.scaleHeight * pixelRatio
+					);
+
+					canvasOptions = {
+						canvasId: targetId,
+						x: x * pixelRatio,
+						y: y * pixelRatio,
+						width: width * pixelRatio,
+						height: height * pixelRatio
+					};
+
+					return draw(self.targetCtx)
+				};
+			}
+
+			return task()
+				.then(function() {
+					if (tools_10(customOptions)) {
+						canvasOptions = Object.assign({}, canvasOptions, customOptions);
+					}
+
+					if (tools_7(customOptions)) {
+						fn = customOptions;
+					}
+
+					var arg = canvasOptions.componentContext ?
+						[canvasOptions, canvasOptions.componentContext] :
+						[canvasOptions];
+
+					return canvasToTempFilePath.apply(null, arg)
+				})
+				.then(function(res) {
+					var tempFilePath = res.tempFilePath;
+
+					return tools_7(fn) ?
+						fn.call(self, tempFilePath, null) :
+						tempFilePath
+				})
+				.catch(function(err) {
+					if (tools_7(fn)) {
+						fn.call(self, null, err);
+					} else {
+						throw err
+					}
+				})
+		};
+	}
+
+	/**
+	 * 获取最新缩放值
+	 * @param oldScale 上一次触摸结束后的缩放值
+	 * @param oldDistance 上一次触摸结束后的双指距离
+	 * @param zoom 缩放系数
+	 * @param touch0 第一指touch对象
+	 * @param touch1 第二指touch对象
+	 * @returns {*}
+	 */
+	var getNewScale = function(oldScale, oldDistance, zoom, touch0, touch1) {
+		var xMove, yMove, newDistance;
+		// 计算二指最新距离
+		xMove = Math.round(touch1.x - touch0.x);
+		yMove = Math.round(touch1.y - touch0.y);
+		newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));
+
+		return oldScale + 0.001 * zoom * (newDistance - oldDistance)
+	};
+
+	function update() {
+		var self = this;
+
+		if (!self.src) {
+			return
+		}
+
+		self.__oneTouchStart = function(touch) {
+			self.touchX0 = Math.round(touch.x);
+			self.touchY0 = Math.round(touch.y);
+		};
+
+		self.__oneTouchMove = function(touch) {
+			var xMove, yMove;
+			// 计算单指移动的距离
+			if (self.touchended) {
+				return self.updateCanvas()
+			}
+			xMove = Math.round(touch.x - self.touchX0);
+			yMove = Math.round(touch.y - self.touchY0);
+
+			var imgLeft = Math.round(self.rectX + xMove);
+			var imgTop = Math.round(self.rectY + yMove);
+
+			self.outsideBound(imgLeft, imgTop);
+
+			self.updateCanvas();
+		};
+
+		self.__twoTouchStart = function(touch0, touch1) {
+			var xMove, yMove, oldDistance;
+
+			self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2);
+			self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2);
+
+			// 计算两指距离
+			xMove = Math.round(touch1.x - touch0.x);
+			yMove = Math.round(touch1.y - touch0.y);
+			oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));
+
+			self.oldDistance = oldDistance;
+		};
+
+		self.__twoTouchMove = function(touch0, touch1) {
+			var oldScale = self.oldScale;
+			var oldDistance = self.oldDistance;
+			var scale = self.scale;
+			var zoom = self.zoom;
+
+			self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1);
+
+			//  设定缩放范围
+			self.newScale <= 1 && (self.newScale = 1);
+			self.newScale >= scale && (self.newScale = scale);
+
+			self.scaleWidth = Math.round(self.newScale * self.baseWidth);
+			self.scaleHeight = Math.round(self.newScale * self.baseHeight);
+			var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2);
+			var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2);
+
+			self.outsideBound(imgLeft, imgTop);
+
+			self.updateCanvas();
+		};
+
+		self.__xtouchEnd = function() {
+			self.oldScale = self.newScale;
+			self.rectX = self.imgLeft;
+			self.rectY = self.imgTop;
+		};
+	}
+
+	var handle = {
+		//  图片手势初始监测
+		touchStart: function touchStart(e) {
+			var self = this;
+			var ref = e.touches;
+			var touch0 = ref[0];
+			var touch1 = ref[1];
+
+			if (!self.src) {
+				return
+			}
+
+			setTouchState(self, true, null, null);
+
+			// 计算第一个触摸点的位置,并参照改点进行缩放
+			self.__oneTouchStart(touch0);
+
+			// 两指手势触发
+			if (e.touches.length >= 2) {
+				self.__twoTouchStart(touch0, touch1);
+			}
+		},
+
+		//  图片手势动态缩放
+		touchMove: function touchMove(e) {
+			var self = this;
+			var ref = e.touches;
+			var touch0 = ref[0];
+			var touch1 = ref[1];
+
+			if (!self.src) {
+				return
+			}
+
+			setTouchState(self, null, true);
+
+			// 单指手势时触发
+			if (e.touches.length === 1) {
+				self.__oneTouchMove(touch0);
+			}
+			// 两指手势触发
+			if (e.touches.length >= 2) {
+				self.__twoTouchMove(touch0, touch1);
+			}
+		},
+
+		touchEnd: function touchEnd(e) {
+			var self = this;
+
+			if (!self.src) {
+				return
+			}
+
+			setTouchState(self, false, false, true);
+			self.__xtouchEnd();
+		}
+	};
+
+	function cut() {
+		var self = this;
+		var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
+		var boundHeight = self.height;
+		// 裁剪框默认高度,即整个画布高度
+		var ref = self.cut;
+		var x = ref.x;
+		if (x === void 0) x = 0;
+		var y = ref.y;
+		if (y === void 0) y = 0;
+		var width = ref.width;
+		if (width === void 0) width = boundWidth;
+		var height = ref.height;
+		if (height === void 0) height = boundHeight;
+
+		/**
+		 * 设置边界
+		 * @param imgLeft 图片左上角横坐标值
+		 * @param imgTop 图片左上角纵坐标值
+		 */
+		self.outsideBound = function(imgLeft, imgTop) {
+			self.imgLeft = imgLeft >= x ?
+				x :
+				self.scaleWidth + imgLeft - x <= width ?
+				x + width - self.scaleWidth :
+				imgLeft;
+
+			self.imgTop = imgTop >= y ?
+				y :
+				self.scaleHeight + imgTop - y <= height ?
+				y + height - self.scaleHeight :
+				imgTop;
+		};
+
+		/**
+		 * 设置边界样式
+		 * @param color	边界颜色
+		 */
+		self.setBoundStyle = function(ref) {
+			if (ref === void 0) ref = {};
+			var color = ref.color;
+			if (color === void 0) color = '#04b00f';
+			var mask = ref.mask;
+			if (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)';
+			var lineWidth = ref.lineWidth;
+			if (lineWidth === void 0) lineWidth = 1;
+
+			var half = lineWidth / 2;
+			var boundOption = [{
+					start: {
+						x: x - half,
+						y: y + 10 - half
+					},
+					step1: {
+						x: x - half,
+						y: y - half
+					},
+					step2: {
+						x: x + 10 - half,
+						y: y - half
+					}
+				},
+				{
+					start: {
+						x: x - half,
+						y: y + height - 10 + half
+					},
+					step1: {
+						x: x - half,
+						y: y + height + half
+					},
+					step2: {
+						x: x + 10 - half,
+						y: y + height + half
+					}
+				},
+				{
+					start: {
+						x: x + width - 10 + half,
+						y: y - half
+					},
+					step1: {
+						x: x + width + half,
+						y: y - half
+					},
+					step2: {
+						x: x + width + half,
+						y: y + 10 - half
+					}
+				},
+				{
+					start: {
+						x: x + width + half,
+						y: y + height - 10 + half
+					},
+					step1: {
+						x: x + width + half,
+						y: y + height + half
+					},
+					step2: {
+						x: x + width - 10 + half,
+						y: y + height + half
+					}
+				}
+			];
+
+			// 绘制半透明层
+			self.ctx.beginPath();
+			self.ctx.setFillStyle(mask);
+			self.ctx.fillRect(0, 0, x, boundHeight);
+			self.ctx.fillRect(x, 0, width, y);
+			self.ctx.fillRect(x, y + height, width, boundHeight - y - height);
+			self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight);
+			self.ctx.fill();
+
+			boundOption.forEach(function(op) {
+				self.ctx.beginPath();
+				self.ctx.setStrokeStyle(color);
+				self.ctx.setLineWidth(lineWidth);
+				self.ctx.moveTo(op.start.x, op.start.y);
+				self.ctx.lineTo(op.step1.x, op.step1.y);
+				self.ctx.lineTo(op.step2.x, op.step2.y);
+				self.ctx.stroke();
+			});
+		};
+	}
+
+	var version = "1.3.9";
+
+	var WeCropper = function WeCropper(params) {
+		var self = this;
+		var _default = {};
+
+		validator(self, DEFAULT);
+
+		Object.keys(DEFAULT).forEach(function(key) {
+			_default[key] = DEFAULT[key].default;
+		});
+		Object.assign(self, _default, params);
+
+		self.prepare();
+		self.attachPage();
+		self.createCtx();
+		self.observer();
+		self.cutt();
+		self.methods();
+		self.init();
+		self.update();
+
+		return self
+	};
+
+	WeCropper.prototype.init = function init() {
+		var self = this;
+		var src = self.src;
+
+		self.version = version;
+
+		typeof self.onReady === 'function' && self.onReady(self.ctx, self);
+
+		if (src) {
+			self.pushOrign(src);
+		} else {
+			self.updateCanvas();
+		}
+		setTouchState(self, false, false, false);
+
+		self.oldScale = 1;
+		self.newScale = 1;
+
+		return self
+	};
+
+	Object.assign(WeCropper.prototype, handle);
+
+	WeCropper.prototype.prepare = prepare;
+	WeCropper.prototype.observer = observer;
+	WeCropper.prototype.methods = methods;
+	WeCropper.prototype.cutt = cut;
+	WeCropper.prototype.update = update;
+
+	return WeCropper;
+
+})));

+ 410 - 0
lib/GraceUI5/js/barcode.js

@@ -0,0 +1,410 @@
+/** 
+// https://github.com/alsey/wxbarcode
+// 最后一位显示 _ 问题
+// https://github.com/alsey/wxbarcode/issues/2
+// //ok some type of shift is nessecary if (shifter != -1) { result.push(shifter); result.push(codeValue(chr1));//把这里的chr2改成chr1即可。 }
+**/
+ 
+!(function(){
+var CHAR_TILDE = 126;
+var CODE_FNC1 = 102;
+ 
+var SET_STARTA = 103;
+var SET_STARTB = 104;
+var SET_STARTC = 105;
+var SET_SHIFT = 98;
+var SET_CODEA = 101;
+var SET_CODEB = 100;
+var SET_STOP = 106;
+ 
+ 
+var REPLACE_CODES = {
+    CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard
+}
+ 
+var CODESET = {
+    ANY: 1,
+    AB: 2,
+    A: 3,
+    B: 4,
+    C: 5
+};
+ 
+function getBytes(str) {
+    var bytes = [];
+    for (var i = 0; i < str.length; i++) {
+        bytes.push(str.charCodeAt(i));
+    }
+    return bytes;
+}
+ 
+exports.code128 = function (ctx, text, width, height) {
+ 
+    width = parseInt(width);
+ 
+    height = parseInt(height);
+ 
+    var codes = stringToCode128(text);
+ 
+    var g = new Graphics(ctx, width, height);
+ 
+    var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);
+ 
+    var x = g.area.left;
+    var y = g.area.top;
+    for (var i = 0; i < codes.length; i++) {
+        var c = codes[i];
+        //two bars at a time: 1 black and 1 white
+        for (var bar = 0; bar < 8; bar += 2) {
+            var barW = PATTERNS[c][bar] * barWeight;
+            // var barH = height - y - this.border;
+            var barH = height - y;
+            var spcW = PATTERNS[c][bar + 1] * barWeight;
+ 
+            //no need to draw if 0 width
+            if (barW > 0) {
+                g.fillFgRect(x, y, barW, barH);
+            }
+ 
+            x += barW + spcW;
+        }
+    }
+ 
+    ctx.draw();
+}
+ 
+ 
+function stringToCode128(text) {
+ 
+    var barc = {
+        currcs: CODESET.C
+    };
+ 
+    var bytes = getBytes(text);
+    //decide starting codeset
+    var index = bytes[0] == CHAR_TILDE ? 1 : 0;
+ 
+    var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
+    var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
+    barc.currcs = getBestStartSet(csa1, csa2);
+    barc.currcs = perhapsCodeC(bytes, barc.currcs);
+ 
+    //if no codeset changes this will end up with bytes.length+3
+    //start, checksum and stop
+    var codes = new Array();
+ 
+    switch (barc.currcs) {
+        case CODESET.A:
+            codes.push(SET_STARTA);
+            break;
+        case CODESET.B:
+            codes.push(SET_STARTB);
+            break;
+        default:
+            codes.push(SET_STARTC);
+            break;
+    }
+ 
+ 
+    for (var i = 0; i < bytes.length; i++) {
+        var b1 = bytes[i]; //get the first of a pair
+        //should we translate/replace
+        if (b1 in REPLACE_CODES) {
+            codes.push(REPLACE_CODES[b1]);
+            i++ //jump to next
+            b1 = bytes[i];
+        }
+ 
+        //get the next in the pair if possible
+        var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;
+ 
+        codes = codes.concat(codesForChar(b1, b2, barc.currcs));
+        //code C takes 2 chars each time
+        if (barc.currcs == CODESET.C) i++;
+    }
+ 
+    //calculate checksum according to Code 128 standards
+    var checksum = codes[0];
+    for (var weight = 1; weight < codes.length; weight++) {
+        checksum += (weight * codes[weight]);
+    }
+    codes.push(checksum % 103);
+ 
+    codes.push(SET_STOP);
+ 
+    //encoding should now be complete
+    return codes;
+ 
+    function getBestStartSet(csa1, csa2) {
+        //tries to figure out the best codeset
+        //to start with to get the most compact code
+        var vote = 0;
+        vote += csa1 == CODESET.A ? 1 : 0;
+        vote += csa1 == CODESET.B ? -1 : 0;
+        vote += csa2 == CODESET.A ? 1 : 0;
+        vote += csa2 == CODESET.B ? -1 : 0;
+        //tie goes to B due to my own predudices
+        return vote > 0 ? CODESET.A : CODESET.B;
+    }
+ 
+    function perhapsCodeC(bytes, codeset) {
+        for (var i = 0; i < bytes.length; i++) {
+            var b = bytes[i]
+            if ((b < 48 || b > 57) && b != CHAR_TILDE)
+                return codeset;
+        }
+        return CODESET.C;
+    }
+ 
+    //chr1 is current byte
+    //chr2 is the next byte to process. looks ahead.
+    function codesForChar(chr1, chr2, currcs) {
+        var result = [];
+        var shifter = -1;
+ 
+        if (charCompatible(chr1, currcs)) {
+            if (currcs == CODESET.C) {
+                if (chr2 == -1) {
+                    shifter = SET_CODEB;
+                    currcs = CODESET.B;
+                }
+                else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
+                    //need to check ahead as well
+                    if (charCompatible(chr2, CODESET.A)) {
+                        shifter = SET_CODEA;
+                        currcs = CODESET.A;
+                    }
+                    else {
+                        shifter = SET_CODEB;
+                        currcs = CODESET.B;
+                    }
+                }
+            }
+        }
+        else {
+            //if there is a next char AND that next char is also not compatible
+            if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
+                //need to switch code sets
+                switch (currcs) {
+                    case CODESET.A:
+                        shifter = SET_CODEB;
+                        currcs = CODESET.B;
+                        break;
+                    case CODESET.B:
+                        shifter = SET_CODEA;
+                        currcs = CODESET.A;
+                        break;
+                }
+            }
+            else {
+                //no need to shift code sets, a temporary SHIFT will suffice
+                shifter = SET_SHIFT;
+            }
+        }
+ 
+        //ok some type of shift is nessecary
+        if (shifter != -1) {
+            result.push(shifter);
+            result.push(codeValue(chr1));
+        }
+        else {
+            if (currcs == CODESET.C) {
+                //include next as well
+                result.push(codeValue(chr1, chr2));
+            }
+            else {
+                result.push(codeValue(chr1));
+            }
+        }
+        barc.currcs = currcs;
+ 
+        return result;
+    }
+}
+ 
+//reduce the ascii code to fit into the Code128 char table
+function codeValue(chr1, chr2) {
+    if (typeof chr2 == "undefined") {
+        return chr1 >= 32 ? chr1 - 32 : chr1 + 64;
+    }
+    else {
+        return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));
+    }
+}
+ 
+function charCompatible(chr, codeset) {
+    var csa = codeSetAllowedFor(chr);
+    if (csa == CODESET.ANY) return true;
+    //if we need to change from current
+    if (csa == CODESET.AB) return true;
+    if (csa == CODESET.A && codeset == CODESET.A) return true;
+    if (csa == CODESET.B && codeset == CODESET.B) return true;
+    return false;
+}
+ 
+function codeSetAllowedFor(chr) {
+    if (chr >= 48 && chr <= 57) {
+        //0-9
+        return CODESET.ANY;
+    }
+    else if (chr >= 32 && chr <= 95) {
+        //0-9 A-Z
+        return CODESET.AB;
+    }
+    else {
+        //if non printable
+        return chr < 32 ? CODESET.A : CODESET.B;
+    }
+}
+ 
+var Graphics = function(ctx, width, height) {
+ 
+    this.width = width;
+    this.height = height;
+    this.quiet = Math.round(this.width / 40);
+ 
+    this.border_size   = 0;
+    this.padding_width = 0;
+ 
+    this.area = {
+        width : width - this.padding_width * 2 - this.quiet * 2,
+        height: height - this.border_size * 2,
+        top   : this.border_size - 4,
+        left  : this.padding_width + this.quiet
+    };
+ 
+    this.ctx = ctx;
+    this.fg = "#000000";
+    this.bg = "#ffffff";
+ 
+    // fill background
+    this.fillBgRect(0,0, width, height);
+ 
+    // fill center to create border
+    this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);
+}
+ 
+//use native color
+Graphics.prototype._fillRect = function(x, y, width, height, color) {
+    this.ctx.setFillStyle(color)
+    this.ctx.fillRect(x, y, width, height)
+}
+ 
+Graphics.prototype.fillFgRect = function(x,y, width, height) {
+    this._fillRect(x, y, width, height, this.fg);
+}
+ 
+Graphics.prototype.fillBgRect = function(x,y, width, height) {
+    this._fillRect(x, y, width, height, this.bg);
+}
+ 
+var PATTERNS = [
+    [2, 1, 2, 2, 2, 2, 0, 0],  // 0
+    [2, 2, 2, 1, 2, 2, 0, 0],  // 1
+    [2, 2, 2, 2, 2, 1, 0, 0],  // 2
+    [1, 2, 1, 2, 2, 3, 0, 0],  // 3
+    [1, 2, 1, 3, 2, 2, 0, 0],  // 4
+    [1, 3, 1, 2, 2, 2, 0, 0],  // 5
+    [1, 2, 2, 2, 1, 3, 0, 0],  // 6
+    [1, 2, 2, 3, 1, 2, 0, 0],  // 7
+    [1, 3, 2, 2, 1, 2, 0, 0],  // 8
+    [2, 2, 1, 2, 1, 3, 0, 0],  // 9
+    [2, 2, 1, 3, 1, 2, 0, 0],  // 10
+    [2, 3, 1, 2, 1, 2, 0, 0],  // 11
+    [1, 1, 2, 2, 3, 2, 0, 0],  // 12
+    [1, 2, 2, 1, 3, 2, 0, 0],  // 13
+    [1, 2, 2, 2, 3, 1, 0, 0],  // 14
+    [1, 1, 3, 2, 2, 2, 0, 0],  // 15
+    [1, 2, 3, 1, 2, 2, 0, 0],  // 16
+    [1, 2, 3, 2, 2, 1, 0, 0],  // 17
+    [2, 2, 3, 2, 1, 1, 0, 0],  // 18
+    [2, 2, 1, 1, 3, 2, 0, 0],  // 19
+    [2, 2, 1, 2, 3, 1, 0, 0],  // 20
+    [2, 1, 3, 2, 1, 2, 0, 0],  // 21
+    [2, 2, 3, 1, 1, 2, 0, 0],  // 22
+    [3, 1, 2, 1, 3, 1, 0, 0],  // 23
+    [3, 1, 1, 2, 2, 2, 0, 0],  // 24
+    [3, 2, 1, 1, 2, 2, 0, 0],  // 25
+    [3, 2, 1, 2, 2, 1, 0, 0],  // 26
+    [3, 1, 2, 2, 1, 2, 0, 0],  // 27
+    [3, 2, 2, 1, 1, 2, 0, 0],  // 28
+    [3, 2, 2, 2, 1, 1, 0, 0],  // 29
+    [2, 1, 2, 1, 2, 3, 0, 0],  // 30
+    [2, 1, 2, 3, 2, 1, 0, 0],  // 31
+    [2, 3, 2, 1, 2, 1, 0, 0],  // 32
+    [1, 1, 1, 3, 2, 3, 0, 0],  // 33
+    [1, 3, 1, 1, 2, 3, 0, 0],  // 34
+    [1, 3, 1, 3, 2, 1, 0, 0],  // 35
+    [1, 1, 2, 3, 1, 3, 0, 0],  // 36
+    [1, 3, 2, 1, 1, 3, 0, 0],  // 37
+    [1, 3, 2, 3, 1, 1, 0, 0],  // 38
+    [2, 1, 1, 3, 1, 3, 0, 0],  // 39
+    [2, 3, 1, 1, 1, 3, 0, 0],  // 40
+    [2, 3, 1, 3, 1, 1, 0, 0],  // 41
+    [1, 1, 2, 1, 3, 3, 0, 0],  // 42
+    [1, 1, 2, 3, 3, 1, 0, 0],  // 43
+    [1, 3, 2, 1, 3, 1, 0, 0],  // 44
+    [1, 1, 3, 1, 2, 3, 0, 0],  // 45
+    [1, 1, 3, 3, 2, 1, 0, 0],  // 46
+    [1, 3, 3, 1, 2, 1, 0, 0],  // 47
+    [3, 1, 3, 1, 2, 1, 0, 0],  // 48
+    [2, 1, 1, 3, 3, 1, 0, 0],  // 49
+    [2, 3, 1, 1, 3, 1, 0, 0],  // 50
+    [2, 1, 3, 1, 1, 3, 0, 0],  // 51
+    [2, 1, 3, 3, 1, 1, 0, 0],  // 52
+    [2, 1, 3, 1, 3, 1, 0, 0],  // 53
+    [3, 1, 1, 1, 2, 3, 0, 0],  // 54
+    [3, 1, 1, 3, 2, 1, 0, 0],  // 55
+    [3, 3, 1, 1, 2, 1, 0, 0],  // 56
+    [3, 1, 2, 1, 1, 3, 0, 0],  // 57
+    [3, 1, 2, 3, 1, 1, 0, 0],  // 58
+    [3, 3, 2, 1, 1, 1, 0, 0],  // 59
+    [3, 1, 4, 1, 1, 1, 0, 0],  // 60
+    [2, 2, 1, 4, 1, 1, 0, 0],  // 61
+    [4, 3, 1, 1, 1, 1, 0, 0],  // 62
+    [1, 1, 1, 2, 2, 4, 0, 0],  // 63
+    [1, 1, 1, 4, 2, 2, 0, 0],  // 64
+    [1, 2, 1, 1, 2, 4, 0, 0],  // 65
+    [1, 2, 1, 4, 2, 1, 0, 0],  // 66
+    [1, 4, 1, 1, 2, 2, 0, 0],  // 67
+    [1, 4, 1, 2, 2, 1, 0, 0],  // 68
+    [1, 1, 2, 2, 1, 4, 0, 0],  // 69
+    [1, 1, 2, 4, 1, 2, 0, 0],  // 70
+    [1, 2, 2, 1, 1, 4, 0, 0],  // 71
+    [1, 2, 2, 4, 1, 1, 0, 0],  // 72
+    [1, 4, 2, 1, 1, 2, 0, 0],  // 73
+    [1, 4, 2, 2, 1, 1, 0, 0],  // 74
+    [2, 4, 1, 2, 1, 1, 0, 0],  // 75
+    [2, 2, 1, 1, 1, 4, 0, 0],  // 76
+    [4, 1, 3, 1, 1, 1, 0, 0],  // 77
+    [2, 4, 1, 1, 1, 2, 0, 0],  // 78
+    [1, 3, 4, 1, 1, 1, 0, 0],  // 79
+    [1, 1, 1, 2, 4, 2, 0, 0],  // 80
+    [1, 2, 1, 1, 4, 2, 0, 0],  // 81
+    [1, 2, 1, 2, 4, 1, 0, 0],  // 82
+    [1, 1, 4, 2, 1, 2, 0, 0],  // 83
+    [1, 2, 4, 1, 1, 2, 0, 0],  // 84
+    [1, 2, 4, 2, 1, 1, 0, 0],  // 85
+    [4, 1, 1, 2, 1, 2, 0, 0],  // 86
+    [4, 2, 1, 1, 1, 2, 0, 0],  // 87
+    [4, 2, 1, 2, 1, 1, 0, 0],  // 88
+    [2, 1, 2, 1, 4, 1, 0, 0],  // 89
+    [2, 1, 4, 1, 2, 1, 0, 0],  // 90
+    [4, 1, 2, 1, 2, 1, 0, 0],  // 91
+    [1, 1, 1, 1, 4, 3, 0, 0],  // 92
+    [1, 1, 1, 3, 4, 1, 0, 0],  // 93
+    [1, 3, 1, 1, 4, 1, 0, 0],  // 94
+    [1, 1, 4, 1, 1, 3, 0, 0],  // 95
+    [1, 1, 4, 3, 1, 1, 0, 0],  // 96
+    [4, 1, 1, 1, 1, 3, 0, 0],  // 97
+    [4, 1, 1, 3, 1, 1, 0, 0],  // 98
+    [1, 1, 3, 1, 4, 1, 0, 0],  // 99
+    [1, 1, 4, 1, 3, 1, 0, 0],  // 100
+    [3, 1, 1, 1, 4, 1, 0, 0],  // 101
+    [4, 1, 1, 1, 3, 1, 0, 0],  // 102
+    [2, 1, 1, 4, 1, 2, 0, 0],  // 103
+    [2, 1, 1, 2, 1, 4, 0, 0],  // 104
+    [2, 1, 1, 2, 3, 2, 0, 0],  // 105
+    [2, 3, 3, 1, 1, 1, 2, 0]   // 106
+]
+})();

+ 113 - 0
lib/GraceUI5/js/checker.js

@@ -0,0 +1,113 @@
+
+module.exports = {
+	error : '',
+	check : function (dataBeCheck, rule){
+		dataBeCheck = JSON.stringify(dataBeCheck);
+		var data = JSON.parse(dataBeCheck);
+		for(var i = 0; i < rule.length; i++){
+			if (!rule[i].checkType){ return true;}
+			if (!rule[i].name){return true;}
+			if (!rule[i].errorMsg) {return true;}
+			if (!data[rule[i].name] || data[rule[i].name] == '') {this.error = rule[i].errorMsg; return false;}
+			// 检查前去除内容的空格及换行
+			if(typeof(data[rule[i].name]) == 'string'){data[rule[i].name] = data[rule[i].name].replace(/\s/g,"");}
+			switch (rule[i].checkType){
+				case 'string':
+					var reg = new RegExp('^.{' + rule[i].checkRule + '}$');
+					if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
+				break;
+				case 'int':
+					var ruleArr = rule[i].checkRule.split(',');
+					if(rule.length < 2){
+						ruleArr[0] = Number(ruleArr[0]) - 1;
+						ruleArr[1] = '';
+					}else{
+						ruleArr[0] = Number(ruleArr[0]) - 1;
+						ruleArr[1] = Number(ruleArr[1]) - 1;
+					}
+					var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + ruleArr[0] + ',' + ruleArr[1] + '}$');
+					if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
+					break;
+				break;
+				case 'between':
+					if (!this.isNumber(data[rule[i].name])){
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+					var minMax = rule[i].checkRule.split(',');
+					minMax[0] = Number(minMax[0]);
+					minMax[1] = Number(minMax[1]);
+					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+				break;
+				case 'betweenD':
+					var reg = /^-?\d+$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+					var minMax = rule[i].checkRule.split(',');
+					minMax[0] = Number(minMax[0]);
+					minMax[1] = Number(minMax[1]);
+					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+				break;
+				case 'betweenF': 
+					var reg = /^-?[0-9][0-9]?.+[0-9]+$/;
+					if (!reg.test(data[rule[i].name])){this.error = rule[i].errorMsg; return false;}
+					var minMax = rule[i].checkRule.split(',');
+					minMax[0] = Number(minMax[0]);
+					minMax[1] = Number(minMax[1]);
+					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
+						this.error = rule[i].errorMsg;
+						return false;
+					}
+				break;
+				case 'same':
+					if (data[rule[i].name] != rule[i].checkRule) { this.error = rule[i].errorMsg; return false;}
+				break;
+				case 'notsame':
+					if (data[rule[i].name] == rule[i].checkRule) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'email':
+					var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'phoneno':
+					var reg = /^1[0-9]{10,10}$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'zipcode':
+					var reg = /^[0-9]{6}$/;
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'reg':
+					var reg = new RegExp(rule[i].checkRule);
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+				case 'in':
+					if(rule[i].checkRule.indexOf(data[rule[i].name]) == -1){
+						this.error = rule[i].errorMsg; return false;
+					}
+				break;
+				case 'notnull':
+					if(data[rule[i].name] == null || data[rule[i].name].length < 1){this.error = rule[i].errorMsg; return false;}
+				break;
+				case 'samewith': 
+					if(data[rule[i].name] != data[rule[i].checkRule]){this.error = rule[i].errorMsg; return false;}
+				break;
+				case 'numbers':
+					var reg = new RegExp('^[0-9]{' + rule[i].checkRule + '}$');
+					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
+				break;
+			}
+		}
+		return true;
+	},
+	isNumber : function (checkVal){
+		checkVal = Number(checkVal);
+		if(checkVal == NaN){return false;}
+		return true;
+	}
+}

+ 391 - 0
lib/GraceUI5/js/grace.js

@@ -0,0 +1,391 @@
+
+var md5                = require('@/GraceUI5/js/md5.js');
+module.exports = {
+	// 版本检查
+	verson : function(){
+		var currentVersion = '5.0';
+		console.log(currentVersion);
+	},
+	// --- 页面跳转相关 ---
+	// 页面跳转
+	navigate:function (url, type, success, fail, complete) {
+		if(!type){type = 'navigateTo';}
+		if(!success){success = function(){};}
+		if(!fail){fail = function(){};}
+		if(!complete){complete = function(){};}
+		switch(type){
+			case 'navigateTo' : 
+			uni.navigateTo({url:url, success:success, fail:fail, complete:complete});
+			break;
+			case 'redirectTo' : 
+			uni.redirectTo({url:url, success:success, fail:fail, complete:complete});
+			break;
+			case 'switchTab' : 
+			uni.switchTab({url:url, success:success, fail:fail, complete:complete});
+			break;
+			case 'reLaunch' : 
+			uni.reLaunch({url:url, success:success, fail:fail, complete:complete});
+			break;
+		}
+	},
+	// 返回
+	back:function(delta){
+		if(!delta){delta = 1;}
+		uni.navigateBack({delta:delta});
+	},
+	
+	// --- 网络请求 ---
+	// get
+	get : function(url, data, headers, success, fail){
+		if(!fail){fail = () => {this.msg("网络请求失败");}}
+		if(!headers){headers={};}
+		if(this.__before != null){this.__before(); this.__before = null;}
+		uni.request({
+			url      : url,
+			data     : data,
+			method   : "GET",
+			dataType : "json",
+			header   : headers,
+			success  : (res) => {success(res.data);},
+			fail     : fail,
+			complete : () => {if(this.__after != null){this.__after(); this.__after = null;}}
+		});
+	},
+	// post
+	post : function(url, data, contentType, headers, success, fail){
+		if(!fail){fail = () => {this.msg("网络请求失败");}}
+		if(!headers){headers={};}
+		if(!contentType){contentType = 'form';}
+		if(this.__before != null){this.__before(); this.__before = null;}
+		switch(contentType){
+			case "form" : 
+			headers['content-type'] = 'application/x-www-form-urlencoded';
+			break;
+			case "json" : 
+			headers['content-type'] = 'application/json';
+			break;
+			default :
+			headers['content-type'] = 'application/x-www-form-urlencoded';
+		}
+		uni.request({
+			url      : url,
+			data     : data,
+			method   : "POST",
+			dataType : "json",
+			header   : headers,
+			success  : (res) => {success(res.data);},
+			fail     : fail,
+			complete : () => {if(this.__after != null){this.__after(); this.__after = null;}}
+		});
+	},
+	// 请求前置函数
+	__before : null,
+	setBefore : function(func){
+		this.__before = func;
+	},
+	// 请求后置函数
+	__after : null,
+	setAfter : function(func){
+		this.__after = func;
+	},
+	
+	// --- 数据缓存 ---
+	setStorage : function(data){
+		try {
+			for(let k in data){uni.setStorageSync(k, data[k]+'');}
+			return true;
+		} catch (e){return false;}
+	},
+	getStorage : function(keyName){
+		try {
+			var tmpVal = uni.getStorageSync(keyName);
+			if(tmpVal == ''){return false;}
+			return tmpVal;
+		} catch (e){return false;}
+	},
+	removeStorage : function(keyName){
+		try {
+			uni.removeStorageSync(keyName);
+			return true;
+		} catch (e){return false;}
+	},
+	clearStorage : function(){
+		try { uni.clearStorageSync(); } catch (e) {}
+	},
+	
+	// --- 图片相关 ---
+	chooseImgs : function(sets, success, fail, complete) {
+		if(!sets.count){sets.count = 1;}
+		if(!sets.sizeType){sets.sizeType = ['original', 'compressed'];}
+		if(!sets.sourceType){sets.sourceType = ['album', 'camera'];}
+		uni.chooseImage({
+		    count: sets.count, //默认9
+		    sizeType: sets.sizeType, //可以指定是原图还是压缩图,默认二者都有
+		    sourceType: sets.sourceType, //从相册选择
+		    success:(res) => {success(res.tempFilePaths);},
+			fail: (e) => { if(fail){fail(e);}},
+			complete: (e) => { if(complete){complete(e);}}
+		});
+	},
+	getImageInfo : function(imgUrl, success, fail, complete){
+		uni.getImageInfo({
+			src: imgUrl,
+			success: function (info) {success(info);},
+			fail: (e) => { if(fail){fail(e);}},
+			complete: (e) => { if(complete){complete(e);}}
+		});
+	},
+	previewImage : function (items, currentImg) {
+		uni.previewImage({ urls: items, current:currentImg});
+	},
+	
+	// --- 系统信息 ---
+	system : function () {
+		try {
+		    var res = uni.getSystemInfoSync();
+			var iPhoneXBottom = 0;
+			if(!res.model){res.model = 'no';}
+			res.model = res.model.replace(' ', '');
+			res.model = res.model.toLowerCase();
+			var res1  = res.model.indexOf('iphonex');
+			if(res1 > 5){res1 = -1;}
+			var res2   = res.model.indexOf('iphone1');
+			if(res2 > 5){res2 = -1;}
+			if(res1 != -1 || res2 != -1){
+				res.iPhoneXBottomHeightRpx = 50;
+				res.iPhoneXBottomHeightPx = uni.upx2px(50);
+			}else{
+				res.iPhoneXBottomHeightRpx = 0;
+				res.iPhoneXBottomHeightPx  = 0;
+			}
+			return res;
+		} catch (e){
+		    return null;
+		}
+	},
+	
+	// --- 消息弹框 ---
+	msg : function(msg){uni.showToast({title:msg, icon:"none"});},
+	showLoading : function (title) {uni.showLoading({  title:title , mask:true });},
+	
+	// --- 导航条设置 ---
+	setNavBar : function(sets){
+		if(sets.title){uni.setNavigationBarTitle({title:sets.title});}
+		if(sets.color){
+			uni.setNavigationBarColor({
+			    frontColor: sets.color.frontColor,
+			    backgroundColor:sets.color.backgroundColor,
+			    animation: {
+			        duration: 400,
+			        timingFunc: 'easeIn'
+			    }
+			});
+		}
+		if(sets.loading){
+			uni.showNavigationBarLoading();
+		}else{
+			uni.hideNavigationBarLoading();
+		}
+	},
+	
+	// --- 元素选择 ---
+	// 单个元素选择
+	select : function (selector, callBack) {
+		uni.createSelectorQuery().select(selector).boundingClientRect().exec((res)=>{callBack(res[0]);});
+	},
+	// 多个元素获取
+	selectAll : function (selector, callBack) {
+		uni.createSelectorQuery().selectAll(selector).boundingClientRect().exec((res)=>{callBack(res[0]);});
+	},
+	
+	// --- 数组操作 ---
+	// 数组合并
+	arrayConcat : function(){
+		var tmpArr = [];
+		for(let i = 0; i < arguments.length; i++){tmpArr = tmpArr.concat(arguments[i]);}
+		return tmpArr;
+	},
+	arrayDrop : function(array, index, howmany){
+		if(!index){index = 0;}
+		if(!howmany){howmany = 1;}
+		array.splice(index, howmany);
+		return array;
+	},
+	arrayIndexOf : function(arr, needFind){
+		var index = -1;
+		for(let i = 0; i < arr.length; i++){
+			if(arr[i] == needFind){index = i; return i;}
+		}
+		return index;
+	},
+	arrayDifference : function(a, b){
+		const set = new Set(b);
+		return a.filter(x => !set.has(x));
+	},
+	arrayShuffle : function (arr) {
+		let l = arr.length;
+		while (l) {
+			const i = Math.floor(Math.random() * l--);
+			[arr[l], arr[i]] = [arr[i], arr[l]];
+		}
+		return arr;
+	},
+	arraySum: function(arr){
+		return arr.reduce((acc, val) => acc + val, 0);
+	},
+	arrayAvg: function(arr){
+		return arr.reduce((acc, val) => acc + val, 0) / arr.length;
+	},
+	arrayEach : function(arr, fun){
+		for(let i = 0; i < arr.length; i++) {fun(arr[i], i);}
+	},
+	
+	// 2数之间的随机数
+	random : function(min, max){ 
+		switch(arguments.length){ 
+			case 1: 
+			return parseInt(Math.random() * min + 1,10); 
+			break;
+			case 2: 
+			return parseInt(Math.random() * (max - min + 1 ) + min, 10); 
+			break;
+			default: 
+			return 0;
+		}
+	},
+	
+	// UUID
+	uuid : function(len){
+		var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
+	    var uuid = [], i;
+	    if(len){
+	        for (i = 0; i < len; i++){uuid[i] = chars[0 | Math.random() * chars.length];}
+	    }else{
+	        var r;
+	        uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
+	        uuid[14] = '4';
+	        for(i = 0; i < 36; i++){
+	            if (!uuid[i]){
+	                r = 0 | Math.random() * 16;
+	                uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+	            }
+	        }
+	    }
+	    return uuid.join('');
+	},
+	
+	// --- 日期时间 ---
+	now : function (type, addTime) {
+		var dateObj = new Date();
+		var cTime = dateObj.getTime();
+		if(addTime){cTime += addTime;}
+		if(!type){type = 'number';}
+		if(type == 'number'){
+			return cTime;
+		}else if(type == 'str'){
+			return this.toDate(cTime / 1000, 'str');
+		}else if(type == 'array'){
+			return this.toDate(cTime / 1000, 'array');
+		}
+	},
+	// 时间戳转 YY-mm-dd HH:ii:ss
+	toDate : function(timeStamp, returnType){
+		timeStamp = parseInt(timeStamp);
+		var date = new Date();
+		if(timeStamp < 90000000000 ){
+			date.setTime(timeStamp * 1000);
+		}else{
+			date.setTime(timeStamp );
+		}
+		var y = date.getFullYear();
+		var m = date.getMonth() + 1;
+		m = m < 10 ? ('0' + m) : m;
+		var d = date.getDate();
+		d = d < 10 ? ('0' + d) : d;
+		var h = date.getHours();
+		h = h < 10 ? ('0' + h) : h;
+		var minute = date.getMinutes();
+		var second = date.getSeconds();
+		minute = minute < 10 ? ('0' + minute) : minute;
+		second = second < 10 ? ('0' + second) : second;
+		if(returnType == 'str'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;}
+		return [y, m, d, h, minute, second];
+	},
+	// 字符串转时间戳
+	toTimeStamp : function(timeStamp){
+		var reg = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
+		var res = timeStamp.match(reg);
+		if (res == null){
+			var reg2 = /^([0-9]{2})\/([0-9]{2})\/([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
+			var res2 = timeStamp.match(reg2);
+			if(res2 == null){ console.log('时间格式错误 E001'); return false;}
+			var year  = parseInt(res2[3]);
+			var month = parseInt(res2[1]);
+			var day   = parseInt(res2[2]);
+			var h     = parseInt(res2[4]);
+			var i     = parseInt(res2[5]);
+			var s     = parseInt(res2[6]);
+		}else{
+			var year  = parseInt(res[1]);
+			var month = parseInt(res[2]);
+			var day   = parseInt(res[3]);
+			var h     = parseInt(res[4]);
+			var i     = parseInt(res[5]);
+			var s     = parseInt(res[6]);
+		}
+		if (year < 1000) { console.log('时间格式错误'); return false; }
+		if (h < 0 || h > 24) { console.log('时间格式错误'); return false; }
+		if (i < 0 || i > 60) { console.log('时间格式错误'); return false; }
+		if (s < 0 || s > 60) { console.log('时间格式错误'); return false; }
+		return Date.parse(new Date(year, month - 1, day, h, i, s));
+	},
+	// 根据时间戳计算多少分钟/小时/天之前
+	fromTime : function (time){
+		if(time < 90000000000 ){time *= 1000;}
+	    var timer = new Date().getTime() - time;
+		timer = parseInt(timer / 1000);
+	    if(timer < 180){
+	        return '刚刚';
+	    }else if(timer >= 180 && timer < 3600){
+	        return parseInt(timer / 60) + '分钟前';
+	    }else if(timer >= 3600 && timer < 86400){
+	        return parseInt(timer / 3600) + '小时前';
+	    }else if(timer >= 86400 && timer < 2592000){
+	        return parseInt(timer / 86400) + '天前';
+	    }else{
+	        return this.toDate(time, 'str');
+	    }
+	},
+	
+	// 延迟操作
+	delay:function (timer, func){
+		return setTimeout(func, timer);
+	},
+	// 间隔指定时间循环某个函数
+	interval:function (timer, func){
+		return setInterval(func, timer);
+	},
+	
+	// 对象操作
+	assign : function (obj, key, val) {obj[key] = val;},
+	removeByKey : function (obj, key) {delete obj[key];},
+	each : function(obj, func){
+		for(let k in obj){func(k, obj[k]);}
+	},
+	isEmptyObj : function(obj){return JSON.stringify(obj) === '{}';},
+	
+	// 获取ref ( 循环获取,直到 组件创建完成并获取成功 )
+	getRefs : function(ref, _this, count, fun){
+		if(count >= 40){return null;}
+		var refReturn = _this.$refs[ref];
+		if(refReturn){
+			fun(refReturn);
+			return;
+		}else{
+			count++;
+			setTimeout(()=>{
+				this.getRefs(ref, _this, count, fun);
+			}, 100);
+		}
+	}
+}

+ 385 - 0
lib/GraceUI5/js/md5.js

@@ -0,0 +1,385 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */
+var b64pad  = "";  /* base-64 pad character. "=" for strict RFC compliance   */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
+function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
+function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
+function hex_hmac_md5(k, d)
+  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
+function b64_hmac_md5(k, d)
+  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
+function any_hmac_md5(k, d, e)
+  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+  return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of a raw string
+ */
+function rstr_md5(s)
+{
+  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data (raw strings)
+ */
+function rstr_hmac_md5(key, data)
+{
+  var bkey = rstr2binl(key);
+  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
+
+  var ipad = Array(16), opad = Array(16);
+  for(var i = 0; i < 16; i++)
+  {
+    ipad[i] = bkey[i] ^ 0x36363636;
+    opad[i] = bkey[i] ^ 0x5C5C5C5C;
+  }
+
+  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
+}
+
+/*
+ * Convert a raw string to a hex string
+ */
+function rstr2hex(input)
+{
+  try { hexcase } catch(e) { hexcase=0; }
+  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+  var output = "";
+  var x;
+  for(var i = 0; i < input.length; i++)
+  {
+    x = input.charCodeAt(i);
+    output += hex_tab.charAt((x >>> 4) & 0x0F)
+           +  hex_tab.charAt( x        & 0x0F);
+  }
+  return output;
+}
+
+/*
+ * Convert a raw string to a base-64 string
+ */
+function rstr2b64(input)
+{
+  try { b64pad } catch(e) { b64pad=''; }
+  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  var rcode = 'NUMOOXEXFLLVGN';
+  var output = "";
+  var len = input.length;
+  for(var i = 0; i < len; i += 3)
+  {
+    var triplet = (input.charCodeAt(i) << 16)
+                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
+                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
+    for(var j = 0; j < 4; j++)
+    {
+      if(i * 8 + j * 6 > input.length * 8) output += b64pad;
+      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
+    }
+  }
+  return output;
+}
+
+/*
+ * Convert a raw string to an arbitrary string encoding
+ */
+function rstr2any(input, encoding)
+{
+  var divisor = encoding.length;
+  var i, j, q, x, quotient;
+
+  /* Convert to an array of 16-bit big-endian values, forming the dividend */
+  var dividend = Array(Math.ceil(input.length / 2));
+  for(i = 0; i < dividend.length; i++)
+  {
+    dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
+  }
+
+  /*
+   * Repeatedly perform a long division. The binary array forms the dividend,
+   * the length of the encoding is the divisor. Once computed, the quotient
+   * forms the dividend for the next step. All remainders are stored for later
+   * use.
+   */
+  var full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
+  var remainders = Array(full_length);
+  for(j = 0; j < full_length; j++)
+  {
+    quotient = Array();
+    x = 0;
+    for(i = 0; i < dividend.length; i++)
+    {
+      x = (x << 16) + dividend[i];
+      q = Math.floor(x / divisor);
+      x -= q * divisor;
+      if(quotient.length > 0 || q > 0)
+        quotient[quotient.length] = q;
+    }
+    remainders[j] = x;
+    dividend = quotient;
+  }
+
+  /* Convert the remainders to the output string */
+  var output = "";
+  for(i = remainders.length - 1; i >= 0; i--)
+    output += encoding.charAt(remainders[i]);
+
+  return output;
+}
+
+/*
+ * Encode a string as utf-8.
+ * For efficiency, this assumes the input is valid utf-16.
+ */
+function str2rstr_utf8(input)
+{
+  var output = "";
+  var i = -1;
+  var x, y;
+
+  while(++i < input.length)
+  {
+    /* Decode utf-16 surrogate pairs */
+    x = input.charCodeAt(i);
+    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
+    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
+    {
+      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
+      i++;
+    }
+
+    /* Encode output as utf-8 */
+    if(x <= 0x7F)
+      output += String.fromCharCode(x);
+    else if(x <= 0x7FF)
+      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
+                                    0x80 | ( x         & 0x3F));
+    else if(x <= 0xFFFF)
+      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
+                                    0x80 | ((x >>> 6 ) & 0x3F),
+                                    0x80 | ( x         & 0x3F));
+    else if(x <= 0x1FFFFF)
+      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
+                                    0x80 | ((x >>> 12) & 0x3F),
+                                    0x80 | ((x >>> 6 ) & 0x3F),
+                                    0x80 | ( x         & 0x3F));
+  }
+  return output;
+}
+
+/*
+ * Encode a string as utf-16
+ */
+function str2rstr_utf16le(input)
+{
+  var output = "";
+  for(var i = 0; i < input.length; i++)
+    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
+                                  (input.charCodeAt(i) >>> 8) & 0xFF);
+  return output;
+}
+
+function str2rstr_utf16be(input)
+{
+  var output = "";
+  for(var i = 0; i < input.length; i++)
+    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
+                                   input.charCodeAt(i)        & 0xFF);
+  return output;
+}
+
+/*
+ * Convert a raw string to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+function rstr2binl(input)
+{
+  var output = Array(input.length >> 2);
+  for(var i = 0; i < output.length; i++)
+    output[i] = 0;
+  for(var i = 0; i < input.length * 8; i += 8)
+    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
+  return output;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2rstr(input)
+{
+  var output = "";
+  for(var i = 0; i < input.length * 32; i += 8)
+    output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
+  return output;
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+function binl_md5(x, len)
+{
+  /* append padding */
+  x[len >> 5] |= 0x80 << ((len) % 32);
+  x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+  var a =  1732584193;
+  var b = -271733879;
+  var c = -1732584194;
+  var d =  271733878;
+
+  for(var i = 0; i < x.length; i += 16)
+  {
+    var olda = a;
+    var oldb = b;
+    var oldc = c;
+    var oldd = d;
+
+    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
+    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
+    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
+    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
+    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
+
+    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
+    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
+    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
+    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
+    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
+    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
+    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
+    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
+    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
+    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
+    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
+    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
+    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
+    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
+    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
+    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+    a = safe_add(a, olda);
+    b = safe_add(b, oldb);
+    c = safe_add(c, oldc);
+    d = safe_add(d, oldd);
+  }
+  return Array(a, b, c, d);
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+  return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+  return (num << cnt) | (num >>> (32 - cnt));
+}
+
+module.exports = {
+	md5 : function(str){
+		return hex_md5(str);
+	}
+}

+ 252 - 0
lib/GraceUI5/js/parserHTML.js

@@ -0,0 +1,252 @@
+// Regular Expressions for parsing tags and attributes
+var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
+
+var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr,\n,\t,\t'); // Block Elements - HTML 5
+// fixed by xxx 将 ins 标签从块级名单中移除
+
+var block = makeMap('a,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,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
+
+var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,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)
+
+var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
+
+var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); 
+// Special Elements (can contain anything)
+
+var special = makeMap('script,style');
+function HTMLParser(html, handler) {
+  var index;
+  var chars;
+  var match;
+  var stack = [];
+  var last = html;
+
+  stack.last = function () {
+    return this[this.length - 1];
+  };
+
+  while (html) {
+    chars = true; // Make sure we're not in a script or style element
+    if (!stack.last() || !special[stack.last()]) {
+      // Comment
+      if (html.indexOf('<!--') == 0) {
+        index = html.indexOf('-->');
+
+        if (index >= 0) {
+          if (handler.comment) {
+            handler.comment(html.substring(4, index));
+          }
+
+          html = html.substring(index + 3);
+          chars = false;
+        } // end tag
+
+      } else 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('<');
+        var text = index < 0 ? html : html.substring(0, index);
+        html = index < 0 ? '' : html.substring(index);
+
+        if (handler.chars) {
+          handler.chars(text);
+        }
+      }
+    } else {
+      html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function (all, text) {
+        text = text.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, '$1$2');
+
+        if (handler.chars) {
+          handler.chars(text);
+        }
+
+        return '';
+      });
+      parseEndTag('', stack.last());
+    }
+
+    if (html == last) {
+      throw 'Parse Error: ' + html;
+    }
+
+    last = html;
+  } // Clean up any remaining tags
+
+
+  parseEndTag();
+
+  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) {
+      var attrs = [];
+      rest.replace(attr, function (match, name) {
+        var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : '';
+        attrs.push({
+          name: name,
+          value: value,
+          escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
+
+        });
+      });
+      if (handler.start) {
+        handler.start(tagName, attrs, unary);
+      }
+    }
+  }
+
+  function parseEndTag(tag, tagName) {
+    // If no tag name is provided, clean shop
+    if (!tagName) {
+      var pos = 0;
+    } // Find the closest opened tag of the same type
+    else {
+        for (var pos = stack.length - 1; pos >= 0; pos--) {
+          if (stack[pos] == tagName) {
+            break;
+          }
+        }
+      }
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (var i = stack.length - 1; i >= pos; i--) {
+        if (handler.end) {
+          handler.end(stack[i]);
+        }
+      } // Remove the open elements from the stack
+      stack.length = pos;
+    }
+  }
+}
+
+function makeMap(str) {
+  var obj = {};
+  var items = str.split(',');
+  for (var i = 0; i < items.length; i++) {
+    obj[items[i]] = true;
+  }
+  return obj;
+}
+function removeDOCTYPE(html) {
+  return html.replace(/<\?xml.*\?>\n/, '').replace(/<!doctype.*>\n/, '').replace(/<!DOCTYPE.*>\n/, '');
+}
+function parseAttrs(attrs) {
+  return attrs.reduce(function (pre, attr) {
+    var value = attr.value;
+    var name = attr.name;
+	if(value.indexOf('width') != -1){
+		value += '; width:100%; height:auto;'
+	}
+    if (pre[name]) {
+			pre[name] = pre[name] + " " + value;
+    } else {
+			pre[name] = value;
+    }
+    return pre;
+  }, {});
+}
+function parseHtml(html) {
+  html = removeDOCTYPE(html);
+  html = html.replace(/\n/g,'');
+  html = html.replace(/\t/g,'');
+  var stacks = [];
+  var results = {
+    node : 'root',
+    children: []
+  };
+  HTMLParser( html, {
+    start : function start(tag, attrs, unary) {
+      var node = {name: tag };
+      if (attrs.length !== 0) {
+        node.attrs = parseAttrs(attrs);
+      }
+      if (unary) {
+        var parent = stacks[0] || results;
+        if (!parent.children) {
+          parent.children = [];
+        }
+        parent.children.push(node);
+      } else {
+        stacks.unshift(node);
+      }
+    },
+    end: function end(tag) {
+      var node = stacks.shift();
+      if (node.name !== tag){console.error('invalid state: mismatch end tag');}
+      if (stacks.length === 0) {
+        results.children.push(node);
+      } else {
+        var parent = stacks[0];
+        if (!parent.children) {
+          parent.children = [];
+        }
+        parent.children.push(node);
+      }
+    },
+    chars: function chars(text) {
+      var node = {
+        type: 'text',
+        text: text
+      };
+      if (stacks.length === 0) {
+        results.children.push(node);
+      } else {
+        var parent = stacks[0];
+        if (!parent.children) {
+          parent.children = [];
+        }
+        parent.children.push(node);
+      }
+    },
+    comment: function comment(text) {
+      var node = {
+        node : 'comment',
+        text : text
+      };
+      var parent = stacks[0];
+      if (!parent.children) {
+        parent.children = [];
+      }
+      parent.children.push(node);
+    }
+  });
+  return results.children;
+}
+module.exports = {
+	parserHTML : parseHtml
+}

File diff suppressed because it is too large
+ 262 - 0
lib/GraceUI5/js/qrcode.js


+ 57 - 0
lib/GraceUI5/js/request/config.js

@@ -0,0 +1,57 @@
+
+module.exports = {
+	
+	// api 基础 url
+	apiBaseUrl        : 'https://www.*****.com/api/',
+	
+	// 调试模式 [ false 关闭调试输出,项目发包时请设置此项为 false ]
+	debug             : true,
+	
+	// 本地 Token 数据键名称
+	localTokenKeyName : 'reqToken',
+	
+	// 用户登录 Token 数据键名称
+	userTokenKeyName  : 'uToken',
+	
+	// token 有效期, 单位 秒 ,要与后端保持一致
+	expiredTime       : 3600,
+	
+	// post 方式 header[content-type] 默认值
+	postHeaderDefault : 'application/x-www-form-urlencoded',
+	
+	// 从服务器获取 token 函数
+	// 因后端语言不同、思路不同,请跟据自己的 api 情况完成 token 获取函数
+	// 一个示例,实际开发请跟据自己情况复写此函数	
+	getToken : (resolve, reject) => {
+		
+		// 接口请求秘钥 与后端开发人员协商格式及获取
+		// 如 : 
+		var appKey = 'AppKey2021&&';
+		
+		// 发起请求
+		uni.request({
+			// token 授权 api 服务器地址
+			url      : "https://www.******.com/api/srequest/makeToken",
+			// 请求秘钥
+			data     : { 'appKey' : appKey },
+			// 请求方式 POST
+			method   : "POST",
+			// headers
+			header   : {'content-type' : 'application/x-www-form-urlencoded'},
+			// 返回值类型
+			dataType : "json",
+			// 请求成功
+			success  : (res) => {
+				var data = res.data;
+				if(data.status == 'ok'){
+					resolve(data.data);
+				}else{
+					reject();
+				}
+			},
+			// 请求失败
+			fail     : (e) => { reject();}
+		});
+	}
+	
+}

+ 312 - 0
lib/GraceUI5/js/request/request.js

@@ -0,0 +1,312 @@
+
+// 加载配置
+var GraceRequestConfig = require('@/GraceUI5/js/request/config.js');
+var md5                = require('@/GraceUI5/js/md5.js');
+
+// 核心工具定义
+module.exports = {
+	
+	// token 数据记录
+	token    : '',
+	
+	// 连接接服务器获得请求 token
+	getTokenFromApi : function (resolve, reject) {
+		new Promise(GraceRequestConfig.getToken).then((res)=>{
+			this.token = res;
+			// 将 token 保存在本地并记录获取时间
+			uni.setStorageSync(GraceRequestConfig.localTokenKeyName, this.token);
+			// 记录时间
+			var dateObj = new Date();
+			var cTime   = dateObj.getTime();
+			cTime      += '';
+			uni.setStorageSync('GraceRequestTokenTime', cTime);
+			resolve();
+		}).catch(()=>{
+			this.debug('api 获取 token 失败');
+			this.token = '';
+			reject();
+		});
+	},
+	
+	// 获取 token
+	getToken : function(resolve, reject){
+		// 首先尝试从本地获取
+		var token = uni.getStorageSync(GraceRequestConfig.localTokenKeyName);
+		// 本地不存在 token 数据
+		if(!token || token == ''){
+			new Promise(this.getTokenFromApi.bind(this)).then((res)=>{
+				resolve();
+			}).catch(()=>{reject();});
+		}
+		// 存在 token 数据
+		else{
+			// 检查 token 有效期
+			var expiredTime = GraceRequestConfig.expiredTime;
+			expiredTime    *= 1000;
+			var tokenTime   = Number(uni.getStorageSync('GraceRequestTokenTime'));
+			tokenTime      += expiredTime;
+			var dateObj     = new Date();
+			var cTime       = dateObj.getTime();
+			// 有效期内
+			if(tokenTime > cTime){
+				this.token = token;
+				resolve();
+			}
+			// 获取新的 token
+			else{
+				new Promise(this.getTokenFromApi.bind(this)).then((res)=>{
+					resolve();
+				}).catch(()=>{
+					reject();
+				});
+			}
+		}
+	},
+	
+	// 设置默认值补齐
+	requestInit : function(sets, withLoginToken){
+		if(!sets.data){sets.data         = {};}
+		if(!sets.header){sets.header     = {};}
+		if(!sets.timeout){sets.timeout   = 60000;}
+		if(!sets.dataType){sets.dataType = 'json';}
+		sets.header.token = this.token;
+		if(withLoginToken){
+			var loginToken = this.checkLogin();
+			if(loginToken){sets.header.logintoken = loginToken;}
+		}
+		return sets;
+	},
+	
+	// GET 请求 异步
+	get : function(url, sets, success, fail, complete, withLoginToken){
+		if(!sets){sets = {};}
+		if(!success){success = function(res){}}
+		if(!fail){fail = function(e){}}
+		if(!complete){complete = function(res){}}
+		if(!withLoginToken){withLoginToken = false;}
+		new Promise(this.getToken.bind(this)).then(()=>{
+			if(GraceRequestConfig.apiBaseUrl != ''){url = GraceRequestConfig.apiBaseUrl + url;}
+			sets = this.requestInit(sets, withLoginToken);
+			uni.request({
+				url      : url,
+				data     : sets.data,
+				timeout  : sets.timeout,
+				dataType : sets.dataType,
+				header   : sets.header,
+				method   : 'GET',
+				success  : (res)=>{
+					this.debug(res);
+					success(res.data);
+				},
+				fail     : (error)=>{fail(error.errMsg);},
+				complete : (res) =>{complete(res);}
+			});
+		}).catch((e)=>{
+			console.log(e);
+			this.tokenError();
+		});
+	},
+	
+	// GET 请求 同步
+	getSync : async function(url, sets, withLoginToken) {
+		let res, error;
+		if(!withLoginToken){withLoginToken = false;}
+		return new Promise(this.getToken.bind(this)).then(async ()=>{
+			if(GraceRequestConfig.apiBaseUrl != ''){url = GraceRequestConfig.apiBaseUrl + url;}
+			sets = this.requestInit(sets, withLoginToken);
+			var [error, res] = await uni.request({
+				url      : url,
+				data     : sets.data,
+				timeout  : sets.timeout,
+				dataType : sets.dataType,
+				header   : sets.header,
+				method   : 'GET'
+			});
+			if(error != null){ return false; }
+			this.debug(res);
+			return res.data;
+		}).catch((e)=>{
+			console.log(e);
+			this.tokenError();
+			return ['', e];
+		});
+	},
+	
+	// POST 请求 异步
+	post : function(url, sets, success, fail, complete, isSign, withLoginToken){
+		if(!sets){sets = {};}
+		if(!success){success = function(res){}}
+		if(!fail){fail = function(e){}}
+		if(!complete){complete = function(res){}}
+		if(!withLoginToken){withLoginToken = false;}
+		
+		new Promise(this.getToken.bind(this)).then(()=>{
+			if(GraceRequestConfig.apiBaseUrl != ''){url = GraceRequestConfig.apiBaseUrl + url;}
+			sets = this.requestInit(sets, withLoginToken);
+			if(!sets.header['content-type']){
+				sets.header['content-type'] = GraceRequestConfig.postHeaderDefault;
+			}
+			if(isSign == true){
+				sets.data = this.sign(sets.data);
+			}else if(isSign == 'value'){
+				sets.data = this.signValue(sets.data);
+			}
+			uni.request({
+				url      : url,
+				data     : sets.data,
+				timeout  : sets.timeout,
+				dataType : sets.dataType,
+				header   : sets.header,
+				method   : 'POST',
+				success  : (res)=>{
+					this.debug(res);
+					success(res.data);
+				},
+				fail     : (error)=>{fail(error.errMsg);},
+				complete : (res) =>{complete(res);}
+			});
+		}).catch((e)=>{
+			console.log(e);
+			this.tokenError();
+		});
+	},
+	
+	// POST 请求 同步
+	postSync : async function(url, sets, isSign, withLoginToken) {
+		let res, error;
+		if(!withLoginToken){withLoginToken = false;}
+		return new Promise(this.getToken.bind(this)).then(async ()=>{
+			if(GraceRequestConfig.apiBaseUrl != ''){url = GraceRequestConfig.apiBaseUrl + url;}
+			sets = this.requestInit(sets, withLoginToken);
+			if(!sets.header['content-type']){
+				sets.header['content-type'] = GraceRequestConfig.postHeaderDefault;
+			}
+			if(isSign == true){
+				sets.data = this.sign(sets.data);
+			}else if(isSign == 'value'){
+				sets.data = this.signValue(sets.data);
+			}
+			var [error, res] = await uni.request({
+				url      : url,
+				data     : sets.data,
+				timeout  : sets.timeout,
+				dataType : sets.dataType,
+				header   : sets.header,
+				method   : 'POST'
+			});
+			if(error != null){ return false; }
+			return res.data;
+		}).catch((e)=>{
+			console.log(e);
+			this.tokenError();
+			return ['', e];
+		});
+	},
+	
+	// 文件上传
+	upload : function(url, filePath, fileType, sets, success, fail, complete, withLoginToken){
+		if(!sets){sets = {};}
+		if(!success){success = function(res){}}
+		if(!fail){fail = function(e){}}
+		if(!complete){complete = function(res){}}
+		if(!withLoginToken){withLoginToken = false;}
+		new Promise(this.getToken.bind(this)).then(()=>{
+			if(GraceRequestConfig.apiBaseUrl != ''){url = GraceRequestConfig.apiBaseUrl + url;}
+			// 初始化 sets
+			if(!sets.name){sets.name = 'file';}
+			if(!sets.header){sets.header     = {};}
+			if(!sets.formData){sets.formData = {};}
+			sets.header.token = this.token;
+			if(withLoginToken){
+				var loginToken = this.checkLogin();
+				if(loginToken){sets.header.loginToken = loginToken;}
+			}
+			// 开始上传
+			uni.uploadFile({
+				url         : url,
+				filePath    : filePath,
+				name        : sets.name,
+				formData    : sets.formData,
+				header      : sets.header,
+				success     : (res)=>{success(res.data);},
+				fail        : (error)=>{fail(error);},
+				complete    : (res) =>{complete(res);}
+			});
+		}).catch((e)=>{
+			console.log(e);
+			this.tokenError();
+		});
+	},
+	
+	// debug 函数
+	debug : function (content) {
+		if(!GraceRequestConfig.debug){return ;}
+		console.log(content);
+	},
+	
+	// token 错误
+	tokenError : function () {
+		uni.showToast({title:"请求失败,请重启应用重试", icon:"none"});
+	},
+	
+	// 签名算法
+	sign : function (data) {
+		var keys = []; 
+		Object.keys(data).sort().map((key) => {keys.push(key);});
+		keys.push(this.token);
+		var sign  = md5.md5(keys.join('-'));
+		data.gracesign = sign;
+		return data;
+	},
+	
+	// signValue
+	signValue : function(data){
+		var vals = [];
+		Object.keys(data).sort().map((key) => {vals.push(data[key]);});
+		vals.push(this.token);
+		var sign  = md5.md5(vals.join('-'));
+		data.gracesign = sign;
+		return data;
+	},
+	
+	// 登录检查
+	// 登录后在本地保存一个 token
+	checkLogin : function (notLoginDo) {
+		var loginToken = uni.getStorageSync(GraceRequestConfig.userTokenKeyName);
+		if(!loginToken || loginToken == ''){
+			loginToken = '';
+			if(notLoginDo){
+				uni.showToast({title:"请登录", icon:"none", mask:true});
+				setTimeout(()=>{notLoginDo();}, 1500);
+			}
+			return false;
+		}
+		return loginToken;
+	},
+	
+	// 跳转到登录页面
+	gotoLogin : function (path, opentype) {
+		if(!path){path = '../login/login';}
+		if(!opentype){opentype = 'redirect';}
+		switch(opentype){
+			case  'redirect' : 
+			uni.redirectTo({url:path});
+			break;
+			case  'navigate' : 
+			uni.navigateTo({url:path});
+			break;
+			case  'switchTab' : 
+			uni.switchTab({url:path});
+			break;
+		}
+	},
+	
+	// 记录 用户 token 到本地
+	// 格式 loginToken-uid
+	writeLoginToken : function (token, uid) {
+		var loginToken = token+'-'+uid;
+		uni.setStorageSync(GraceRequestConfig.userTokenKeyName, loginToken);
+		return ;
+	}
+	
+}

+ 44 - 0
lib/GraceUI5/js/string.js

@@ -0,0 +1,44 @@
+
+module.exports = {
+	
+	// 字符串长度计算
+	count : function(str, countSpace = true){
+		if(countSpace){return str.length;}
+		return this.removeAllSpace(str).length;
+	},
+	
+	// 去除全部空格
+	removeAllSpace : function(str){
+		return str.replace(/\s+/g, "");
+	},
+	
+	// 去除首尾空格
+	trim : function(str){
+	  return str.trim();
+	},
+	
+	// 去除左侧空格
+	trimL : function(str){
+	  return str.replace(/^\s+/g, "");
+	},
+	
+	// 去除右侧空格
+	trimR : function(str){
+	  return str.replace(/\s+$/g, "");
+	},
+	
+	// 字符串搜索
+	search : function (str, kwd, caseSensitive = true) {
+		if(!caseSensitive){
+			kwd = kwd.toLowerCase();
+			str = str.toLowerCase();
+		}
+		return str.indexOf(kwd);
+	},
+	
+	// 获取 扩展名
+	getExtension : function (str) {
+		str = str.split('.');
+		return str.pop();
+	}
+}

+ 130 - 0
lib/GraceUI5/skin/black.css

@@ -0,0 +1,130 @@
+/* 文本核心色 一般为黑色 */
+.gui-primary-color{color:#2B2E3D;}
+
+/* 核心背景色 */
+.gui-bg-primary{background-color:#2B2E3D !important;}
+
+
+/* 点击元素通用样式 */
+.gui-tap{opacity:0.85;}
+
+
+/* 购物按钮渐变背景色 */
+.gui-bg-add-card{background-image:linear-gradient(to right, #F1CF53,#F29C39) !important;}
+.gui-bg-buy{background-image:linear-gradient(to right, #E86E35,#EB5058) !important;}
+
+
+/* *** 间距设置 */
+.gui-padding{padding-left:30rpx; padding-right:30rpx;} /* 左右内间距 */
+.gui-margin{margin-left:30rpx; margin-right:30rpx;} /* 左右外间距 */
+.gui-margin-top{margin-top:30rpx;} /* 顶部外间距 */
+.gui-margin-top-large{margin-top:58rpx;} /* 顶部外间距 大 */
+/* 间距设置 *** */
+
+
+/* 文本尺寸 */
+.gui-text{font-size:28rpx; line-height:50rpx; color:#2B2E3D;}
+.gui-text-small{font-size:22rpx;}
+.gui-h1{font-size:80rpx;}
+.gui-h2{font-size:60rpx;}
+.gui-h3{font-size:45rpx;}
+.gui-h4{font-size:32rpx;}
+.gui-h5{font-size:30rpx;}
+.gui-h6{font-size:28rpx;}
+/* #ifndef APP-NVUE */
+.gui-indent{text-indent:56rpx;}
+/* #endif */
+/* #ifdef APP-NVUE */
+.gui-indent{padding-left:56rpx;}
+/* #endif */
+
+
+/* *** gui-page 页面组件相关  */
+.gui-page-loading-bg{background-color:rgba(255,255,255,0.88);} /* 页面内置全屏 Loading 背景颜色 */
+.gui-page-loading-color{background-color:#2B2E3D;} /* 页面内置全屏 Loading 颜色 */
+.gui-header-buttons-bg{background-color:rgba(0,0,0,0.8);} /* 自定义导航左侧按钮背景颜色 */
+.gui-header-buttons-color{color:#FFFFFF;} /* 自定义导航左侧按钮颜色 */
+.gui-nav-bottom-color{color:#B6C3D2;}/* 底部自定义导航默认色 */
+.gui-nav-bottom-active-color{color:#2B2E3D;} /* 底部自定义导航切换色 */
+/* gui-page 页面组件相关 *** */
+
+
+/* 圆角 */
+.gui-border-radius-small{border-radius:6rpx;}
+.gui-border-radius{border-radius:10rpx;}
+.gui-border-radius-large{border-radius:20rpx;}
+
+
+/* 按钮 基于原生组件的修饰 */
+.button-hover{opacity:0.8;}
+.gui-button-text{font-size:28rpx; line-height:88rpx; text-align:center;}
+.gui-button-text-mini{font-size:22rpx; line-height:58rpx; text-align:center;}
+.gui-button-mini{height:58rpx;}
+/* #ifndef APP-NVUE */
+.gui-button{line-height:88rpx; border-radius:5rpx; background:transparent; margin:0; color:transparent; border:0; text-align:center; padding:0;}
+.gui-button::after{width:0; height:0; transform: scale(1); display:none; background:transparent;}
+.gui-button[disabled][type=default]{opacity:0.5;}
+.gui-button[type=default][size=mini]{font-size:22rpx; height:58rpx; line-height:58rpx; background:none;}
+/* #endif */
+/* #ifdef APP-NVUE */
+.gui-button{height:86rpx; line-height:86rpx; border-radius:5rpx; background-color:transparent; margin:0; color:transparent; border-width:0; border-style:solid; border-color:#323232; text-align:center;}
+/* #endif */
+
+/* 按钮 组件 框架自定义样式 */
+.gui-sbutton{width:230rpx; height:80rpx; border-radius:8rpx; padding:0; margin:0;}
+.gui-sbutton-text{font-size:30rpx; line-height:80rpx; text-align:center; color:#FFFFFF;}
+.gui-sbutton-loading-point{width:8rpx; height:8rpx; border-radius:8rpx; margin:8rpx; background-color:#FFFFFF;}
+.gui-sbutton-default{background-color:#3688FF;}
+.gui-sbutton-loading{background-color:#3688FF; opacity:0.8;}
+.gui-sbutton-success{background-color:#07C160 !important;}
+.gui-sbutton-fail{background-color:#FF0036 !important;}
+
+
+/* *** gui-select-list 可选列表样式 */
+.gui-select-list-ring{font-size:32rpx; font-weight:bold;} /* 左侧选择圆环 */
+.gui-select-list-img{width:66rpx; height:66rpx; border-radius:60rpx; margin-right:28rpx;} /* 图片样式 */
+.gui-select-list-title{font-size:28rpx; line-height:50rpx; color:#2B2E3D;} /* 标题样式 */
+.gui-select-list-desc{font-size:22rpx; color:#828282; line-height:33rpx;} /* 描述小文本 */
+.gui-select-list-icon{width:60rpx; line-height:60rpx; font-size:36rpx; text-align:center; color:rgba(69, 90, 100, 0.3);} /* 选中图标 */
+.gui-select-list-current{color:#2B2E3D !important;} /* 选中颜色 */
+/* 可选列表样式 *** */
+
+
+/* *** gui-slide-list 滑动列表样式 */
+.gui-slide-list-img-wrap{width:80rpx; height:80rpx; margin-left:25rpx;} /* 列表图片外层样式 */
+.gui-slide-list-img{width:80rpx; height:80rpx; border-radius:6rpx;} /* 列表图片外层样式 */
+.gui-slide-list-point{border-radius:32rpx; height:32rpx; line-height:32rpx; padding:0 10rpx; font-size:20rpx;} /* 消息数标签样式 */
+/* #ifndef APP-NVUE */
+.gui-slide-list-point{min-width:12rpx;}
+/* #endif */
+.gui-slide-list-title-text{line-height:38rpx; height:38rpx; font-size:28rpx; color:#2B2E3D; overflow:hidden;} /* 消息标题样式 */
+.gui-slide-list-desc{line-height:32rpx; height:32rpx; font-size:22rpx; color:rgba(69, 90, 100, 0.3); overflow:hidden; margin-right:25rpx; margin-top:2px;} /* 消息描述样式 */
+/* 滑动列表样式 *** */
+
+/* *** gui-tree 树状列表样式 */
+.gui-tree-icons{width:50rpx;} /* 图标样式 */
+.gui-tree-icons-text{font-size:32rpx; color:rgba(69, 90, 100, 0.3);}
+.gui-tree-title{line-height:80rpx; font-size:28rpx; width:200rpx;} /* 标题样式 */
+.gui-tree-current{color:#2B2E3D;} /* 选中样式 */
+/* 树状列表样式 *** */
+
+
+/* *** gui-segmented-control 分段器样式 */
+.gui-segmented-control{background-color:#F8F8F8; padding:8rpx;} /* 外层主体 */
+.gui-segmented-control-item{color:#2B2E3D; font-size:26rpx; line-height:66rpx;} /* 项目标题 */
+.gui-segmented-current{background-color:#2B2E3D; color:#FFFFFF;} /* 激活样式 */
+/* 分段器样式 *** */
+
+
+/* *** 为空展示默认图片大小 */
+.gui-empty-img{width:320rpx; height:320rpx; margin-top:200rpx;}
+
+
+/* 演示 : 提交按钮 自定义样式  */
+.mygui-sbutton{width:230rpx; height:80rpx; border-radius:80rpx; padding:0; margin:0;}
+.mygui-sbutton-text{font-size:28rpx; line-height:80rpx; text-align:center; color:#FFFFFF;}
+.mygui-sbutton-loading-point{width:6rpx; height:6rpx; border-radius:10rpx; margin:8rpx; background-color:#FFFFFF;}
+.mygui-sbutton-default{background-color:#2B2E3D;}
+.mygui-sbutton-loading{background-color:#3688FF; opacity:0.8;}
+.mygui-sbutton-success{background-color:#07C160;}
+.mygui-sbutton-fail{background-color:#FF0036;}

+ 0 - 1
lib/colorui/main.css

@@ -17,7 +17,6 @@ body {
 	font-family: Helvetica Neue, Helvetica, sans-serif;
 }
 
-view,
 scroll-view,
 swiper,
 button,

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