mxf 4 years ago
commit
2d73f3e4de
100 changed files with 37496 additions and 0 deletions
  1. 86 0
      App.vue
  2. 253 0
      api/api.js
  3. 70 0
      api/public.js
  4. 355 0
      api/user.js
  5. 139 0
      components/Authorize.vue
  6. 57 0
      components/Loading/index.vue
  7. 173 0
      components/PriceChange/index.vue
  8. 185 0
      components/adc/index.vue
  9. 184 0
      components/addressWindow/index.vue
  10. 120 0
      components/countDown/index.vue
  11. 107 0
      components/couponListWindow/index.vue
  12. 173 0
      components/couponListWindow/备份.vue
  13. 51 0
      components/couponWindow/index.vue
  14. 261 0
      components/easy-upload/easy-upload.vue
  15. 40 0
      components/easy-upload/readme.md
  16. 36 0
      components/emptyPage.vue
  17. 143 0
      components/goodList/index.vue
  18. 118 0
      components/home/index.vue
  19. 814 0
      components/jyf-parser/jyf-parser.vue
  20. 102 0
      components/jyf-parser/libs/CssHandler.js
  21. 577 0
      components/jyf-parser/libs/MpHtmlParser.js
  22. 80 0
      components/jyf-parser/libs/config.js
  23. 35 0
      components/jyf-parser/libs/handler.sjs
  24. 44 0
      components/jyf-parser/libs/handler.wxs
  25. 476 0
      components/jyf-parser/libs/trees.vue
  26. 406 0
      components/mpvue-calendar/browser-style.css
  27. 524 0
      components/mpvue-calendar/calendarinit.js
  28. 15 0
      components/mpvue-calendar/icon.css
  29. 1153 0
      components/mpvue-calendar/mpvue-calendar.vue
  30. 394 0
      components/mpvue-calendar/style.css
  31. 95 0
      components/orderGoods/index.vue
  32. 290 0
      components/payment/index.vue
  33. 89 0
      components/productConSwiper/index.vue
  34. 290 0
      components/productWindow/index.vue
  35. 110 0
      components/promotionGood/index.vue
  36. 113 0
      components/recommend/index.vue
  37. 47 0
      components/shareInfo/index.vue
  38. 57 0
      components/shareRedPackets/index.vue
  39. 52 0
      components/swipers/index.vue
  40. 185 0
      components/tabNav.vue
  41. 165 0
      components/ucharts/component.vue
  42. 5658 0
      components/ucharts/ucharts.js
  43. 0 0
      components/ucharts/ucharts.min.js
  44. 546 0
      components/uni-calendar/calendar.js
  45. 152 0
      components/uni-calendar/uni-calendar-item.vue
  46. 434 0
      components/uni-calendar/uni-calendar.vue
  47. 327 0
      components/uni-calendar/util.js
  48. 133 0
      components/userEvaluation/index.vue
  49. 9 0
      components/vconsole.min.js
  50. 12542 0
      components/wPicker/city-data/area.js
  51. 1503 0
      components/wPicker/city-data/city.js
  52. 139 0
      components/wPicker/city-data/province.js
  53. 681 0
      components/wPicker/w-picker.js
  54. 1139 0
      components/wPicker/w-picker.vue
  55. 19 0
      config/app.js
  56. 32 0
      config/cache.js
  57. 8 0
      config/socket.js
  58. 911 0
      libs/CryptoJS.js
  59. 62 0
      libs/chat.js
  60. 78 0
      libs/login.js
  61. 19 0
      libs/order.js
  62. 141 0
      libs/routine.js
  63. 252 0
      libs/wechat.js
  64. 58 0
      main.js
  65. 100 0
      manifest.json
  66. 27 0
      mixins/SendVerifyCode.js
  67. 447 0
      package-lock.json
  68. 99 0
      pages.json
  69. 299 0
      pages/index/index.vue
  70. 42 0
      pages/my/index.vue
  71. 75 0
      pages/news/index.vue
  72. 57 0
      pages/not_defined/index.vue
  73. 182 0
      pages/product/detail.vue
  74. 230 0
      pages/product/index.vue
  75. 154 0
      pages/users/login/index.vue
  76. 320 0
      pages/users/login/index111.vue
  77. 330 0
      pages/users/register/index.vue
  78. 10 0
      plugin/animate/animate.min.css
  79. 973 0
      plugin/clipboard/clipboard.js
  80. 0 0
      plugin/dayjs/dayjs.min.js
  81. 0 0
      plugin/emoji-awesome/css/apple.min.css
  82. 0 0
      plugin/emoji-awesome/css/emojione.min.css
  83. 0 0
      plugin/emoji-awesome/css/facebook.min.css
  84. 0 0
      plugin/emoji-awesome/css/google.min.css
  85. 0 0
      plugin/emoji-awesome/css/messenger.min.css
  86. 0 0
      plugin/emoji-awesome/css/twitter.min.css
  87. BIN
      plugin/emoji-awesome/img/sheet_apple_64_indexed_256colors.png
  88. BIN
      plugin/emoji-awesome/img/sheet_emojione_64_indexed_128.png
  89. BIN
      plugin/emoji-awesome/img/sheet_facebook_64_indexed_128.png
  90. BIN
      plugin/emoji-awesome/img/sheet_google_64_indexed_128.png
  91. BIN
      plugin/emoji-awesome/img/sheet_messenger_64_indexed_128.png
  92. BIN
      plugin/emoji-awesome/img/sheet_twitter_64_indexed_128.png
  93. 147 0
      plugin/image-tools/index.js
  94. 0 0
      plugin/jweixin-module/index.js
  95. 179 0
      static/css/base.css
  96. 2 0
      static/css/guildford.css
  97. 291 0
      static/css/style.scss
  98. 3 0
      static/iconfont/iconfont.css
  99. BIN
      static/iconfont/iconfont.eot
  100. 22 0
      static/iconfont/iconfont.svg

+ 86 - 0
App.vue

@@ -0,0 +1,86 @@
+
+<script>
+	import { checkLogin } from "./libs/login";
+	import { HTTP_REQUEST_URL } from './config/app';
+
+	export default {
+		globalData: {
+			spid: 0,
+			code:0,
+			isLogin:false,
+			userInfo:{},
+			MyMenus:[]
+		 },
+		onLaunch: function(option) {
+			let that = this;
+			// #ifdef MP
+			 if (HTTP_REQUEST_URL==''){
+			      console.error("请配置根目录下的config.js文件中的 'HTTP_REQUEST_URL'\n\n请修改开发者工具中【详情】->【AppID】改为自己的Appid\n\n请前往后台【小程序】->【小程序配置】填写自己的 appId and AppSecret");
+			      return false;
+			    }
+			 if (option.query.hasOwnProperty('scene')){
+			      switch (option.scene) {
+			        //扫描小程序码
+			        case 1047:
+								let val = that.$util.getUrlParams(decodeURIComponent(option.query.scene));
+			          that.globalData.code = val.pid;
+			          break;
+			        //长按图片识别小程序码
+			        case 1048:
+			          that.globalData.code = option.query.scene;
+			          break;
+			        //手机相册选取小程序码
+			        case 1049:
+			          that.globalData.code = option.query.scene;
+			          break;
+			        //直接进入小程序
+			        case 1001:
+			          that.globalData.spid = option.query.scene;
+			          break;
+			      }
+			    }
+				// #endif
+			// 获取导航高度;
+			uni.getSystemInfo({
+			    success: function (res) {
+					that.globalData.navHeight = res.statusBarHeight * (750 / res.windowWidth) + 91;
+			    }
+			});
+		},
+		mounted() {
+		},
+		onHide: function() {
+			//console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	@import url("@/plugin/animate/animate.min.css");
+	@import 'static/css/base.css';
+	@import 'static/iconfont/iconfont.css';
+	@import 'static/iconfont/iconfont1.css';
+	@import 'static/css/guildford.css';
+	@import 'static/css/style.scss';
+	view{
+		box-sizing: border-box;
+	}
+	.bg-color-red {
+	  background-color: #e93323!important;
+	}
+	.syspadding{
+		padding-top: var(--status-bar-height);
+	}
+	.flex{
+		display: flex;
+	}
+	.uni-scroll-view::-webkit-scrollbar {
+		/* 隐藏滚动条,但依旧具备可以滚动的功能 */
+		display: none
+	}
+	::-webkit-scrollbar {
+	  width: 0;
+	  height: 0;
+	  color: transparent;
+	}
+</style>

+ 253 - 0
api/api.js

@@ -0,0 +1,253 @@
+import request from "@/utils/request.js";
+
+//获取首页数据 无需授权
+export function getIndexData()
+{
+	return request.get("index/getIndex",{},{ noAuth : true});
+}
+
+//公告列表
+export function getNotice()
+{
+	return request.post("index/newsList",{},{ noAuth : true});
+}
+
+//公告详情
+export function newsDetail(data)
+{
+	return request.post("index/news",data,{ noAuth : true});
+}
+
+//仓库列表
+export function getWarehouse()
+{
+	return request.get("pub/warehouse",{},{ noAuth : true});
+}
+
+//产品列表
+export function productList(data)
+{
+	return request.post("index/proList",data,{ noAuth : true});
+}
+
+//产品详情
+export function productDetail(data)
+{
+	return request.post("index/proItem",data,{ noAuth : true});
+}
+
+//推荐产品
+export function recommend()
+{
+	return request.post("index/proRand",{},{ noAuth : true});
+}
+
+//获取验证码
+export function registerVerify(data)
+{
+	return request.post("login/yzm",data,{ noAuth : true});
+}
+
+//注册一
+export function ApiReg1(data)
+{
+	return request.post("login/reg1",data,{ noAuth : true});
+}
+
+//注册二
+export function ApiReg2(data)
+{
+	return request.post("login/reg2",data,{ noAuth : true});
+}
+
+//登录
+export function loginApi(data)
+{
+	return request.post("login/l",data,{ noAuth : true});
+}
+
+/**
+ * 获取登录授权login
+ * 
+*/
+export function getLogo()
+{
+  return request.get('wechat/get_logo', {}, { noAuth : true});
+}
+
+
+/**
+ * 保存form_id
+ * @param string formId 
+ */
+export function setFormId(formId) {
+  return request.post("wechat/set_form_id", { formId: formId});
+}
+
+/**
+ * 领取优惠卷
+ * @param int couponId
+ * 
+*/
+export function setCouponReceive(couponId){
+  return request.post('coupon/receive', { couponId: couponId});
+}
+/**
+ * 优惠券列表
+ * @param object data
+*/
+export function getCoupons(data){
+  return request.get('coupons',data,{noAuth:true})
+}
+
+/**
+ * 我的优惠券
+ * @param int types 0全部  1未使用 2已使用
+*/
+export function getUserCoupons(types){
+  return request.get('coupons/user/'+types)
+}
+
+/**
+ * 文章分类列表
+ * 
+*/
+export function getArticleCategoryList(){
+  return request.get('article/category/list',{},{noAuth:true})
+}
+
+/**
+ * 文章列表
+ * @param int cid
+ * 
+*/
+export function getArticleList(cid,data){
+  return request.get('article/list/' + cid, data,{noAuth:true})
+}
+
+/**
+ * 文章 热门列表
+ * 
+*/
+export function getArticleHotList(){
+  return request.get('article/hot/list',{},{noAuth:true});
+}
+
+/**
+ * 文章 轮播列表
+ * 
+*/
+export function getArticleBannerList(){
+  return request.get('article/banner/list',{},{noAuth:true})
+}
+
+/**
+ * 文章详情
+ * @param int id 
+ * 
+*/
+export function getArticleDetails(id){
+  return request.get('article/details/'+id,{},{noAuth:true});
+}
+
+/**
+ * 手机号+验证码登录接口
+ * @param object data
+*/
+export function loginMobile(data){
+  return request.post('login/mobile',data,{noAuth:true})
+}
+
+
+
+/**
+ * 手机号注册
+ * @param object data
+ * 
+*/
+export function phoneRegister(data){
+  return request.post('register',data,{noAuth:true});
+}
+
+/**
+ * 手机号修改密码
+ * @param object data
+ * 
+*/
+export function phoneRegisterReset(data){
+  return request.post('register/reset',data,{noAuth:true})
+}
+
+/**
+ * 手机号+密码登录
+ * @param object data
+ * 
+*/
+export function phoneLogin(data){
+  return request.post('login',data,{noAuth:true})
+}
+
+/**
+ * 切换H5登录
+ * @param object data
+*/
+// #ifdef MP
+export function switchH5Login(){
+  return request.post('switch_h5', { 'from':'routine'});
+}
+// #endif
+
+/*
+ * h5切换公众号登陆
+ * */
+// #ifdef H5
+export function switchH5Login() {
+  return request.post("switch_h5", { 'from': "wechat" });
+}
+// #endif
+
+/**
+ * 绑定手机号
+ * 
+*/
+export function bindingPhone(data){
+  return request.post('binding',data);
+}
+
+/**
+ * 退出登錄
+ * 
+*/
+export function logout(){
+  return request.get('logout');
+}
+
+/**
+ * 获取订阅消息id
+ */
+export function getTemlIds()
+{
+  return request.get('wechat/teml_ids', {}, { noAuth:true});
+}
+
+/**
+ * 首页拼团数据
+ */
+export function pink()
+{
+  return request.get('pink', {}, { noAuth:true});
+}
+
+/**
+ * 获取城市信息
+ */
+export function getCity() {
+  return request.get('city_list', { }, { noAuth: true });
+}
+
+/**
+ * 获取小程序直播列表
+ */
+export function getLiveList(page,limit) {
+  return request.get('wechat/live', { page, limit}, { noAuth: true });
+}

+ 70 - 0
api/public.js

@@ -0,0 +1,70 @@
+import request from "@/utils/request.js";
+
+/**
+ * 获取微信sdk配置
+ * @returns {*}
+ */
+export function getWechatConfig() {
+  return request.get(
+    "wechat/config",
+    { url: document.location.href },
+    { noAuth: true }
+  );
+}
+
+/**
+ * 获取微信sdk配置
+ * @returns {*}
+ */
+export function wechatAuth(code, spread, login_type) {
+  return request.get(
+    "wechat/auth",
+    { code, spread, login_type },
+    { noAuth: true }
+  );
+}
+
+/**
+ * 获取登录授权login
+ * 
+*/
+export function getLogo()
+{
+  return request.get('wechat/get_logo', {}, { noAuth : true});
+}
+
+/**
+ * 小程序用户登录
+ * @param data object 小程序用户登陆信息
+ */
+export function login(data) {
+  return request.post("wechat/mp_auth", data, { noAuth : true });
+}
+/**
+ * 分享
+ * @returns {*}
+ */
+export function getShare() {
+  return request.get("share", {}, { noAuth: true });
+}
+
+/**
+ * 获取关注海报
+ * @returns {*}
+ */
+export function follow() {
+  return request.get("wechat/follow", {}, { noAuth: true });
+}
+
+/**
+ * 获取图片base64
+ * @retins {*}
+ * */
+export function imageBase64(image, code) {
+  return request.post(
+    "/image_base64",
+    { image: image, code: code },
+    { noAuth: true }
+  );
+}
+

+ 355 - 0
api/user.js

@@ -0,0 +1,355 @@
+import request from "@/utils/request.js";
+
+/**
+ * 获取用户信息
+ * 
+*/
+export function getUserInfo(){
+  return request.get('user');
+}
+
+/**
+ * 设置用户分享
+ * 
+*/
+export function userShare(){
+  return request.post('user/share');
+}
+
+/**
+ * h5用户登录
+ * @param data object 用户账号密码
+ */
+export function loginH5(data) {
+  return request.post("/login", data, { noAuth : true });
+}
+
+/**
+ * h5用户手机号登录
+ * @param data object 用户手机号 也只能
+ */
+export function loginMobile(data) {
+  return request.post("/login/mobile", data, { noAuth : true });
+}
+
+/**
+ * 验证码key
+ */
+export function getCodeApi() {
+  return request.get("verify_code", {}, { noAuth: true });
+}
+
+/**
+ * h5用户发送验证码
+ * @param data object 用户手机号
+ */
+export function registerVerify(data) {
+  return request.post("/register/verify", data, { noAuth : true });
+}
+
+/**
+ * h5用户手机号注册
+ * @param data object 用户手机号 验证码 密码
+ */
+export function register(data) {
+  return request.post("/register", data, { noAuth : true });
+}
+
+/**
+ * 用户手机号修改密码
+ * @param data object 用户手机号 验证码 密码
+ */
+export function registerReset(data) {
+  return request.post("/register/reset", data, { noAuth: true });
+}
+
+/**
+ * 获取用户中心菜单
+ *
+ */
+export function getMenuList() {
+  return request.get("menu/user");
+}
+
+/*
+ * 签到用户信息
+ * */
+export function postSignUser(sign) {
+  return request.post("sign/user", sign);
+}
+
+/**
+ * 获取签到配置
+ * 
+*/
+export function getSignConfig(){
+  return request.get('sign/config')
+}
+
+/**
+ * 获取签到列表
+ * @param object data
+*/
+export function getSignList(data){
+  return request.get('sign/list',data);
+}
+
+/**
+ * 用户签到
+*/
+export function setSignIntegral(){
+  return request.post('sign/integral')
+}
+
+/**
+ * 签到列表(年月)
+ * @param object data
+ * 
+*/
+export function getSignMonthList(data){
+  return request.get('sign/month',data)
+}
+
+/**
+ * 活动状态
+ * 
+*/
+export function userActivity(){
+  return request.get('user/activity');
+}
+
+/*
+ * 资金明细(types|0=全部,1=消费,2=充值,3=返佣,4=提现)
+ * */
+export function getCommissionInfo(q, types) {
+  return request.get("spread/commission/" + types, q);
+}
+
+/*
+ * 积分记录
+ * */
+export function getIntegralList(q) {
+  return request.get("integral/list", q);
+}
+
+/**
+ * 获取分销海报图片
+ * 
+*/
+export function spreadBanner(){
+	//#ifdef H5
+	return request.get('spread/banner',{type:2});
+	//#endif
+	//#ifdef MP
+	 return request.get('spread/banner',{type:1});
+	//#endif
+
+}
+
+/**
+ *
+ * 获取推广用户一级和二级
+ * @param object data
+*/
+export function spreadPeople(data){
+  return request.post('spread/people',data);
+}
+
+/**
+ * 
+ * 推广佣金/提现总和
+ * @param int type
+*/
+export function spreadCount(type){
+  return request.get('spread/count/'+type);
+}
+
+/*
+ * 推广数据
+ * */
+export function getSpreadInfo() {
+  return request.get("/commission");
+}
+
+
+/**
+ * 
+ * 推广订单
+ * @param object data
+*/
+export function spreadOrder(data){
+  return request.post('spread/order',data);
+}
+
+/*
+ * 获取推广人排行
+ * */
+export function getRankList(q) {
+  return request.get("rank", q);
+}
+
+/*
+ * 获取佣金排名
+ * */
+export function getBrokerageRank(q) {
+  return request.get("brokerage_rank", q);
+}
+
+/**
+ * 提现申请
+ * @param object data
+*/
+export function extractCash(data){
+  return request.post('extract/cash',data)
+}
+
+/**
+ * 提现银行/提现最低金额
+ * 
+*/
+export function extractBank(){
+  return request.get('extract/bank');
+}
+
+/**
+ * 会员等级列表
+ * 
+*/
+export function userLevelGrade(){
+  return request.get('user/level/grade');
+}
+
+/**
+ * 获取某个等级任务
+ * @param int id 任务id
+*/
+export function userLevelTask(id){
+  return request.get('user/level/task/'+id);
+}
+
+/**
+ * 检查用户是否可以成为会员
+ * 
+*/
+export function userLevelDetection(){
+  return request.get('user/level/detection');
+}
+
+/**
+ * 
+ * 地址列表
+ * @param object data
+*/
+export function getAddressList(data){
+  return request.get('address/list',data);
+}
+
+/**
+ * 设置默认地址
+ * @param int id
+*/
+export function setAddressDefault(id){
+  return request.post('address/default/set',{id:id})
+}
+
+/**
+ * 修改 添加地址
+ * @param object data
+*/
+export function editAddress(data){
+  return request.post('address/edit',data);
+}
+
+/**
+ * 删除地址
+ * @param int id
+ * 
+*/
+export function delAddress(id){
+  return request.post('address/del',{id:id})
+}
+
+/**
+ * 获取单个地址
+ * @param int id 
+*/
+export function getAddressDetail(id){
+  return request.get('address/detail/'+id);
+}
+
+/**
+ * 修改用户信息
+ * @param object
+*/
+export function userEdit(data){
+  return request.post('user/edit',data);
+}
+
+export function userUpdate(data){
+  return request.post('user/update',data);
+}
+
+/*
+ * 退出登录
+ * */
+export function getLogout() {
+  return request.get("logout");
+}
+/**
+ * 小程序充值
+ * 
+*/
+export function rechargeRoutine(data){
+  return request.post('recharge/routine',data)
+}
+/*
+ * 公众号充值
+ * */
+export function rechargeWechat(data) {
+  return request.post("recharge/wechat", data);
+}
+/**
+ * 获取默认地址
+ * 
+*/
+export function getAddressDefault(){
+  return request.get('address/default');
+}
+
+/**
+ * 充值金额选择
+ */
+export function getRechargeApi() {
+  return request.get("recharge/index");
+}
+
+/**
+ * 登陆记录
+ */
+export function setVisit(data)
+{
+  return request.post('user/set_visit', {...data}, { noAuth:true});
+}
+
+/**
+ * 客服列表
+ */
+export function serviceList() {
+  return request.get("user/service/list");
+}
+/**
+ * 客服详情
+ */
+export function getChatRecord(to_uid, data) {
+  return request.get("user/service/record/" + to_uid, data);
+}
+
+/**
+ * 静默绑定推广人
+ * @param {Object} puid
+ */
+export function spread(puid)
+{
+	return request.post("user/spread",{puid:puid});
+}
+

+ 139 - 0
components/Authorize.vue

@@ -0,0 +1,139 @@
+<template>
+	<view>
+		<view class='Popup' v-if='isShowAuth'>
+		   <image :src='logoUrl'></image>
+		   <view class='title'>授权提醒</view>
+		   <view class='tip'>请授权头像等信息,以便为您提供更好的服务</view>
+		   <view class='bottom flex'>
+		      <view class='item' @click='close'>随便逛逛</view>
+			  <!-- #ifdef APP-PLUS -->
+			  <button class='item grant' @click="setUserInfo">去授权</button>
+			  <!-- #endif -->
+			  <!-- #ifdef MP -->
+			  <button class='item grant'  type="primary" open-type="getUserInfo" lang="zh_CN" @getuserinfo="setUserInfo">去授权</button>
+			  <!-- #endif -->
+		   </view>
+		</view>
+		<view class='mask' v-if='isShowAuth' @click='close'></view>
+	</view>
+</template>
+
+<script>
+	const app = getApp();
+	import Cache from '../utils/cache';
+	import { getLogo } from '../api/public';
+	import { LOGO_URL } from '../config/cache';
+	import { mapGetters } from 'vuex';
+	import Routine from '../libs/routine';
+	
+	export default {
+		name:'Authorize',
+		props:{
+			isAuto:{
+				type:Boolean,
+				default:true
+			},
+			isGoIndex:{
+				type:Boolean,
+				default:true
+			},
+			isShowAuth:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data(){
+			return {
+				logoUrl:''
+			}
+		},
+		computed:mapGetters(['isLogin','userInfo']),
+		watch:{
+			isLogin(n){
+				n === true && this.$emit('onLoadFun',this.userInfo);
+			}
+		},
+		created() {
+			this.getLogoUrl();
+			this.setAuthStatus();
+		},
+		methods:{
+			setAuthStatus(){
+				Routine.authorize().then(res=>{
+					if(res.islogin === false)
+						this.setUserInfo();
+					else
+						this.$emit('onLoadFun',this.userInfo);
+				}).catch(res=>{
+					if (this.isAuto) 
+						this.$emit('authColse',true);
+				})
+			},
+			getUserInfo(code){
+				Routine.getUserInfo().then(res=>{
+					let userInfo = res.userInfo
+					userInfo.code = code;
+					userInfo.spread_spid = app.globalData.spid;//获取推广人ID
+					userInfo.spread_code = app.globalData.code;//获取推广人分享二维码ID
+					Routine.authUserInfo(userInfo).then(res=>{
+						uni.hideLoading();
+						this.$emit('authColse',false);
+						this.$emit('onLoadFun',this.userInfo);
+					}).catch(res=>{
+						uni.hideLoading();
+						uni.showToast({
+							title:res.msg,
+							icon:'none',
+							duration:2000
+						});
+					})
+				}).catch(res =>{
+					uni.hideLoading();
+				})
+			},
+			setUserInfo(){
+				uni.showLoading({title:'正在登陆中'});
+				Routine.getCode().then(code=>{
+					this.getUserInfo(code);
+				}).catch(res=>{
+					uni.hideLoading();
+				})
+			},
+			getLogoUrl(){
+				let that = this;
+				if (Cache.has(LOGO_URL)) {
+					this.logoUrl = Cache.get(LOGO_URL);
+					return;
+				}
+				getLogo().then(res=>{
+					that.logoUrl = res.data.logo_url
+					Cache.set(LOGO_URL,that.logoUrl);
+				})
+			},
+			close(){
+				let pages = getCurrentPages(), currPage  = pages[pages.length - 1];
+				if(this.isGoIndex){
+					uni.switchTab({url:'/pages/index/index'});
+				} else {
+					this.$emit('authColse',false);
+				}
+				// if (currPage && currPage.isShowAuth != undefined){
+				// 	currPage.isShowAuth = true;
+				// }
+			},
+		}
+	}
+</script>
+
+<style scoped lang='scss'>
+	.Popup{width:500rpx;background-color:#fff;position:fixed;top:50%;left:50%;margin-left:-250rpx;transform:translateY(-50%);z-index:320;}
+	.Popup image{width:150rpx;height:150rpx;margin:-67rpx auto 0 auto;display:block;border: 8rpx solid #fff;border-radius: 50%}
+	.Popup .title{font-size:28rpx;color:#000;text-align:center;margin-top: 30rpx}
+	.Popup .tip{font-size:22rpx;color:#555;padding:0 24rpx;margin-top:25rpx;}
+	.Popup .bottom .item{width:50%;height:80rpx;background-color:#eeeeee;text-align:center;line-height:80rpx;font-size:24rpx;color:#666;margin-top:54rpx;}
+	.Popup .bottom .item.on{width: 100%}
+	.flex{display:flex;}
+	.Popup .bottom .item.grant{font-size:28rpx;color:#fff;font-weight:bold;background-color:#e93323;border-radius:0;padding:0;}
+	.mask{position:fixed;top:0;right:0;left:0;bottom:0;background-color:rgba(0,0,0,0.65);z-index:310;}
+	
+</style>

+ 57 - 0
components/Loading/index.vue

@@ -0,0 +1,57 @@
+<template>
+	<view>
+		<view class="Loads acea-row row-center-wrapper" v-if="loading && !loaded" style="margin-top: .2rem;">
+			<view v-if="loading">
+				<view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view>
+				正在加载中
+			</view>
+			<view v-else>
+				上拉加载更多
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "Loading",
+		props: {
+			loaded: {
+				type: Boolean,
+				default: false
+			},
+			loading: {
+				type: Boolean,
+				default: false
+			}
+		}
+	};
+</script>
+<style>
+	.Loads {
+	  height: 80upx;
+	  font-size: 25upx;
+	  color: #000;
+	}
+	.Loads .iconfont {
+	  font-size: 30upx;
+	  margin-right: 10upx;
+	  height: 32upx;
+	  line-height: 32upx;
+	}
+	/*加载动画*/
+	@keyframes load {
+	  from {
+	    transform: rotate(0deg);
+	  }
+	  to {
+	    transform: rotate(360deg);
+	  }
+	}
+	.loadingpic {
+	  animation: load 3s linear 1s infinite;
+	}
+	.loading {
+	  animation: load linear 1s infinite;
+	}
+</style>

+ 173 - 0
components/PriceChange/index.vue

@@ -0,0 +1,173 @@
+<template>
+  <view>
+    <view class="priceChange" :class="change === true ? 'on' : ''">
+      <view class="priceTitle">
+        {{
+          status == 0
+            ? orderInfo.refund_status === 1
+              ? "立即退款"
+              : "一键改价"
+            : "订单备注"
+        }}
+        <span class="iconfont icon-guanbi" @click="close"></span>
+      </view>
+      <view class="listChange" v-if="status == 0">
+        <view
+          class="item acea-row row-between-wrapper"
+          v-if="orderInfo.refund_status === 0"
+        >
+          <view>商品总价(¥)</view>
+          <view class="money">
+            {{ orderInfo.total_price }}<span class="iconfont icon-suozi"></span>
+          </view>
+        </view>
+        <view
+          class="item acea-row row-between-wrapper"
+          v-if="orderInfo.refund_status === 0"
+        >
+          <view>原始邮费(¥)</view>
+          <view class="money">
+            {{ orderInfo.pay_postage }}<span class="iconfont icon-suozi"></span>
+          </view>
+        </view>
+        <view
+          class="item acea-row row-between-wrapper"
+          v-if="orderInfo.refund_status === 0"
+        >
+          <view>实际支付(¥)</view>
+          <view class="money">
+            <input
+              type="text"
+              v-model="price"
+              :class="focus === true ? 'on' : ''"
+              @focus="priceChange"
+            />
+          </view>
+        </view>
+        <view
+          class="item acea-row row-between-wrapper"
+          v-if="orderInfo.refund_status === 1"
+        >
+          <view>实际支付(¥)</view>
+          <view class="money">
+            {{ orderInfo.pay_price }}<span class="iconfont icon-suozi"></span>
+          </view>
+        </view>
+        <view
+          class="item acea-row row-between-wrapper"
+          v-if="orderInfo.refund_status === 1"
+        >
+          <view>退款金额(¥)</view>
+          <view class="money">
+            <input
+              type="text"
+              v-model="refund_price"
+              :class="focus === true ? 'on' : ''"
+              @focus="priceChange"
+            />
+          </view>
+        </view>
+      </view>
+      <view class="listChange" v-else>
+        <textarea
+          :placeholder="
+            orderInfo.remark ? orderInfo.remark : '请填写备注信息...'
+          "
+          v-model="remark"
+        ></textarea>
+      </view>
+      <view class="modify" @click="save">
+        {{
+          status === 1 || orderInfo.refund_status == 0 ? "立即修改" : "确认退款"
+        }}
+      </view>
+      <view
+        class="modify1"
+        @click="refuse"
+        v-if="orderInfo.refund_status == 1 && status == 0"
+      >
+        拒绝退款
+      </view>
+    </view>
+    <view class="mask" @touchmove.prevent v-show="change === true"></view>
+  </view>
+</template>
+<style>
+.priceChange{position:fixed;width:580upx;height:670upx;background-color:#fff;border-radius:10upx;top:50%;left:50%;margin-left:-290upx;margin-top:-335upx;z-index:666;transition:all 0.3s ease-in-out 0s;transform: scale(0);opacity:0;}
+.priceChange.on{opacity:1;transform: scale(1);}
+.priceChange .priceTitle{background:url("~@/static/images/pricetitle.jpg") no-repeat;background-size:100% 100%;width:100%;height:160upx;border-radius:10upx 10upx 0 0;text-align:center;font-size:40upx;color:#fff;line-height:160upx;position:relative;}
+.priceChange .priceTitle .iconfont{position:absolute;font-size:40upx;right:26upx;top:23upx;width:40upx;height:40upx;line-height:40upx;}
+.priceChange .listChange{padding:0 40upx;}
+.priceChange .listChange textarea{box-sizing: border-box;}
+.priceChange .listChange .item{height:103upx;border-bottom:1px solid #e3e3e3;font-size:32upx;color:#333;}
+.priceChange .listChange .item .money{color:#666;width:300upx;text-align:right;}
+.priceChange .listChange .item .money .iconfont{font-size:32upx;margin-left:20upx;}
+.priceChange .listChange .item .money input{width:100%;height:100%;text-align:right;color:#ccc;}
+.priceChange .listChange .item .money input.on{color:#666;}
+.priceChange .modify{font-size:32upx;color:#fff;width:490upx;height:90upx;text-align:center;line-height:90upx;border-radius:45upx;background-color:#2291f8;margin:53upx auto 0 auto;}
+.priceChange .modify1{font-size:32upx;color:#312b2b;width:490upx;height:90upx;text-align:center;line-height:90upx;border-radius:45upx;background-color:#eee;margin:30upx auto 0 auto;}
+.priceChange .listChange textarea {
+  border: 1px solid #eee;
+  width: 100%;
+  height: 200upx;
+  margin-top: 50upx;
+  border-radius: 10upx;
+  color: #333;
+  padding: 20upx;
+}
+</style>
+<script>
+export default {
+  name: "PriceChange",
+  components: {},
+  props: {
+    change: Boolean,
+    orderInfo: Object,
+    status: String
+  },
+  data: function() {
+    return {
+      focus: false,
+      price: 0,
+      refund_price: 0,
+      remark: ""
+    };
+  },
+  watch: {
+    orderInfo: function(nVal) {
+      this.price = this.orderInfo.pay_price;
+      this.refund_price = this.orderInfo.pay_price;
+      this.remark = "";
+    }
+  },
+  mounted: function() {
+	},
+  methods: {
+    priceChange: function() {
+      this.focus = true;
+    },
+    close: function() {
+      this.price = this.orderInfo.pay_price;
+      this.$emit("closechange", false);
+    },
+    save: function() {
+      let that = this;
+      that.$emit("savePrice", {
+        price: that.price,
+        refund_price: that.refund_price,
+        type: 1,
+        remark: that.remark
+      });
+    },
+    refuse: function() {
+      let that = this;
+      that.$emit("savePrice", {
+        price: that.price,
+        refund_price: that.refund_price,
+        type: 2,
+        remark: that.remark
+      });
+    }
+  }
+};
+</script>

+ 185 - 0
components/adc/index.vue

@@ -0,0 +1,185 @@
+<template>
+	<view>
+		<view class="address-window" :class="address.address==true?'on':''">
+			<view class='title'>选择地址<text class='iconfont icon-guanbi' @tap='close'></text></view>
+			<view class='list'>
+				<view class='item acea-row row-between-wrapper' :class='active==index?"font-color":""' v-for="(item,index) in addressList"
+				 @tap='tapAddress(index,item.id)' :key='index'>
+					<text class='iconfont icon-ditu' :class='active==index?"font-color":""'></text>
+					<view class='address'>
+						<view class='name' :class='active==index?"font-color":""'>{{item.real_name}}<text class='phone'>{{item.phone}}</text></view>
+						<view class='line1'>{{item.province}}{{item.city}}{{item.district}}{{item.detail}}</view>
+					</view>
+					<text class='iconfont icon-complete' :class='active==index?"font-color":""'></text>
+				</view>
+			</view>
+			<!-- 无地址 -->
+			<view class='pictrue' v-if="!is_loading && !addressList.length">
+				<image src='../../static/images/noAddress.png'></image>
+			</view>
+			<view class='addressBnt bg-color' @tap='goAddressPages'>选择其地址</view>
+		</view>
+		<view class='mask' catchtouchmove="true" :hidden='address.address==false' @tap='close'></view>
+	</view>
+</template>
+
+<script>
+	import {
+		getAddressList
+	} from '@/api/user.js';
+	export default {
+		props: {
+			pagesUrl: {
+				type: String,
+				default: '',
+			},
+			address: {
+				type: Object,
+				default: function() {
+					return {
+						address: true,
+						addressId: 0,
+					};
+				}
+			},
+			isLog: {
+				type: Boolean,
+				default: false,
+			},
+		},
+		data() {
+			return {
+				active: 0,
+				//地址列表
+				addressList: [],
+				is_loading: true
+			};
+		},
+
+		methods: {
+			tapAddress: function(e, addressid) {
+				this.active = e;
+				this.$emit('OnChangeAddress', addressid);
+			},
+			close: function() {
+				this.$emit('changeClose');
+				this.$emit('changeTextareaStatus');
+			},
+			goAddressPages: function() {
+				this.$emit('changeClose');
+				this.$emit('changeTextareaStatus');
+				uni.navigateTo({
+					url: this.pagesUrl
+				});
+
+			},
+			getAddressList: function() {
+				let that = this;
+				getAddressList({
+					page: 1,
+					limit: 5
+				}).then(res => {
+					let addressList = res.data;
+					//处理默认选中项
+					for (let i = 0, leng = addressList.length; i < leng; i++) {
+						if (addressList[i].id == that.address.addressId) {
+							that.active = i;
+						}
+					}
+					that.$set(that, 'addressList', addressList);
+					that.is_loading = false;
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.address-window {
+		background-color: #fff;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		z-index: 101;
+		transform: translate3d(0, 100%, 0);
+		transition: all .3s cubic-bezier(.25, .5, .5, .9);
+	}
+
+	.address-window.on {
+		transform: translate3d(0, 0, 0);
+	}
+
+	.address-window .title {
+		font-size: 32rpx;
+		font-weight: bold;
+		text-align: center;
+		height: 123rpx;
+		line-height: 123rpx;
+		position: relative;
+	}
+
+	.address-window .title .iconfont {
+		position: absolute;
+		right: 30rpx;
+		color: #8a8a8a;
+		font-size: 35rpx;
+	}
+
+	.address-window .list .item {
+		margin-left: 30rpx;
+		padding-right: 30rpx;
+		border-bottom: 1px solid #eee;
+		height: 129rpx;
+		font-size: 25rpx;
+		color: #333;
+	}
+
+	.address-window .list .item .iconfont {
+		font-size: 37rpx;
+		color: #2c2c2c;
+	}
+
+	.address-window .list .item .iconfont.icon-complete {
+		font-size: 30rpx;
+		color: #fff;
+	}
+
+	.address-window .list .item .address {
+		width: 560rpx;
+	}
+
+	.address-window .list .item .address .name {
+		font-size: 28rpx;
+		font-weight: bold;
+		color: #282828;
+		margin-bottom: 4rpx;
+	}
+
+	.address-window .list .item .address .name .phone {
+		margin-left: 18rpx;
+	}
+
+	.address-window .addressBnt {
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #fff;
+		width: 690rpx;
+		height: 86rpx;
+		border-radius: 43rpx;
+		text-align: center;
+		line-height: 86rpx;
+		margin: 85rpx auto;
+	}
+
+	.address-window .pictrue {
+		width: 414rpx;
+		height: 336rpx;
+		margin: 0 auto;
+	}
+
+	.address-window .pictrue image {
+		width: 100%;
+		height: 100%;
+	}
+</style>

+ 184 - 0
components/addressWindow/index.vue

@@ -0,0 +1,184 @@
+<template>
+	<view>
+		<view class="address-window" :class="address.address==true?'on':''">
+			<view class='title'>选择地址<text class='iconfont icon-guanbi' @tap='close'></text></view>
+			<view class='list'>
+				<view class='item acea-row row-between-wrapper' :class='active==index?"font-color":""' v-for="(item,index) in addressList"
+				 @tap='tapAddress(index,item.id)' :key='index'>
+					<text class='iconfont icon-ditu' :class='active==index?"font-color":""'></text>
+					<view class='address'>
+						<view class='name' :class='active==index?"font-color":""'>{{item.real_name}}<text class='phone'>{{item.phone}}</text></view>
+						<view class='line1'>{{item.province}}{{item.city}}{{item.district}}{{item.detail}}</view>
+					</view>
+					<text class='iconfont icon-complete' :class='active==index?"font-color":""'></text>
+				</view>
+			</view>
+			<!-- 无地址 -->
+			<view class='pictrue' v-if="!is_loading && !addressList.length">
+				<image src='../../static/images/noAddress.png'></image>
+			</view>
+			<view class='addressBnt bg-color' @tap='goAddressPages'>选择其地址</view>
+		</view>
+		<view class='mask' catchtouchmove="true" :hidden='address.address==false' @tap='close'></view>
+	</view>
+</template>
+
+<script>
+	import {
+		getAddressList
+	} from '@/api/user.js';
+	export default {
+		props: {
+			pagesUrl: {
+				type: String,
+				default: '',
+			},
+			address: {
+				type: Object,
+				default: function() {
+					return {
+						address: true,
+						addressId: 0,
+					};
+				}
+			},
+			isLog: {
+				type: Boolean,
+				default: false,
+			},
+		},
+		data() {
+			return {
+				active: 0,
+				//地址列表
+				addressList: [],
+				is_loading: true
+			};
+		},
+
+		methods: {
+			tapAddress: function(e, addressid) {
+				this.active = e;
+				this.$emit('OnChangeAddress', addressid);
+			},
+			close: function() {
+				this.$emit('changeClose');
+				this.$emit('changeTextareaStatus');
+			},
+			goAddressPages: function() {
+				this.$emit('changeClose');
+				this.$emit('changeTextareaStatus');
+				uni.navigateTo({
+					url: this.pagesUrl
+				});
+			},
+			getAddressList: function() {
+				let that = this;
+				getAddressList({
+					page: 1,
+					limit: 5
+				}).then(res => {
+					let addressList = res.data;
+					//处理默认选中项
+					for (let i = 0, leng = addressList.length; i < leng; i++) {
+						if (addressList[i].id == that.address.addressId) {
+							that.active = i;
+						}
+					}
+					that.$set(that, 'addressList', addressList);
+					that.is_loading = false;
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.address-window {
+		background-color: #fff;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		z-index: 101;
+		transform: translate3d(0, 100%, 0);
+		transition: all .3s cubic-bezier(.25, .5, .5, .9);
+	}
+
+	.address-window.on {
+		transform: translate3d(0, 0, 0);
+	}
+
+	.address-window .title {
+		font-size: 32rpx;
+		font-weight: bold;
+		text-align: center;
+		height: 123rpx;
+		line-height: 123rpx;
+		position: relative;
+	}
+
+	.address-window .title .iconfont {
+		position: absolute;
+		right: 30rpx;
+		color: #8a8a8a;
+		font-size: 35rpx;
+	}
+
+	.address-window .list .item {
+		margin-left: 30rpx;
+		padding-right: 30rpx;
+		border-bottom: 1px solid #eee;
+		height: 129rpx;
+		font-size: 25rpx;
+		color: #333;
+	}
+
+	.address-window .list .item .iconfont {
+		font-size: 37rpx;
+		color: #2c2c2c;
+	}
+
+	.address-window .list .item .iconfont.icon-complete {
+		font-size: 30rpx;
+		color: #fff;
+	}
+
+	.address-window .list .item .address {
+		width: 560rpx;
+	}
+
+	.address-window .list .item .address .name {
+		font-size: 28rpx;
+		font-weight: bold;
+		color: #282828;
+		margin-bottom: 4rpx;
+	}
+
+	.address-window .list .item .address .name .phone {
+		margin-left: 18rpx;
+	}
+
+	.address-window .addressBnt {
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #fff;
+		width: 690rpx;
+		height: 86rpx;
+		border-radius: 43rpx;
+		text-align: center;
+		line-height: 86rpx;
+		margin: 85rpx auto;
+	}
+
+	.address-window .pictrue {
+		width: 414rpx;
+		height: 336rpx;
+		margin: 0 auto;
+	}
+
+	.address-window .pictrue image {
+		width: 100%;
+		height: 100%;
+	}
+</style>

+ 120 - 0
components/countDown/index.vue

@@ -0,0 +1,120 @@
+<template>
+	<view class="time" :style="justifyLeft">
+		<text class="red" v-if="tipText">{{ tipText }}</text>
+		<text class="styleAll" v-if="isDay === true">{{ day }}</text>
+		<text class="timeTxt red" v-if="dayText">{{ dayText }}</text>
+		<text class="styleAll">{{ hour }}</text>
+		<text class="timeTxt red" v-if="hourText">{{ hourText }}</text>
+		<text class="styleAll">{{ minute }}</text>
+		<text class="timeTxt red" v-if="minuteText">{{ minuteText }}</text>
+		<text class="styleAll">{{ second }}</text>
+		<text class="timeTxt red" v-if="secondText">{{ secondText }}</text>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "countDown",
+		props: {
+			justifyLeft: {
+				type: String,
+				default: ""
+			},
+			//距离开始提示文字
+			tipText: {
+				type: String,
+				default: "倒计时"
+			},
+			dayText: {
+				type: String,
+				default: "天"
+			},
+			hourText: {
+				type: String,
+				default: "时"
+			},
+			minuteText: {
+				type: String,
+				default: "分"
+			},
+			secondText: {
+				type: String,
+				default: "秒"
+			},
+			datatime: {
+				type: Number,
+				default: 0
+			},
+			isDay: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data: function() {
+			return {
+				day: "00",
+				hour: "00",
+				minute: "00",
+				second: "00"
+			};
+		},
+		created: function() {
+			this.show_time();
+		},
+		mounted: function() {},
+		methods: {
+			show_time: function() {
+				let that = this;
+
+				function runTime() {
+					//时间函数
+					let intDiff = that.datatime - Date.parse(new Date()) / 1000; //获取数据中的时间戳的时间差;
+					let day = 0,
+						hour = 0,
+						minute = 0,
+						second = 0;
+					if (intDiff > 0) {
+						//转换时间
+						if (that.isDay === true) {
+							day = Math.floor(intDiff / (60 * 60 * 24));
+						} else {
+							day = 0;
+						}
+						hour = Math.floor(intDiff / (60 * 60)) - day * 24;
+						minute = Math.floor(intDiff / 60) - day * 24 * 60 - hour * 60;
+						second =
+							Math.floor(intDiff) -
+							day * 24 * 60 * 60 -
+							hour * 60 * 60 -
+							minute * 60;
+						if (hour <= 9) hour = "0" + hour;
+						if (minute <= 9) minute = "0" + minute;
+						if (second <= 9) second = "0" + second;
+						that.day = day;
+						that.hour = hour;
+						that.minute = minute;
+						that.second = second;
+					} else {
+						that.day = "00";
+						that.hour = "00";
+						that.minute = "00";
+						that.second = "00";
+					}
+				}
+				runTime();
+				setInterval(runTime, 1000);
+			}
+		}
+	};
+</script>
+
+<style>
+	.time{
+		display: flex;
+		justify-content: center;
+	} 
+	.red{
+		color: #fc4141;
+		margin: 0 4rpx;
+	}
+</style>

+ 107 - 0
components/couponListWindow/index.vue

@@ -0,0 +1,107 @@
+<template>
+	<view>
+		<view class='coupon-list-window' :class='coupon.coupon==true?"on":""'>
+		   <view class='title'>优惠券<text class='iconfont icon-guanbi' @click='close'></text></view>
+		   <view class='coupon-list' v-if="coupon.list.length">
+		      <view class='item acea-row row-center-wrapper' v-for="(item,index) in coupon.list" @click="getCouponUser(index,item.id)" :key='index'>
+		        <view class='money acea-row row-column row-center-wrapper' :class='item.is_use?"moneyGray":""'>
+					<view>¥<text class='num'>{{item.coupon_price}}</text></view>
+					<view class="pic-num">满{{item.use_min_price}}元可用</view>
+				</view>
+		        <view class='text'>
+					 <view class='condition line1'>
+					    <span class='line-title' :class='item.is_use?"gray":""' v-if='item.type===0'>通用劵</span>
+					    <span class='line-title' :class='item.is_use?"gray":""' v-else-if='item.type===1'>品类券</span>
+					    <span class='line-title' :class='item.is_use?"gray":""' v-else>商品券</span>
+					    <span>{{item.title}}</span>
+					</view>
+		            <view class='data acea-row row-between-wrapper'>
+		              <view>{{ item.start_time ? item.start_time + "-" : ""}}{{ item.end_time }}</view>
+		              <view class='bnt gray' v-if="item.is_use">{{item.use_title || '已领取'}}</view>
+		              <view class='bnt bg-color' v-else>{{coupon.statusTile || '立即领取'}}</view>
+		            </view>
+		        </view>
+		      </view>
+		   </view>
+		   <!-- 无优惠券 -->
+		   <view class='pictrue' v-else><image src='../../static/images/noCoupon.png'></image></view>
+		</view>
+		<view class='mask' catchtouchmove="true" :hidden='coupon.coupon==false' @click='close'></view>
+	</view>
+</template>
+
+<script>
+	import { setCouponReceive } from '@/api/api.js';
+	export default {
+		props: {
+			//打开状态 0=领取优惠券,1=使用优惠券
+			 openType: {
+			      type: Number,
+			      default: 0,
+			    },
+			    coupon: {
+					type: Object,
+					default: function(){
+						return {};
+					}
+			    }
+		},
+		data() {
+			return {
+	
+			};
+		},
+		
+		methods: {
+			 close: function () {
+			      this.$emit('ChangCouponsClone');
+			    },
+			    getCouponUser:function(index,id){
+			      let that = this;
+			      let list = that.coupon.list;
+			      if (list[index].is_use == true && this.openType==0) return true;
+			      switch (this.openType){
+			        case 0:
+			          //领取优惠券
+			          setCouponReceive(id).then(res=>{
+						  that.$emit('ChangCouponsUseState', index);
+						  that.$util.Tips({title: "领取成功"});
+						  that.$emit('ChangCoupons', list[index]);
+			          })
+			        break;
+			        case 1:
+			          that.$emit('ChangCoupons',index);
+			        break;
+			      }
+			    }
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.coupon-list-window{position:fixed;bottom:0;left:0;width:100%;background-color:#f5f5f5;border-radius:16rpx 16rpx 0 0;z-index:555;transform:translate3d(0,100%,0);transition:all .3s cubic-bezier(.25,.5,.5,.9);}
+	.coupon-list-window.on{transform:translate3d(0,0,0);}
+	.coupon-list-window .title{height:124rpx;width:100%;text-align:center;line-height:124rpx;font-size:32rpx;font-weight:bold;position:relative;}
+	.coupon-list-window .title .iconfont{position:absolute;right:30rpx;top:50%;transform:translateY(-50%);font-size:35rpx;color:#8a8a8a;font-weight:normal;}
+	.coupon-list-window .coupon-list{margin:0 0 50rpx 0;height:550rpx;overflow:auto;}
+	.coupon-list-window .pictrue{width:414rpx;height:336rpx;margin:0 auto 50rpx auto;}
+	.coupon-list-window .pictrue image{width:100%;height:100%;}
+	.pic-num{color: #fff;font-size: 24rpx;}
+	.line-title{
+	  width:90rpx;
+	  padding: 0 10rpx;
+	  box-sizing: border-box;
+	  background:rgba(255,247,247,1);
+	  border:1px solid rgba(232,51,35,1);
+	  opacity:1;
+	  border-radius:20rpx;
+	  font-size:20rpx;
+	  color: #E83323;
+	  margin-right: 12rpx;
+	}
+	.line-title.gray{
+	  border-color:#BBB;
+	  color:#bbb;
+	  background-color:#F5F5F5;
+	}
+</style>

+ 173 - 0
components/couponListWindow/备份.vue

@@ -0,0 +1,173 @@
+<template>
+	<view>
+		<view class='coupon-list-window' :class='coupon.coupon==true?"on":""'>
+			<view class='title'>优惠券<text class='iconfont icon-guanbi' @click='close'></text></view>
+			<view class='coupon-list' v-if="coupon.list.length">
+				<view class='item acea-row row-center-wrapper' v-for="(item,index) in coupon.list" @click="getCouponUser(index,item)"
+				 :key='index'>
+					<view class='money'>
+						<div>
+							¥<span class="num">{{ item.coupon_price }}</span>
+						</div>
+						<div class="pic-num">满{{ item.use_min_price }}元可用</div>
+					</view>
+					<view class='text'>
+						<view class='condition line1'>
+							<span class="line-title" v-if="item.type === 0">通用劵</span>
+							<span class="line-title" v-else-if="item.type === 1">品类券</span>
+							<span class="line-title" v-else>商品券</span>
+							<span>{{ item.title }}</span>
+						</view>
+						<view class='data acea-row row-between-wrapper'>
+							<view>{{ item.start_time ? item.start_time + "-" : ""}}{{ item.end_time }}</view>
+							<view class="iconfont icon-xuanzhong1 font-color-red" v-if="checked.id === item.id"></view>
+							<view v-else class="iconfont icon-weixuanzhong"></view v-else>
+							<!-- <view class='bnt gray' v-if="item.is_use">{{item.use_title || '已领取'}}</view>
+							<view class='bnt bg-color' v-else>{{coupon.statusTile || '立即领取'}}</view> -->
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- 无优惠券 -->
+			<view class='pictrue' v-else>
+				<image src='/static/images/noCoupon.png'></image>
+			</view>
+		</view>
+		<view class='mask' catchtouchmove="true" :hidden='coupon.coupon==false' @click='close'></view>
+	</view>
+</template>
+
+<script>
+	import {
+		setCouponReceive
+	} from '@/api/api.js';
+	export default {
+		props: {
+			//打开状态 0=领取优惠券,1=使用优惠券
+			openType: {
+				type: Number,
+				default: 0,
+			},
+			coupon: {
+				type: Object,
+				default: function() {
+					return {};
+				}
+			},
+			checked:{
+				type: Object,
+				default: function() {
+					return {};
+				}
+			},
+		},
+		data() {
+			return {
+
+			};
+		},
+
+		methods: {
+			close: function() {
+				this.$emit('ChangCouponsClone');
+			},
+			getCouponUser: function(index, item) {
+				let that = this;
+				let list = that.coupon.list;
+				that.$emit('ChangCoupons', item);
+				// if (list[index].is_use == true && this.openType == 0) return true;
+				// switch (this.openType) {
+				// 	case 0:
+				// 		//领取优惠券
+				// 		setCouponReceive(id).then(res => {
+				// 			that.$emit('ChangCouponsUseState', index);
+				// 			that.$util.Tips({
+				// 				title: "领取成功"
+				// 			});
+				// 			that.$emit('ChangCoupons', list[index]);
+				// 		})
+				// 		break;
+				// 	case 1:
+				// 		that.$emit('ChangCoupons', index);
+				// 		break;
+				// }
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.coupon-list-window {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		background-color: #f5f5f5;
+		border-radius: 16rpx 16rpx 0 0;
+		z-index: 555;
+		transform: translate3d(0, 100%, 0);
+		transition: all .3s cubic-bezier(.25, .5, .5, .9);
+	}
+
+	.coupon-list-window.on {
+		transform: translate3d(0, 0, 0);
+	}
+
+	.coupon-list-window .title {
+		height: 124rpx;
+		width: 100%;
+		text-align: center;
+		line-height: 124rpx;
+		font-size: 32rpx;
+		font-weight: bold;
+		position: relative;
+	}
+
+	.coupon-list-window .title .iconfont {
+		position: absolute;
+		right: 30rpx;
+		top: 50%;
+		transform: translateY(-50%);
+		font-size: 35rpx;
+		color: #8a8a8a;
+		font-weight: normal;
+	}
+
+	.coupon-list-window .coupon-list {
+		margin: 0 0 50rpx 0;
+		height: 550rpx;
+		overflow: auto;
+	}
+
+	.coupon-list-window .pictrue {
+		width: 414rpx;
+		height: 336rpx;
+		margin: 0 auto 50rpx auto;
+	}
+
+	.coupon-list-window .pictrue image {
+		width: 100%;
+		height: 100%;
+	}
+	.coupon-list .item .money{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		.pic-num{
+			color: #ffffff;
+			font-size: 24rpx;
+		}
+	}
+	.condition .line-title{
+		width: 90rpx;
+		padding: 0 10rpx;
+		box-sizing: border-box;
+		background: rgba(255, 247, 247, 1);
+		border: 1px solid rgba(232, 51, 35, 1);
+		opacity: 1;
+		border-radius: 22rpx;
+		font-size: 20rpx;
+		color: #e83323;
+		margin-right: 12rpx;
+	}
+</style>

File diff suppressed because it is too large
+ 51 - 0
components/couponWindow/index.vue


+ 261 - 0
components/easy-upload/easy-upload.vue

@@ -0,0 +1,261 @@
+<template>
+	<view>
+		<view class="upload">
+			<block v-for="(upload,index) in uploads" :key="index">
+				<view class="uplode-file">
+					<image v-if="types == 'image'" class="uploade-img" :src="upload" :data-src="upload" @tap="previewImage"></image>
+					<image v-if="types == 'image'" class="clear-one-icon" :src="clearIcon" @tap="delImage(index)"></image>
+					<video v-if="types == 'video'" class="uploade-img" :src="upload" controls>
+						<cover-image v-if="types == 'video'" class="clear-one-icon" :src="clearIcon" @tap="delImage(index)"></cover-image>
+					</video>
+				</view>
+			</block>
+			<view class="uploader-input-box" v-if="uploads.length < uploadCount">
+				<view class="uploader-input" @tap="chooseUploads"></view>
+			</view>
+		</view>	
+		<button type="primary" v-if="types == 'image'" @tap="upload">上传</button>
+	</view>
+</template>
+
+<script>
+	export default{
+		props: {
+			types: {
+				type: String,
+				default: 'image'
+			},
+			dataList: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			clearIcon: {
+				type: String,
+				default: 'http://img1.imgtn.bdimg.com/it/u=451604666,2295832001&fm=26&gp=0.jpg'
+			},
+			uploadUrl: {
+				type: String,
+				default: ''
+			},
+			deleteUrl: {
+				type: String,
+				default: ''
+			},
+			uploadCount: {
+				type: Number,
+				default: 1
+			},
+			//上传图片大小 默认3M
+			upload_max: {
+				type: Number,
+				default: 3
+			}
+		},
+		data(){
+			return {
+				//上传的图片地址
+				uploadImages: [],
+				//展示的图片地址
+				uploads: [],
+				// 超出限制数组
+				exceeded_list: [],
+			}
+		},
+		watch:{
+			dataList() {
+				this.uploads = this.dataList
+			}
+		},
+		methods:{
+			previewImage (e) {
+				var current = e.target.dataset.src
+				uni.previewImage({
+					current: current,
+					urls: this.dataList
+				})
+			},
+			chooseUploads(){
+				switch (this.types){
+					case 'image': 
+						uni.chooseImage({
+							count: this.uploadCount - this.uploads.length, //默认9
+							sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+							sourceType: ['album', 'camera'], //从相册选择
+							success: (res) => {
+								for(let i = 0; i< res.tempFiles.length; i++){
+									if(Math.ceil(res.tempFiles[i].size / 1024) < this.upload_max * 1024){
+										this.uploads.push(res.tempFiles[i].path)
+										this.uploadImages.push(res.tempFiles[i].path)
+									}else {
+										this.exceeded_list.push(i === 0 ? 1 : i + 1);
+										uni.showModal({
+											title: '提示',
+											content: `第${[...new Set(this.exceeded_list)].join(',')}张图片超出限制${this.upload_max}MB,已过滤`
+										});
+									}
+								}
+							},
+							fail: (err) => {
+								uni.showModal({
+									content: JSON.stringify(err)
+								});
+							}
+						});
+					break;
+					case 'video' :
+						uni.chooseVideo({
+							sourceType: ['camera', 'album'],
+							success: (res) => {
+								if(Math.ceil(res.size / 1024) < this.upload_max * 1024){
+									this.uploads.push(res.tempFilePath)
+									uni.uploadFile({
+										url: this.uploadUrl, //仅为示例,非真实的接口地址
+										filePath: res.tempFilePath,
+										name: 'file',
+										//请求参数
+										formData: {
+											'user': 'test'
+										},
+										success: (uploadFileRes) => {
+											this.$emit('successVideo',uploadFileRes)
+										}
+									});
+								}else {
+									uni.showModal({
+										title: '提示',
+										content: `第${[...new Set(this.exceeded_list)].join(',')}张视频超出限制${this.upload_max}MB,已过滤`
+									});
+								}
+							},
+							fail: (err) => {
+								uni.showModal({
+									content: JSON.stringify(err)
+								});
+							}
+						});
+					break;
+				}
+			},
+			delImage(index){
+				if(this.uploads[index].substring(0,4) !== 'http'){
+					this.uploads.splice(index,1)
+					return;
+				};
+				if(!this.deleteUrl) {
+					uni.showModal({
+						content: '请填写删除接口'
+					});
+					return;
+				};
+				uni.request({
+					url: this.deleteUrl,
+					method: 'DELETE',
+					data: {
+						image: this.dataList[index]
+					},
+					success: res => {
+						this.uploads.splice(index,1)
+					},
+				});
+			},
+			upload(){
+				debugger
+				if(!this.uploadUrl) {
+					uni.showModal({
+						content: '请填写上传接口'
+					});
+					return;
+				};
+				for (let i of this.uploadImages) {
+					uni.uploadFile({
+						url: this.uploadUrl, //仅为示例,非真实的接口地址
+						filePath: i,
+						name: 'file',
+						//请求参数
+						formData: {
+							'user': 'test'
+						},
+						success: (uploadFileRes) => {
+							this.$emit('successImage',uploadFileRes)
+						}
+					});
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.upload {
+		display: flex;
+		flex-direction: row;
+		flex-wrap: wrap;
+	}
+	.uplode-file {
+		margin: 10upx;
+		width: 210upx;
+		height: 210upx;
+		position: relative;
+	}
+	.uploade-img {
+		display: block;
+		width: 210upx;
+		height: 210upx;
+	}
+	.clear-one{
+		position: absolute;
+		top: -10rpx;
+		right: 0;
+	}
+	.clear-one-icon{
+		position: absolute;
+		width: 20px;
+		height: 20px;
+		top: 0;
+		right: 0;
+		z-index: 9;
+	}
+	.uploader-input-box {
+		position: relative;
+		margin:10upx;
+		width: 208upx;
+		height: 208upx;
+		border: 2upx solid #D9D9D9;
+	}
+	.uploader-input-box:before,
+	.uploader-input-box:after {
+		content: " ";
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		-webkit-transform: translate(-50%, -50%);
+		transform: translate(-50%, -50%);
+		background-color: #D9D9D9;
+	}
+	.uploader-input-box:before {
+		width: 4upx;
+		height: 79upx;
+	}
+	.uploader-input-box:after {
+		width: 79upx;
+		height: 4upx;
+	}
+	.uploader-input-box:active {
+		border-color: #999999;
+	}
+	.uploader-input-box:active:before,
+	.uploader-input-box:active:after {
+		background-color: #999999;
+	}
+	.uploader-input {
+		position: absolute;
+		z-index: 1;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+	}
+</style>

+ 40 - 0
components/easy-upload/readme.md

@@ -0,0 +1,40 @@
+### easy-upload 组件
+
+使用方法
+```js
+	<easy-upload
+	:dataList="imageList" uploadUrl="http://localhost:3000/upload" :types="category"
+	deleteUrl='http://localhost:3000/upload' :uploadCount="6"
+	@successImage="successImage" @successVideo="successvideo"
+	></easy-upload>
+	
+	//先引入组件
+    import easyUpload from '@/components/easy-upload/easy-upload.vue'
+    //注册组件
+    components:{
+        easyUpload
+    }
+	
+	//使用 easycom 可以直接使用
+
+```
+
+|  参数   | 类型  | 是否必填 | 参数描述
+|  ----  | ----  | ---- | ----
+| types  | String | 否 | 上传类型 image/video
+| dataList  | Array | 否 | 图片/视频数据展示
+| clearIcon  | String | 否 | 删除图标(可以换成自己本地图片)
+| uploadUrl  | String | 否 | 上传的接口
+| deleteUrl  | String | 否 | 删除的接口
+| uploadCount  | Number | 否 | 上传图片最大个数(默认为一张)
+| upload_max  | Number | 否 | 上传大小(默认为3M)
+| upload_max  | Number | 否 | 上传大小(默认为3M)
+| upload_max  | Number | 否 | 上传大小(默认为3M)
+
+|  事件  | 是否必填 | 参数描述
+|  ---- | ---- | ----
+| successImage  | 否 | 上传图片成功事件
+| successVideo  |  否 | 上传视频成功回调
+
+示例项目中有服务端代码 (node.js)
+

+ 36 - 0
components/emptyPage.vue

@@ -0,0 +1,36 @@
+<template>
+	<view class="empty-box">
+		<image src="/static/images/empty-box.png"></image>
+		<view class="txt">{{title}}</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		props: {
+			title: {
+				type: String,
+				default: '暂无记录',
+			},
+		},
+	}
+	
+</script>
+
+<style lang="scss">
+	.empty-box{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		margin-top: 200rpx;
+		image{
+			width: 414rpx;
+			height: 240rpx;
+		}
+		.txt{
+			font-size: 26rpx;
+			color: #999;
+		}
+	}
+</style>

+ 143 - 0
components/goodList/index.vue

@@ -0,0 +1,143 @@
+<template>
+	<view class='goodList'>
+		<block v-for="(item,index) in bastList" :key="index">
+			<view @click="goDetail(item)" class='item acea-row row-between-wrapper' hover-class="none">
+				<view class='pictrue'>
+					<image :src='item.image'></image>
+					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
+					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
+					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
+				</view>
+				<view class='underline'>
+					<view class='text'>
+						<view class='line1'>{{item.store_name}}</view>
+						<view class='money font-color'>¥<text class='num'>{{item.price}}</text></view>
+						<view class='vip-money acea-row row-middle' v-if="item.vip_price && item.vip_price > 0">¥{{item.vip_price || 0}}
+							<image src='../../static/images/vip.png'></image><text class='num'>已售{{item.sales}}{{item.unit_name}}</text>
+						</view>
+						<view class='vip-money acea-row row-middle' v-else><text class='num'>已售{{item.sales}}{{item.unit_name}}</text></view>
+					</view>
+				</view>
+				<view class='iconfont icon-gouwuche cart-color acea-row row-center-wrapper'></view>
+			</view>
+		</block>
+	</view>
+</template>
+
+<script>
+	import {mapGetters} from "vuex";
+	import { goShopDetail } from '@/libs/order.js'
+	export default {
+		computed: mapGetters(['uid']),
+		props: {
+			status: {
+				type: Number,
+				default: 0,
+			},
+			bastList: {
+				type: Array,
+				default: function() {
+					return [];
+				}
+			}
+		},
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			goDetail(item){
+				goShopDetail(item,this.uid).then(res=>{
+					uni.navigateTo({
+						url:`/pages/goods_details/index?id=${item.id}`
+					})
+				})
+			}
+			
+		}
+	}
+</script>
+
+<style scoped lang='scss'>
+	.goodList .item {
+		position: relative;
+		padding-left: 30rpx;
+	}
+
+	.goodList .item .pictrue {
+		width: 180rpx;
+		height: 180rpx;
+		position: relative;
+	}
+
+	.goodList .item .pictrue image {
+		width: 100%;
+		height: 100%;
+		border-radius: 6rpx;
+	}
+
+	.goodList .item .pictrue .numPic {
+		position: absolute;
+		left: 7rpx;
+		top: 7rpx;
+		width: 50rpx;
+		height: 50rpx;
+		border-radius: 50%;
+	}
+
+	.goodList .item .underline {
+		padding: 30rpx 30rpx 30rpx 0;
+		border-bottom: 1px solid #f5f5f5;
+	}
+
+	.goodList .item:nth-last-child(1) .underline {
+		border-bottom: 0;
+	}
+
+	.goodList .item .text {
+		font-size: 30rpx;
+		color: #222;
+		width: 489rpx;
+	}
+
+	.goodList .item .text .money {
+		font-size: 26rpx;
+		font-weight: bold;
+		margin-top: 50rpx;
+	}
+
+	.goodList .item .text .money .num {
+		font-size: 34rpx;
+	}
+
+	.goodList .item .text .vip-money {
+		font-size: 24rpx;
+		color: #282828;
+		font-weight: bold;
+		margin-top: 15rpx;
+	}
+
+	.goodList .item .text .vip-money image {
+		width: 46rpx;
+		height: 21rpx;
+		margin-left: 5rpx;
+	}
+
+	.goodList .item .text .vip-money .num {
+		font-size: 22rpx;
+		color: #aaa;
+		font-weight: normal;
+		margin: -2rpx 0 0 22rpx;
+	}
+
+	.goodList .item .iconfont {
+		position: absolute;
+		right: 30rpx;
+		width: 50rpx;
+		height: 50rpx;
+		border-radius: 50%;
+		font-size: 30rpx;
+		bottom: 38rpx;
+	}
+</style>

+ 118 - 0
components/home/index.vue

@@ -0,0 +1,118 @@
+<template>
+	<view style="touch-action: none;">
+		<view class="home" style="position:fixed;" :style="{ top: top + 'px', bottom: bottom }" id="right-nav" @touchmove.stop.prevent="setTouchMove">
+			<view class="homeCon bg-color-red" :class="homeActive === true ? 'on' : ''" v-if="homeActive">
+				<navigator hover-class='none' url='/pages/index/index' open-type='switchTab' class='iconfont icon-shouye-xianxing'></navigator>
+				<navigator hover-class='none' url='/pages/order_addcart/order_addcart' open-type='switchTab' class='iconfont icon-caigou-xianxing'></navigator>
+				<navigator hover-class='none' url='/pages/user/index' open-type='switchTab' class='iconfont icon-yonghu1'></navigator>
+			</view>
+			<view @click="open" class="pictrueBox">
+				<view class="pictrue">
+					<image :src="
+              homeActive === true
+                ? '/static/images/close.gif'
+                : '/static/images/open.gif'
+            "
+					 class="image" />
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {
+		mapGetters
+	} from "vuex";
+	export default {
+		name: "Home",
+		props: {},
+		data: function() {
+			return {
+				top: "",
+				bottom: ""
+			};
+		},
+		computed: mapGetters(["homeActive"]),
+		methods: {
+			setTouchMove(e) {
+				var that = this;
+				if (e.touches[0].clientY < 545 && e.touches[0].clientY > 66) {
+					that.top = e.touches[0].clientY
+					// that.setData({
+					// 	top: e.touches[0].clientY
+					// })
+				}
+			},
+			open: function() {
+				this.homeActive ?
+					this.$store.commit("CLOSE_HOME") :
+					this.$store.commit("OPEN_HOME");
+			}
+		},
+		created() {
+			this.bottom = "50px";
+		}
+	};
+</script>
+
+<style scoped>
+	.pictrueBox {
+		width: 130rpx;
+		height: 120rpx;
+	}
+
+	/*返回主页按钮*/
+	.home {
+		position: fixed;
+		color: white;
+		text-align: center;
+		z-index: 9999;
+		right: 15rpx;
+		display: flex;
+	}
+
+	.home .homeCon {
+		border-radius: 50rpx;
+		opacity: 0;
+		height: 0;
+		color: #e93323;
+		width: 0;
+	}
+
+	.home .homeCon.on {
+		opacity: 1;
+		animation: bounceInRight 0.5s cubic-bezier(0.215, 0.610, 0.355, 1.000);
+		width: 300rpx;
+		height: 86rpx;
+		margin-bottom: 20rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background: #f44939 !important;
+	}
+
+	.home .homeCon .iconfont {
+		font-size: 48rpx;
+		color: #fff;
+		display: inline-block;
+		margin: 0 auto;
+	}
+
+	.home .pictrue {
+		width: 86rpx;
+		height: 86rpx;
+		border-radius: 50%;
+		margin: 0 auto;
+	}
+
+	.home .pictrue .image {
+		width: 100%;
+		height: 100%;
+		border-radius: 50%;
+		transform: rotate(90deg);
+		ms-transform: rotate(90deg);
+		moz-transform: rotate(90deg);
+		webkit-transform: rotate(90deg);
+		o-transform: rotate(90deg);
+	}
+</style>

+ 814 - 0
components/jyf-parser/jyf-parser.vue

@@ -0,0 +1,814 @@
+<!--
+  parser 主模块组件
+  github:https://github.com/jin-yufeng/Parser 
+  docs:https://jin-yufeng.github.io/Parser
+  插件市场:https://ext.dcloud.net.cn/plugin?id=805
+  author:JinYufeng
+  update:2020/04/14
+-->
+<template>
+	<view>
+		<slot v-if="!nodes.length" />
+		<!--#ifdef APP-PLUS-NVUE-->
+		<web-view id="top" ref="web" :src="src" :style="'margin-top:-2px;height:'+height+'px'" @onPostMessage="_message" />
+		<!--#endif-->
+		<!--#ifndef APP-PLUS-NVUE-->
+		<view id="top" :style="showAm+(selectable?';user-select:text;-webkit-user-select:text':'')" :animation="scaleAm" @tap="_tap"
+		 @touchstart="_touchstart" @touchmove="_touchmove">
+			<!--#ifdef H5-->
+			<div :id="'rtf'+uid"></div>
+			<!--#endif-->
+			<!--#ifndef H5-->
+			<trees :nodes="nodes" :lazy-load="lazyLoad" :loadVideo="loadVideo" />
+			<image v-for="(item, index) in imgs" v-bind:key="index" :id="index" :src="item" hidden @load="_load" />
+			<!--#endif-->
+		</view>
+		<!--#endif-->
+	</view>
+</template>
+
+<script>
+	// #ifndef H5 || APP-PLUS-NVUE
+	import trees from './libs/trees';
+	var cache = {},
+		// #ifdef MP-WEIXIN || MP-TOUTIAO
+		fs = uni.getFileSystemManager ? uni.getFileSystemManager() : null,
+		// #endif
+		Parser = require('./libs/MpHtmlParser.js');
+	var document; // document 补丁包 https://jin-yufeng.github.io/Parser/#/instructions?id=document
+	// 计算 cache 的 key
+	function hash(str) {
+		for (var i = str.length, val = 5381; i--;)
+			val += (val << 5) + str.charCodeAt(i);
+		return val;
+	}
+	// #endif
+	// #ifdef H5 || APP-PLUS-NVUE
+	var rpx = uni.getSystemInfoSync().screenWidth / 750,
+		cfg = require('./libs/config.js');
+	// #endif
+	// #ifdef APP-PLUS-NVUE
+	var dom = weex.requireModule('dom');
+	// #endif
+	export default {
+		name: 'parser',
+		data() {
+			return {
+				// #ifdef APP-PLUS
+				loadVideo: false,
+				// #endif
+				// #ifdef H5
+				uid: this._uid,
+				// #endif
+				// #ifdef APP-PLUS-NVUE
+				src: '',
+				height: 1,
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				scaleAm: '',
+				showAm: '',
+				imgs: [],
+				// #endif
+				nodes: []
+			}
+		},
+		// #ifndef H5 || APP-PLUS-NVUE
+		components: {
+			trees
+		},
+		// #endif
+		props: {
+			'html': null,
+			// #ifndef MP-ALIPAY
+			'autopause': {
+				type: Boolean,
+				default: true
+			},
+			// #endif
+			'autosetTitle': {
+				type: Boolean,
+				default: true
+			},
+			// #ifndef H5 || APP-PLUS-NVUE
+			'compress': Number,
+			'useCache': Boolean,
+			'xml': Boolean,
+			// #endif
+			'domain': String,
+			// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
+			'gestureZoom': Boolean,
+			// #endif
+			// #ifdef MP-WEIXIN || MP-QQ || H5 || APP-PLUS
+			'lazyLoad': Boolean,
+			// #endif
+			'selectable': Boolean,
+			'tagStyle': Object,
+			'showWithAnimation': Boolean,
+			'useAnchor': Boolean
+		},
+		watch: {
+			html(html) {
+				this.setContent(html);
+			}
+		},
+		mounted() {
+			// 图片数组
+			this.imgList = [];
+			this.imgList.each = function(f) {
+				for (var i = 0, len = this.length; i < len; i++)
+					this.setItem(i, f(this[i], i, this));
+			}
+			this.imgList.setItem = function(i, src) {
+				if (i == void 0 || !src) return;
+				// #ifndef MP-ALIPAY || APP-PLUS
+				// 去重
+				if (src.indexOf('http') == 0 && this.includes(src)) {
+					var newSrc = '';
+					for (var j = 0, c; c = src[j]; j++) {
+						if (c == '/' && src[j - 1] != '/' && src[j + 1] != '/') break;
+						newSrc += Math.random() > 0.5 ? c.toUpperCase() : c;
+					}
+					newSrc += src.substr(j);
+					return this[i] = newSrc;
+				}
+				// #endif
+				this[i] = src;
+				// 暂存 data src
+				if (src.includes('data:image')) {
+					var filePath, info = src.match(/data:image\/(\S+?);(\S+?),(.+)/);
+					if (!info) return;
+					// #ifdef MP-WEIXIN || MP-TOUTIAO
+					filePath = `${wx.env.USER_DATA_PATH}/${Date.now()}.${info[1]}`;
+					fs && fs.writeFile({
+						filePath,
+						data: info[3],
+						encoding: info[2],
+						success: () => this[i] = filePath
+					})
+					// #endif
+					// #ifdef APP-PLUS
+					filePath = `_doc/parser_tmp/${Date.now()}.${info[1]}`;
+					var bitmap = new plus.nativeObj.Bitmap();
+					bitmap.loadBase64Data(src, () => {
+						bitmap.save(filePath, {}, () => {
+							bitmap.clear()
+							this[i] = filePath;
+						})
+					})
+					// #endif
+				}
+			}
+			if (this.html) this.setContent(this.html);
+		},
+		beforeDestroy() {
+			// #ifdef H5
+			if (this._observer) this._observer.disconnect();
+			// #endif
+			this.imgList.each(src => {
+				// #ifdef APP-PLUS
+				if (src && src.includes('_doc')) {
+					plus.io.resolveLocalFileSystemURL(src, entry => {
+						entry.remove();
+					});
+				}
+				// #endif
+				// #ifdef MP-WEIXIN || MP-TOUTIAO
+				if (src && src.includes(uni.env.USER_DATA_PATH))
+					fs && fs.unlink({
+						filePath: src
+					})
+				// #endif
+			})
+			clearInterval(this._timer);
+		},
+		methods: {
+			// #ifdef H5 || APP-PLUS-NVUE
+			_Dom2Str(nodes) {
+				var str = '';
+				for (var node of nodes) {
+					if (node.type == 'text')
+						str += node.text;
+					else {
+						str += ('<' + node.name);
+						for (var attr in node.attrs || {})
+							str += (' ' + attr + '="' + node.attrs[attr] + '"');
+						if (!node.children || !node.children.length) str += '>';
+						else str += ('>' + this._Dom2Str(node.children) + '</' + node.name + '>');
+					}
+				}
+				return str;
+			},
+			_handleHtml(html, append) {
+				if (typeof html != 'string') html = this._Dom2Str(html.nodes || html);
+				// 处理 rpx
+				if (html.includes('rpx'))
+					html = html.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * rpx + 'px');
+				if (!append) {
+					// 处理 tag-style 和 userAgentStyles
+					var style = '<style>@keyframes show{0%{opacity:0}100%{opacity:1}}';
+					for (var item in cfg.userAgentStyles)
+						style += `${item}{${cfg.userAgentStyles[item]}}`;
+					for (item in this.tagStyle)
+						style += `${item}{${this.tagStyle[item]}}`;
+					style += '</style>';
+					html = style + html;
+				}
+				return html;
+			},
+			// #endif
+			setContent(html, append) {
+				// #ifdef APP-PLUS-NVUE
+				if (!html) {
+					this.src = '';
+					this.height = 1;
+					return;
+				}
+				if (append) return;
+				plus.io.resolveLocalFileSystemURL('_doc', entry => {
+					entry.getDirectory('parser_tmp', {
+						create: true
+					}, entry => {
+						var fileName = Date.now() + '.html';
+						entry.getFile(fileName, {
+							create: true
+						}, entry => {
+							entry.createWriter(writer => {
+								writer.onwriteend = () => {
+									this.nodes = [1];
+									this.src = '_doc/parser_tmp/' + fileName;
+									this.$nextTick(function() {
+										entry.remove();
+									})
+								}
+								html =
+									'<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1' +
+									(this.selectable ? '' : ',user-scalable=no') +
+									'"><script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></' +
+									'script><base href="' + this.domain + '">' + this._handleHtml(html) +
+									'<script>"use strict";function post(t){uni.postMessage({data:t})}' +
+									(this.showWithAnimation ? 'document.body.style.animation="show .5s",' : '') +
+									'document.addEventListener("UniAppJSBridgeReady",function(){post({action:"load",text:document.body.innerText});var t=document.getElementsByTagName("title");t.length&&post({action:"getTitle",title:t[0].innerText});for(var e,o=document.getElementsByTagName("img"),n=[],i=0,r=0;e=o[i];i++)e.onerror=function(){post({action:"error",source:"img",target:this})},e.hasAttribute("ignore")||"A"==e.parentElement.nodeName||(e.i=r++,n.push(e.src),e.onclick=function(){post({action:"preview",img:{i:this.i,src:this.src}})});post({action:"getImgList",imgList:n});for(var a,s=document.getElementsByTagName("a"),c=0;a=s[c];c++)a.onclick=function(){var t,e=this.getAttribute("href");if("#"==e[0]){var r=document.getElementById(e.substr(1));r&&(t=r.offsetTop)}return post({action:"linkpress",href:e,offset:t}),!1};;for(var u,m=document.getElementsByTagName("video"),d=0;u=m[d];d++)u.style.maxWidth="100%",u.onerror=function(){post({action:"error",source:"video",target:this})}' +
+									(this.autopause ? ',u.onplay=function(){for(var t,e=0;t=m[e];e++)t!=this&&t.pause()}' : '') +
+									';for(var g,l=document.getElementsByTagName("audio"),p=0;g=l[p];p++)g.onerror=function(){post({action:"error",source:"audio",target:this})};window.onload=function(){post({action:"ready",height:document.body.scrollHeight})}});</' +
+									'script>';
+								writer.write(html);
+							});
+						})
+					})
+				})
+				// #endif
+				// #ifdef H5
+				if (!html) {
+					if (this.rtf && !append) this.rtf.parentNode.removeChild(this.rtf);
+					return;
+				}
+				var div = document.createElement('div');
+				if (!append) {
+					if (this.rtf) this.rtf.parentNode.removeChild(this.rtf);
+					this.rtf = div;
+				} else {
+					if (!this.rtf) this.rtf = div;
+					else this.rtf.appendChild(div);
+				}
+				div.innerHTML = this._handleHtml(html, append);
+				for (var styles = this.rtf.getElementsByTagName('style'), i = 0, style; style = styles[i++];) {
+					style.innerHTML = style.innerHTML.replace(/body/g, '#rtf' + this._uid);
+					style.setAttribute('scoped', 'true');
+				}
+				// 懒加载
+				if (!this._observer && this.lazyLoad && IntersectionObserver) {
+					this._observer = new IntersectionObserver(changes => {
+						for (let item, i = 0; item = changes[i++];) {
+							if (item.isIntersecting) {
+								item.target.src = item.target.getAttribute('data-src');
+								item.target.removeAttribute('data-src');
+								this._observer.unobserve(item.target);
+							}
+						}
+					}, {
+						rootMargin: '900px 0px 900px 0px'
+					})
+				}
+				var _ts = this;
+				// 获取标题
+				var title = this.rtf.getElementsByTagName('title');
+				if (title.length && this.autosetTitle)
+					uni.setNavigationBarTitle({
+						title: title[0].innerText
+					})
+				// 图片处理
+				this.imgList.length = 0;
+				var imgs = this.rtf.getElementsByTagName('img');
+				for (let i = 0, j = 0, img; img = imgs[i]; i++) {
+					img.style.maxWidth = '100%';
+					var src = img.getAttribute('src');
+					if (this.domain && src) {
+						if (src[0] == '/') {
+							if (src[1] == '/')
+								img.src = (this.domain.includes('://') ? this.domain.split('://')[0] : '') + ':' + src;
+							else img.src = this.domain + src;
+						} else if (!src.includes('://')) img.src = this.domain + '/' + src;
+					}
+					if (!img.hasAttribute('ignore') && img.parentElement.nodeName != 'A') {
+						img.i = j++;
+						_ts.imgList.push(img.src || img.getAttribute('data-src'));
+						img.onclick = function() {
+							var preview = true;
+							this.ignore = () => preview = false;
+							_ts.$emit('imgtap', this);
+							if (preview) {
+								uni.previewImage({
+									current: this.i,
+									urls: _ts.imgList
+								});
+							}
+						}
+					}
+					img.onerror = function() {
+						_ts.$emit('error', {
+							source: 'img',
+							target: this
+						});
+					}
+					if (_ts.lazyLoad && this._observer && img.src && img.i != 0) {
+						img.setAttribute('data-src', img.src);
+						img.removeAttribute('src');
+						this._observer.observe(img);
+					}
+				}
+				// 链接处理
+				var links = this.rtf.getElementsByTagName('a');
+				for (var link of links) {
+					link.onclick = function() {
+						var jump = true,
+							href = this.getAttribute('href');
+						_ts.$emit('linkpress', {
+							href,
+							ignore: () => jump = false
+						});
+						if (jump && href) {
+							if (href[0] == '#') {
+								if (_ts.useAnchor) {
+									_ts.navigateTo({
+										id: href.substr(1)
+									})
+								}
+							} else if (href.indexOf('http') == 0 || href.indexOf('//') == 0)
+								return true;
+							else {
+								uni.navigateTo({
+									url: href
+								})
+							}
+						}
+						return false;
+					}
+				}
+				// 视频处理
+				var videos = this.rtf.getElementsByTagName('video');
+				_ts.videoContexts = videos;
+				for (let video, i = 0; video = videos[i++];) {
+					video.style.maxWidth = '100%';
+					video.onerror = function() {
+						_ts.$emit('error', {
+							source: 'video',
+							target: this
+						});
+					}
+					video.onplay = function() {
+						if (_ts.autopause)
+							for (let item, i = 0; item = _ts.videoContexts[i++];)
+								if (item != this) item.pause();
+					}
+				}
+				// 音频处理
+				var audios = this.rtf.getElementsByTagName('audios');
+				for (var audio of audios)
+					audio.onerror = function() {
+						_ts.$emit('error', {
+							source: 'audio',
+							target: this
+						});
+					}
+				this.document = this.rtf;
+				if (!append) document.getElementById('rtf' + this._uid).appendChild(this.rtf);
+				this.$nextTick(() => {
+					this.nodes = [1];
+					this.$emit('load');
+				})
+				setTimeout(() => this.showAm = '', 500);
+				// #endif
+				// #ifndef H5 || APP-PLUS-NVUE
+				var nodes;
+				if (!html)
+					return this.nodes = [];
+				else if (typeof html == 'string') {
+					let parser = new Parser(html, this);
+					// 缓存读取
+					if (this.useCache) {
+						var hashVal = hash(html);
+						if (cache[hashVal])
+							nodes = cache[hashVal];
+						else {
+							nodes = parser.parse();
+							cache[hashVal] = nodes;
+						}
+					} else nodes = parser.parse();
+					this.$emit('parse', nodes);
+				} else if (Object.prototype.toString.call(html) == '[object Array]') {
+					// 非本插件产生的 array 需要进行一些转换
+					if (html.length && html[0].PoweredBy != 'Parser') {
+						let parser = new Parser(html, this);
+						(function f(ns) {
+							for (var i = 0, n; n = ns[i]; i++) {
+								if (n.type == 'text') continue;
+								n.attrs = n.attrs || {};
+								for (var item in n.attrs)
+									if (typeof n.attrs[item] != 'string') n.attrs[item] = n.attrs[item].toString();
+								parser.matchAttr(n, parser);
+								if (n.children && n.children.length) {
+									parser.STACK.push(n);
+									f(n.children);
+									parser.popNode(parser.STACK.pop());
+								} else n.children = void 0;
+							}
+						})(html);
+					}
+					nodes = html;
+				} else if (typeof html == 'object' && html.nodes) {
+					nodes = html.nodes;
+					console.warn('错误的 html 类型:object 类型已废弃');
+				} else
+					return console.warn('错误的 html 类型:' + typeof html);
+				// #ifdef APP-PLUS
+				this.loadVideo = false;
+				// #endif
+				if (document) this.document = new document(this.nodes, 'nodes', this);
+				if (append) this.nodes = this.nodes.concat(nodes);
+				else this.nodes = nodes;
+				if (nodes.length && nodes[0].title && this.autosetTitle)
+					uni.setNavigationBarTitle({
+						title: nodes[0].title
+					})
+				this.$nextTick(() => {
+					this.imgList.length = 0;
+					this.videoContexts = [];
+					// #ifdef MP-TOUTIAO
+					setTimeout(() => {
+						// #endif
+						var f = (cs) => {
+							for (let i = 0, c; c = cs[i++];) {
+								if (c.$options.name == 'trees') {
+									for (var j = c.nodes.length, item; item = c.nodes[--j];) {
+										if (item.c) continue;
+										if (item.name == 'img') {
+											this.imgList.setItem(item.attrs.i, item.attrs.src);
+											// #ifndef MP-ALIPAY
+											if (!c.observer && !c.imgLoad && item.attrs.i != '0') {
+												if (this.lazyLoad && uni.createIntersectionObserver) {
+													c.observer = uni.createIntersectionObserver(c);
+													c.observer.relativeToViewport({
+														top: 900,
+														bottom: 900
+													}).observe('._img', () => {
+														c.imgLoad = true;
+														c.observer.disconnect();
+													})
+												} else
+													c.imgLoad = true;
+											}
+											// #endif
+										}
+										// #ifndef MP-ALIPAY
+										else if (item.name == 'video') {
+											var ctx = uni.createVideoContext(item.attrs.id, c);
+											ctx.id = item.attrs.id;
+											this.videoContexts.push(ctx);
+										}
+										// #endif
+										// #ifdef MP-BAIDU || MP-ALIPAY || APP-PLUS
+										if (item.attrs && item.attrs.id) {
+											this.anchors = this.anchors || [];
+											this.anchors.push({
+												id: item.attrs.id,
+												node: c
+											})
+										}
+										// #endif
+									}
+								}
+								if (c.$children.length)
+									f(c.$children)
+							}
+						}
+						f(this.$children);
+						// #ifdef MP-TOUTIAO
+					}, 200)
+					this.$emit('load');
+					// #endif
+					// #ifdef APP-PLUS
+					setTimeout(() => {
+						this.loadVideo = true;
+					}, 3000);
+					// #endif
+				})
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				var height;
+				clearInterval(this._timer);
+				this._timer = setInterval(() => {
+					// #ifdef H5
+					var res = [this.rtf.getBoundingClientRect()];
+					// #endif
+					// #ifndef H5
+					// #ifdef APP-PLUS
+					uni.createSelectorQuery().in(this)
+					// #endif
+					// #ifndef APP-PLUS
+					this.createSelectorQuery()
+						// #endif
+						.select('#top').boundingClientRect().exec(res => {
+							// #endif
+							this.width = res[0].width;
+							if (res[0].height == height) {
+								this.$emit('ready', res[0])
+								clearInterval(this._timer);
+							}
+							height = res[0].height;
+							// #ifndef H5
+						});
+					// #endif
+				}, 350)
+				if (this.showWithAnimation && !append) this.showAm = 'animation:show .5s';
+				// #endif
+			},
+			getText(ns = this.nodes) {
+				// #ifdef APP-PLUS-NVUE
+				return this._text;
+				// #endif
+				// #ifdef H5
+				return this.rtf.innerText;
+				// #endif
+				// #ifndef H5 || APP-PLUS-NVUE
+				var txt = '';
+				for (var i = 0, n; n = ns[i++];) {
+					if (n.type == 'text') txt += n.text.replace(/&nbsp;/g, '\u00A0').replace(/&lt;/g, '<').replace(/&gt;/g, '>')
+						.replace(/&amp;/g, '&');
+					else if (n.type == 'br') txt += '\n';
+					else {
+						// 块级标签前后加换行
+						var block = n.name == 'p' || n.name == 'div' || n.name == 'tr' || n.name == 'li' || (n.name[0] == 'h' && n.name[1] >
+							'0' && n.name[1] < '7');
+						if (block && txt && txt[txt.length - 1] != '\n') txt += '\n';
+						if (n.children) txt += this.getText(n.children);
+						if (block && txt[txt.length - 1] != '\n') txt += '\n';
+						else if (n.name == 'td' || n.name == 'th') txt += '\t';
+					}
+				}
+				return txt;
+				// #endif
+			},
+			navigateTo(obj) {
+				if (!this.useAnchor)
+					return obj.fail && obj.fail({
+						errMsg: 'Anchor is disabled'
+					})
+				// #ifdef APP-PLUS-NVUE
+				if (!obj.id)
+					dom.scrollToElement(this.$refs.web);
+				else
+					this.$refs.web.evalJs('var pos=document.getElementById("' + obj.id +
+						'");if(pos)post({action:"linkpress",href:"#",offset:pos.offsetTop})');
+				return obj.success && obj.success({
+					errMsg: 'pageScrollTo:ok'
+				});
+				// #endif
+				// #ifdef H5
+				if (!obj.id) {
+					window.scrollTo(0, this.rtf.offsetTop);
+					return obj.success && obj.success({
+						errMsg: 'pageScrollTo:ok'
+					});
+				}
+				var target = document.getElementById(obj.id);
+				if (!target) return obj.fail && obj.fail({
+					errMsg: 'Label not found'
+				});
+				obj.scrollTop = this.rtf.offsetTop + target.offsetTop;
+				uni.pageScrollTo(obj);
+				// #endif
+				// #ifndef H5
+				var Scroll = (selector, component) => {
+					uni.createSelectorQuery().in(component ? component : this).select(selector).boundingClientRect().selectViewport()
+						.scrollOffset()
+						.exec(res => {
+							if (!res || !res[0])
+								return obj.fail && obj.fail({
+									errMsg: 'Label not found'
+								});
+							obj.scrollTop = res[1].scrollTop + res[0].top;
+							uni.pageScrollTo(obj);
+						})
+				}
+				if (!obj.id) Scroll('#top');
+				else {
+					// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
+					Scroll('#top >>> #' + obj.id + ', #top >>> .' + obj.id);
+					// #endif
+					// #ifdef MP-BAIDU || MP-ALIPAY || APP-PLUS
+					for (var anchor of this.anchors)
+						if (anchor.id == obj.id)
+							Scroll('#' + obj.id + ', .' + obj.id, anchor.node);
+					// #endif
+				}
+				// #endif
+			},
+			getVideoContext(id) {
+				// #ifndef APP-PLUS-NVUE
+				if (!id) return this.videoContexts;
+				else
+					for (var i = this.videoContexts.length; i--;)
+						if (this.videoContexts[i].id == id) return this.videoContexts[i];
+				// #endif
+			},
+			// 预加载
+			preLoad(html, num) {
+				// #ifdef H5 || APP-PLUS-NVUE
+				if (html.constructor == Array)
+					html = this._Dom2Str(html);
+				var script = "var contain=document.createElement('div');contain.innerHTML='" + html.replace(/'/g, "\\'") +
+					"';for(var imgs=contain.querySelectorAll('img'),i=imgs.length-1;i>=" + num +
+					";i--)imgs[i].removeAttribute('src');";
+				// #endif
+				// #ifdef APP-PLUS-NVUE
+				this.$refs.web.evalJs(script);
+				// #endif
+				// #ifdef H5
+				eval(script);
+				// #endif
+				// #ifndef H5 || APP-PLUS-NVUE
+				if (typeof html == 'string') {
+					var id = hash(html);
+					html = new Parser(html, this).parse();
+					cache[id] = html;
+				}
+				var wait = [];
+				(function f(ns) {
+					for (var i = 0, n; n = ns[i++];) {
+						if (n.name == 'img' && n.attrs.src && !wait.includes(n.attrs.src))
+							wait.push(n.attrs.src);
+						f(n.children || []);
+					}
+				})(html);
+				if (num) wait = wait.slice(0, num);
+				this._wait = (this._wait || []).concat(wait);
+				if (!this.imgs) this.imgs = this._wait.splice(0, 15);
+				else if (this.imgs.length < 15)
+					this.imgs = this.imgs.concat(this._wait.splice(0, 15 - this.imgs.length));
+				// #endif
+			},
+			// #ifdef APP-PLUS-NVUE
+			_message(e) {
+				// 接收 web-view 消息
+				var data = e.detail.data[0];
+				if (data.action == 'load') {
+					this.$emit('load');
+					this._text = data.text;
+				} else if (data.action == 'getTitle') {
+					if (this.autosetTitle)
+						uni.setNavigationBarTitle({
+							title: data.title
+						})
+				} else if (data.action == 'getImgList') {
+					this.imgList.length = 0;
+					for (var i = data.imgList.length; i--;)
+						this.imgList.setItem(i, data.imgList[i]);
+				} else if (data.action == 'preview') {
+					var preview = true;
+					data.img.ignore = () => preview = false;
+					this.$emit('imgtap', data.img);
+					if (preview)
+						uni.previewImage({
+							current: data.img.i,
+							urls: this.imgList
+						})
+				} else if (data.action == 'linkpress') {
+					var jump = true,
+						href = data.href;
+					this.$emit('linkpress', {
+						href,
+						ignore: () => jump = false
+					})
+					if (jump && href) {
+						if (href[0] == '#') {
+							if (this.useAnchor)
+								dom.scrollToElement(this.$refs.web, {
+									offset: data.offset
+								})
+						} else if (href.includes('://'))
+							plus.runtime.openWeb(href);
+						else
+							uni.navigateTo({
+								url: href
+							})
+					}
+				} else if (data.action == 'error')
+					this.$emit('error', {
+						source: data.source,
+						target: data.target
+					})
+				else if (data.action == 'ready') {
+					this.height = data.height;
+					this.$nextTick(() => {
+						uni.createSelectorQuery().in(this).select('#top').boundingClientRect().exec(res => {
+							this.rect = res[0];
+							this.$emit('ready', res[0]);
+						})
+					})
+				}
+			},
+			// #endif
+			// #ifndef APP-PLUS-NVUE
+			// #ifndef H5
+			_load(e) {
+				if (this._wait.length)
+					this.$set(this.imgs, e.target.id, this._wait.shift());
+			},
+			// #endif
+			_tap(e) {
+				// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
+				if (this.gestureZoom && e.timeStamp - this._lastT < 300) {
+					var initY = e.touches[0].pageY - e.currentTarget.offsetTop;
+					if (this._zoom) {
+						this._scaleAm.translateX(0).scale(1).step();
+						uni.pageScrollTo({
+							scrollTop: (initY + this._initY) / 2 - e.touches[0].clientY,
+							duration: 400
+						})
+					} else {
+						var initX = e.touches[0].pageX - e.currentTarget.offsetLeft;
+						this._initY = initY;
+						this._scaleAm = uni.createAnimation({
+							transformOrigin: `${initX}px ${this._initY}px 0`,
+							timingFunction: 'ease-in-out'
+						});
+						// #ifdef MP-TOUTIAO
+						this._scaleAm.opacity(1);
+						// #endif
+						this._scaleAm.scale(2).step();
+						this._tMax = initX / 2;
+						this._tMin = (initX - this.width) / 2;
+						this._tX = 0;
+					}
+					this._zoom = !this._zoom;
+					this.scaleAm = this._scaleAm.export();
+				}
+				this._lastT = e.timeStamp;
+				// #endif
+			},
+			_touchstart(e) {
+				// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
+				if (e.touches.length == 1)
+					this._initX = this._lastX = e.touches[0].pageX;
+				// #endif
+			},
+			_touchmove(e) {
+				// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
+				var diff = e.touches[0].pageX - this._lastX;
+				if (this._zoom && e.touches.length == 1 && Math.abs(diff) > 20) {
+					this._lastX = e.touches[0].pageX;
+					if ((this._tX <= this._tMin && diff < 0) || (this._tX >= this._tMax && diff > 0))
+						return;
+					this._tX += (diff * Math.abs(this._lastX - this._initX) * 0.05);
+					if (this._tX < this._tMin) this._tX = this._tMin;
+					if (this._tX > this._tMax) this._tX = this._tMax;
+					this._scaleAm.translateX(this._tX).step();
+					this.scaleAm = this._scaleAm.export();
+				}
+				// #endif
+			}
+			// #endif
+		}
+	}
+</script>
+
+<style>
+	@keyframes show {
+		0% {
+			opacity: 0
+		}
+
+		100% {
+			opacity: 1;
+		}
+	}
+
+	/* #ifdef MP-WEIXIN */
+	:host {
+		display: block;
+		overflow: scroll;
+		-webkit-overflow-scrolling: touch;
+	}
+
+	/* #endif */
+</style>

+ 102 - 0
components/jyf-parser/libs/CssHandler.js

@@ -0,0 +1,102 @@
+/*
+  解析和匹配 Css 的选择器
+  github:https://github.com/jin-yufeng/Parser
+  docs:https://jin-yufeng.github.io/Parser
+  author:JinYufeng
+  update:2020/03/15
+*/
+var cfg = require('./config.js');
+class CssHandler {
+	constructor(tagStyle) {
+		var styles = Object.assign({}, cfg.userAgentStyles);
+		for (var item in tagStyle)
+			styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];
+		this.styles = styles;
+	}
+	getStyle = data => this.styles = new CssParser(data, this.styles).parse();
+	match(name, attrs) {
+		var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';
+		if (attrs.class) {
+			var items = attrs.class.split(' ');
+			for (var i = 0, item; item = items[i]; i++)
+				if (tmp = this.styles['.' + item])
+					matched += tmp + ';';
+		}
+		if (tmp = this.styles['#' + attrs.id])
+			matched += tmp + ';';
+		return matched;
+	}
+}
+module.exports = CssHandler;
+class CssParser {
+	constructor(data, init) {
+		this.data = data;
+		this.floor = 0;
+		this.i = 0;
+		this.list = [];
+		this.res = init;
+		this.state = this.Space;
+	}
+	parse() {
+		for (var c; c = this.data[this.i]; this.i++)
+			this.state(c);
+		return this.res;
+	}
+	section = () => this.data.substring(this.start, this.i);
+	isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+	// 状态机
+	Space(c) {
+		if (c == '.' || c == '#' || this.isLetter(c)) {
+			this.start = this.i;
+			this.state = this.Name;
+		} else if (c == '/' && this.data[this.i + 1] == '*')
+			this.Comment();
+		else if (!cfg.blankChar[c] && c != ';')
+			this.state = this.Ignore;
+	}
+	Comment() {
+		this.i = this.data.indexOf('*/', this.i) + 1;
+		if (!this.i) this.i = this.data.length;
+		this.state = this.Space;
+	}
+	Ignore(c) {
+		if (c == '{') this.floor++;
+		else if (c == '}' && !--this.floor) this.state = this.Space;
+	}
+	Name(c) {
+		if (cfg.blankChar[c]) {
+			this.list.push(this.section());
+			this.state = this.NameSpace;
+		} else if (c == '{') {
+			this.list.push(this.section());
+			this.Content();
+		} else if (c == ',') {
+			this.list.push(this.section());
+			this.Comma();
+		} else if (!this.isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')
+			this.state = this.Ignore;
+	}
+	NameSpace(c) {
+		if (c == '{') this.Content();
+		else if (c == ',') this.Comma();
+		else if (!cfg.blankChar[c]) this.state = this.Ignore;
+	}
+	Comma() {
+		while (cfg.blankChar[this.data[++this.i]]);
+		if (this.data[this.i] == '{') this.Content();
+		else {
+			this.start = this.i--;
+			this.state = this.Name;
+		}
+	}
+	Content() {
+		this.start = ++this.i;
+		if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;
+		var content = this.section();
+		for (var i = 0, item; item = this.list[i++];)
+			if (this.res[item]) this.res[item] += ';' + content;
+			else this.res[item] = content;
+		this.list = [];
+		this.state = this.Space;
+	}
+}

+ 577 - 0
components/jyf-parser/libs/MpHtmlParser.js

@@ -0,0 +1,577 @@
+/*
+  将 html 解析为适用于小程序 rich-text 的 DOM 结构
+  github:https://github.com/jin-yufeng/Parser
+  docs:https://jin-yufeng.github.io/Parser
+  author:JinYufeng
+  update:2020/04/13
+*/
+var cfg = require('./config.js'),
+	blankChar = cfg.blankChar,
+	CssHandler = require('./CssHandler.js'),
+	{
+		screenWidth,
+		system
+	} = wx.getSystemInfoSync();
+// #ifdef MP-BAIDU || MP-ALIPAY || MP-TOUTIAO
+var entities = {
+	lt: '<',
+	gt: '>',
+	amp: '&',
+	quot: '"',
+	apos: "'",
+	nbsp: '\xA0',
+	ensp: '\u2002',
+	emsp: '\u2003',
+	ndash: '–',
+	mdash: '—',
+	middot: '·',
+	lsquo: '‘',
+	rsquo: '’',
+	ldquo: '“',
+	rdquo: '”',
+	bull: '•',
+	hellip: '…',
+	permil: '‰',
+	copy: '©',
+	reg: '®',
+	trade: '™',
+	times: '×',
+	divide: '÷',
+	cent: '¢',
+	pound: '£',
+	yen: '¥',
+	euro: '€',
+	sect: '§'
+};
+// #endif
+var emoji; // emoji 补丁包 https://jin-yufeng.github.io/Parser/#/instructions?id=emoji
+class MpHtmlParser {
+	constructor(data, options = {}) {
+		this.attrs = {};
+		this.compress = options.compress;
+		this.CssHandler = new CssHandler(options.tagStyle, screenWidth);
+		this.data = data;
+		this.domain = options.domain;
+		this.DOM = [];
+		this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;
+		this.protocol = this.domain && this.domain.includes('://') ? this.domain.split('://')[0] : '';
+		this.state = this.Text;
+		this.STACK = [];
+		this.useAnchor = options.useAnchor;
+		this.xml = options.xml;
+	}
+	parse() {
+		if (emoji) this.data = emoji.parseEmoji(this.data);
+		for (var c; c = this.data[this.i]; this.i++)
+			this.state(c);
+		if (this.state == this.Text) this.setText();
+		while (this.STACK.length) this.popNode(this.STACK.pop());
+		// #ifdef MP-BAIDU || MP-TOUTIAO
+		// 将顶层标签的一些样式提取出来给 rich-text
+		(function f(ns) {
+			for (var i = ns.length, n; n = ns[--i];) {
+				if (n.type == 'text') continue;
+				if (!n.c) {
+					var style = n.attrs.style;
+					if (style) {
+						var j, k, res;
+						if ((j = style.indexOf('display')) != -1)
+							res = style.substring(j, (k = style.indexOf(';', j)) == -1 ? style.length : k);
+						if ((j = style.indexOf('float')) != -1)
+							res += ';' + style.substring(j, (k = style.indexOf(';', j)) == -1 ? style.length : k);
+						n.attrs.contain = res;
+					}
+				} else f(n.children);
+			}
+		})(this.DOM);
+		// #endif
+		if (this.DOM.length) {
+			this.DOM[0].PoweredBy = 'Parser';
+			if (this.title) this.DOM[0].title = this.title;
+		}
+		return this.DOM;
+	}
+	// 设置属性
+	setAttr() {
+		var name = this.getName(this.attrName);
+		if (cfg.trustAttrs[name]) {
+			if (!this.attrVal) {
+				if (cfg.boolAttrs[name]) this.attrs[name] = 'T';
+			} else if (name == 'src') this.attrs[name] = this.getUrl(this.attrVal.replace(/&amp;/g, '&'));
+			else this.attrs[name] = this.attrVal;
+		}
+		this.attrVal = '';
+		while (blankChar[this.data[this.i]]) this.i++;
+		if (this.isClose()) this.setNode();
+		else {
+			this.start = this.i;
+			this.state = this.AttrName;
+		}
+	}
+	// 设置文本节点
+	setText() {
+		var back, text = this.section();
+		if (!text) return;
+		text = (cfg.onText && cfg.onText(text, () => back = true)) || text;
+		if (back) {
+			this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);
+			let j = this.start + text.length;
+			for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);
+			return;
+		}
+		if (!this.pre) {
+			// 合并空白符
+			var tmp = [];
+			for (let i = text.length, c; c = text[--i];)
+				if (!blankChar[c] || (!blankChar[tmp[0]] && (c = ' '))) tmp.unshift(c);
+			text = tmp.join('');
+			if (text == ' ') return;
+		}
+		// 处理实体
+		var siblings = this.siblings(),
+			i = -1,
+			j, en;
+		while (1) {
+			if ((i = text.indexOf('&', i + 1)) == -1) break;
+			if ((j = text.indexOf(';', i + 2)) == -1) break;
+			if (text[i + 1] == '#') {
+				en = parseInt((text[i + 2] == 'x' ? '0' : '') + text.substring(i + 2, j));
+				if (!isNaN(en)) text = text.substr(0, i) + String.fromCharCode(en) + text.substring(j + 1);
+			} else {
+				en = text.substring(i + 1, j);
+				// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+				if (en == 'nbsp') text = text.substr(0, i) + '\xA0' + text.substr(j + 1); // 解决 &nbsp; 失效
+				else if (en != 'lt' && en != 'gt' && en != 'amp' && en != 'ensp' && en != 'emsp' && en != 'quot' && en != 'apos') {
+					i && siblings.push({
+						type: 'text',
+						text: text.substr(0, i)
+					})
+					siblings.push({
+						type: 'text',
+						text: `&${en};`,
+						en: 1
+					})
+					text = text.substr(j + 1);
+					i = -1;
+				}
+				// #endif
+				// #ifdef MP-BAIDU || MP-ALIPAY || MP-TOUTIAO
+				if (entities[en]) text = text.substr(0, i) + entities[en] + text.substr(j + 1);
+				// #endif
+			}
+		}
+		text && siblings.push({
+			type: 'text',
+			text
+		})
+	}
+	// 设置元素节点
+	setNode() {
+		var node = {
+				name: this.tagName.toLowerCase(),
+				attrs: this.attrs
+			},
+			close = cfg.selfClosingTags[node.name] || (this.xml && this.data[this.i] == '/');
+		this.attrs = {};
+		if (!cfg.ignoreTags[node.name]) {
+			this.matchAttr(node);
+			if (!close) {
+				node.children = [];
+				if (node.name == 'pre' && cfg.highlight) {
+					this.remove(node);
+					this.pre = node.pre = true;
+				}
+				this.siblings().push(node);
+				this.STACK.push(node);
+			} else if (!cfg.filter || cfg.filter(node, this) != false)
+				this.siblings().push(node);
+		} else {
+			if (!close) this.remove(node);
+			else if (node.name == 'source') {
+				var parent = this.STACK[this.STACK.length - 1],
+					attrs = node.attrs;
+				if (parent && attrs.src)
+					if (parent.name == 'video' || parent.name == 'audio')
+						parent.attrs.source.push(attrs.src);
+					else {
+						var i, media = attrs.media;
+						if (parent.name == 'picture' && !parent.attrs.src && !(attrs.src.indexOf('.webp') && system.includes('iOS')) &&
+							(!media || (media.includes('px') &&
+								(((i = media.indexOf('min-width')) != -1 && (i = media.indexOf(':', i + 8)) != -1 && screenWidth > parseInt(
+										media.substr(i + 1))) ||
+									((i = media.indexOf('max-width')) != -1 && (i = media.indexOf(':', i + 8)) != -1 && screenWidth < parseInt(
+										media.substr(i + 1)))))))
+							parent.attrs.src = attrs.src;
+					}
+			} else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;
+		}
+		if (this.data[this.i] == '/') this.i++;
+		this.start = this.i + 1;
+		this.state = this.Text;
+	}
+	// 移除标签
+	remove(node) {
+		var name = node.name,
+			j = this.i;
+		while (1) {
+			if ((this.i = this.data.indexOf('</', this.i + 1)) == -1) {
+				if (name == 'pre' || name == 'svg') this.i = j;
+				else this.i = this.data.length;
+				return;
+			}
+			this.start = (this.i += 2);
+			while (!blankChar[this.data[this.i]] && !this.isClose()) this.i++;
+			if (this.getName(this.section()) == name) {
+				// 代码块高亮
+				if (name == 'pre') {
+					this.data = this.data.substr(0, j + 1) + cfg.highlight(this.data.substring(j + 1, this.i - 5), node.attrs) +
+						this.data.substr(this.i - 5);
+					return this.i = j;
+				} else if (name == 'style')
+					this.CssHandler.getStyle(this.data.substring(j + 1, this.i - 7));
+				else if (name == 'title')
+					this.title = this.data.substring(j + 1, this.i - 7);
+				if ((this.i = this.data.indexOf('>', this.i)) == -1) this.i = this.data.length;
+				// 处理 svg
+				if (name == 'svg') {
+					var src = this.data.substring(j, this.i + 1);
+					if (!node.attrs.xmlns) src = ' xmlns="http://www.w3.org/2000/svg"' + src;
+					var i = j;
+					while (this.data[j] != '<') j--;
+					src = this.data.substring(j, i) + src;
+					var parent = this.STACK[this.STACK.length - 1];
+					if (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline'))
+						parent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style;
+					this.siblings().push({
+						name: 'img',
+						attrs: {
+							src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+							ignore: 'T'
+						}
+					})
+				}
+				return;
+			}
+		}
+	}
+	// 处理属性
+	matchAttr(node) {
+		var attrs = node.attrs,
+			style = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''),
+			styleObj = {};
+		if (attrs.id) {
+			if (this.compress & 1) attrs.id = void 0;
+			else if (this.useAnchor) this.bubble();
+		}
+		if ((this.compress & 2) && attrs.class) attrs.class = void 0;
+		switch (node.name) {
+			case 'img':
+				if (attrs['data-src']) {
+					attrs.src = attrs.src || attrs['data-src'];
+					attrs['data-src'] = void 0;
+				}
+				if (attrs.src && !attrs.ignore) {
+					if (this.bubble()) attrs.i = (this.imgNum++).toString();
+					else attrs.ignore = 'T';
+				}
+				break;
+			case 'a':
+			case 'ad':
+			// #ifdef APP-PLUS
+			case 'iframe':
+			case 'embed':
+			// #endif
+				this.bubble();
+				break;
+			case 'font':
+				if (attrs.color) {
+					styleObj['color'] = attrs.color;
+					attrs.color = void 0;
+				}
+				if (attrs.face) {
+					styleObj['font-family'] = attrs.face;
+					attrs.face = void 0;
+				}
+				if (attrs.size) {
+					var size = parseInt(attrs.size);
+					if (size < 1) size = 1;
+					else if (size > 7) size = 7;
+					var map = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];
+					styleObj['font-size'] = map[size - 1];
+					attrs.size = void 0;
+				}
+				break;
+			case 'video':
+			case 'audio':
+				if (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]);
+				else this[`${node.name}Num`]++;
+				if (node.name == 'video') {
+					if (attrs.width) {
+						style = `width:${parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')};${style}`;
+						attrs.width = void 0;
+					}
+					if (attrs.height) {
+						style = `height:${parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')};${style}`;
+						attrs.height = void 0;
+					}
+					if (this.videoNum > 3) node.lazyLoad = true;
+				}
+				attrs.source = [];
+				if (attrs.src) attrs.source.push(attrs.src);
+				if (!attrs.controls && !attrs.autoplay)
+					console.warn(`存在没有 controls 属性的 ${node.name} 标签,可能导致无法播放`, node);
+				this.bubble();
+				break;
+			case 'td':
+			case 'th':
+				if (attrs.colspan || attrs.rowspan)
+					for (var k = this.STACK.length, item; item = this.STACK[--k];)
+						if (item.name == 'table') {
+							item.c = void 0;
+							break;
+						}
+		}
+		if (attrs.align) {
+			styleObj['text-align'] = attrs.align;
+			attrs.align = void 0;
+		}
+		// 压缩 style
+		var styles = style.replace(/&quot;/g, '"').replace(/&amp;/g, '&').split(';');
+		style = '';
+		for (var i = 0, len = styles.length; i < len; i++) {
+			var info = styles[i].split(':');
+			if (info.length < 2) continue;
+			let key = info[0].trim().toLowerCase(),
+				value = info.slice(1).join(':').trim();
+			if (value.includes('-webkit') || value.includes('-moz') || value.includes('-ms') || value.includes('-o') || value
+				.includes(
+					'safe'))
+				style += `;${key}:${value}`;
+			else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import'))
+				styleObj[key] = value;
+		}
+		if (node.name == 'img' && parseInt(styleObj.width || attrs.width) > screenWidth)
+			styleObj.height = 'auto';
+		for (var key in styleObj) {
+			var value = styleObj[key];
+			if (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1;
+			// 填充链接
+			if (value.includes('url')) {
+				var j = value.indexOf('(');
+				if (j++ != -1) {
+					while (value[j] == '"' || value[j] == "'" || blankChar[value[j]]) j++;
+					value = value.substr(0, j) + this.getUrl(value.substr(j));
+				}
+			}
+			// 转换 rpx
+			else if (value.includes('rpx'))
+				value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * screenWidth / 750 + 'px');
+			else if (key == 'white-space' && value.includes('pre'))
+				this.pre = node.pre = true;
+			style += `;${key}:${value}`;
+		}
+		style = style.substr(1);
+		if (style) attrs.style = style;
+	}
+	// 节点出栈处理
+	popNode(node) {
+		// 空白符处理
+		if (node.pre) {
+			node.pre = this.pre = void 0;
+			for (let i = this.STACK.length; i--;)
+				if (this.STACK[i].pre)
+					this.pre = true;
+		}
+		if (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false))
+			return this.siblings().pop();
+		var attrs = node.attrs;
+		// 替换一些标签名
+		if (node.name == 'picture') {
+			node.name = 'img';
+			if (!attrs.src && (node.children[0] || '').name == 'img')
+				attrs.src = node.children[0].attrs.src;
+			if (attrs.src && !attrs.ignore)
+				attrs.i = (this.imgNum++).toString();
+			return node.children = void 0;
+		}
+		if (cfg.blockTags[node.name]) node.name = 'div';
+		else if (!cfg.trustTags[node.name]) node.name = 'span';
+		// 处理列表
+		if (node.c) {
+			if (node.name == 'ul') {
+				var floor = 1;
+				for (let i = this.STACK.length; i--;)
+					if (this.STACK[i].name == 'ul') floor++;
+				if (floor != 1)
+					for (let i = node.children.length; i--;)
+						node.children[i].floor = floor;
+			} else if (node.name == 'ol') {
+				for (let i = 0, num = 1, child; child = node.children[i++];)
+					if (child.name == 'li') {
+						child.type = 'ol';
+						child.num = ((num, type) => {
+							if (type == 'a') return String.fromCharCode(97 + (num - 1) % 26);
+							if (type == 'A') return String.fromCharCode(65 + (num - 1) % 26);
+							if (type == 'i' || type == 'I') {
+								num = (num - 1) % 99 + 1;
+								var one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
+									ten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
+									res = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || '');
+								if (type == 'i') return res.toLowerCase();
+								return res;
+							}
+							return num;
+						})(num++, attrs.type) + '.';
+					}
+			}
+		}
+		// 处理表格的边框
+		if (node.name == 'table') {
+			var padding = attrs.cellpadding,
+				spacing = attrs.cellspacing,
+				border = attrs.border;
+			if (node.c) {
+				this.bubble();
+				if (!padding) padding = 2;
+				if (!spacing) spacing = 2;
+			}
+			if (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`;
+			if (spacing) attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`;
+			if (border || padding)
+				(function f(ns) {
+					for (var i = 0, n; n = ns[i]; i++) {
+						if (n.name == 'th' || n.name == 'td') {
+							if (border) n.attrs.style = `border:${border}px solid gray;${n.attrs.style}`;
+							if (padding) n.attrs.style = `padding:${padding}px;${n.attrs.style}`;
+						} else f(n.children || []);
+					}
+				})(node.children)
+		}
+		this.CssHandler.pop && this.CssHandler.pop(node);
+		// 自动压缩
+		if (node.name == 'div' && !Object.keys(attrs).length) {
+			var siblings = this.siblings();
+			if (node.children.length == 1 && node.children[0].name == 'div')
+				siblings[siblings.length - 1] = node.children[0];
+		}
+	}
+	// 工具函数
+	bubble() {
+		for (var i = this.STACK.length, item; item = this.STACK[--i];) {
+			if (cfg.richOnlyTags[item.name]) {
+				if (item.name == 'table' && !Object.hasOwnProperty.call(item, 'c')) item.c = 1;
+				return false;
+			}
+			item.c = 1;
+		}
+		return true;
+	}
+	getName = val => this.xml ? val : val.toLowerCase();
+	getUrl(url) {
+		if (url[0] == '/') {
+			if (url[1] == '/') url = this.protocol + ':' + url;
+			else if (this.domain) url = this.domain + url;
+		} else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))
+			url = this.domain + '/' + url;
+		return url;
+	}
+	isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');
+	section = () => this.data.substring(this.start, this.i);
+	siblings = () => this.STACK.length ? this.STACK[this.STACK.length - 1].children : this.DOM;
+	// 状态机
+	Text(c) {
+		if (c == '<') {
+			var next = this.data[this.i + 1],
+				isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+			if (isLetter(next)) {
+				this.setText();
+				this.start = this.i + 1;
+				this.state = this.TagName;
+			} else if (next == '/') {
+				this.setText();
+				if (isLetter(this.data[++this.i + 1])) {
+					this.start = this.i + 1;
+					this.state = this.EndTag;
+				} else
+					this.Comment();
+			} else if (next == '!') {
+				this.setText();
+				this.Comment();
+			}
+		}
+	}
+	Comment() {
+		var key;
+		if (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->';
+		else if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>';
+		else key = '>';
+		if ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length;
+		else this.i += key.length - 1;
+		this.start = this.i + 1;
+		this.state = this.Text;
+	}
+	TagName(c) {
+		if (blankChar[c]) {
+			this.tagName = this.section();
+			while (blankChar[this.data[this.i]]) this.i++;
+			if (this.isClose()) this.setNode();
+			else {
+				this.start = this.i;
+				this.state = this.AttrName;
+			}
+		} else if (this.isClose()) {
+			this.tagName = this.section();
+			this.setNode();
+		}
+	}
+	AttrName(c) {
+		var blank = blankChar[c];
+		if (blank) {
+			this.attrName = this.section();
+			c = this.data[this.i];
+		}
+		if (c == '=') {
+			if (!blank) this.attrName = this.section();
+			while (blankChar[this.data[++this.i]]);
+			this.start = this.i--;
+			this.state = this.AttrValue;
+		} else if (blank) this.setAttr();
+		else if (this.isClose()) {
+			this.attrName = this.section();
+			this.setAttr();
+		}
+	}
+	AttrValue(c) {
+		if (c == '"' || c == "'") {
+			this.start++;
+			if ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length;
+			this.attrVal = this.section();
+			this.i++;
+		} else {
+			for (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++);
+			this.attrVal = this.section();
+		}
+		this.setAttr();
+	}
+	EndTag(c) {
+		if (blankChar[c] || c == '>' || c == '/') {
+			var name = this.getName(this.section());
+			for (var i = this.STACK.length; i--;)
+				if (this.STACK[i].name == name) break;
+			if (i != -1) {
+				var node;
+				while ((node = this.STACK.pop()).name != name);
+				this.popNode(node);
+			} else if (name == 'p' || name == 'br')
+				this.siblings().push({
+					name,
+					attrs: {}
+				});
+			this.i = this.data.indexOf('>', this.i);
+			this.start = this.i + 1;
+			if (this.i == -1) this.i = this.data.length;
+			else this.state = this.Text;
+		}
+	}
+}
+module.exports = MpHtmlParser;

+ 80 - 0
components/jyf-parser/libs/config.js

@@ -0,0 +1,80 @@
+/* 配置文件 */
+// #ifdef MP-WEIXIN
+const canIUse = wx.canIUse('editor'); // 高基础库标识,用于兼容
+// #endif
+module.exports = {
+	// 过滤器函数
+	filter: null,
+	// 代码高亮函数
+	highlight: null,
+	// 文本处理函数
+	onText: null,
+	blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'),
+	// 块级标签,将被转为 div
+	blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,section' + (
+		// #ifdef MP-WEIXIN
+		canIUse ? '' :
+		// #endif
+		',pre')),
+	// 将被移除的标签
+	ignoreTags: makeMap(
+		'area,base,basefont,canvas,command,frame,input,isindex,keygen,link,map,meta,param,script,source,style,svg,textarea,title,track,use,wbr'
+		// #ifdef MP-WEIXIN
+		+ (canIUse ? ',rp' : '')
+		// #endif
+		// #ifndef APP-PLUS
+		+ ',embed,iframe'
+		// #endif
+	),
+	// 只能被 rich-text 显示的标签
+	richOnlyTags: makeMap('a,colgroup,fieldset,legend,picture,table'
+		// #ifdef MP-WEIXIN
+		+ (canIUse ? ',bdi,bdo,caption,rt,ruby' : '')
+		// #endif
+	),
+	// 自闭合的标签
+	selfClosingTags: makeMap(
+		'area,base,basefont,br,col,circle,ellipse,embed,frame,hr,img,input,isindex,keygen,line,link,meta,param,path,polygon,rect,source,track,use,wbr'
+	),
+	// 信任的属性
+	trustAttrs: makeMap(
+		'align,alt,app-id,author,autoplay,border,cellpadding,cellspacing,class,color,colspan,controls,data-src,dir,face,height,href,id,ignore,loop,media,muted,name,path,poster,rowspan,size,span,src,start,style,type,unit-id,width,xmlns'
+	),
+	// bool 型的属性
+	boolAttrs: makeMap('autoplay,controls,ignore,loop,muted'),
+	// 信任的标签
+	trustTags: makeMap(
+		'a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'
+		// #ifdef MP-WEIXIN
+		+ (canIUse ? ',bdi,bdo,caption,pre,rt,ruby' : '')
+		// #endif
+		// #ifdef APP-PLUS
+		+ ',embed,iframe'
+		// #endif
+	),
+	// 默认的标签样式
+	userAgentStyles: {
+		address: 'font-style:italic',
+		big: 'display:inline;font-size:1.2em',
+		blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px',
+		caption: 'display:table-caption;text-align:center',
+		center: 'text-align:center',
+		cite: 'font-style:italic',
+		dd: 'margin-left:40px',
+		img: 'max-width:100%',
+		mark: 'background-color:yellow',
+		picture: 'max-width:100%',
+		pre: 'font-family:monospace;white-space:pre;overflow:scroll',
+		s: 'text-decoration:line-through',
+		small: 'display:inline;font-size:0.8em',
+		u: 'text-decoration:underline'
+	}
+}
+
+function makeMap(str) {
+	var map = {},
+		list = str.split(',');
+	for (var i = list.length; i--;)
+		map[list[i]] = true;
+	return map;
+}

+ 35 - 0
components/jyf-parser/libs/handler.sjs

@@ -0,0 +1,35 @@
+var inlineTags = {
+	abbr: 1,
+	b: 1,
+	big: 1,
+	code: 1,
+	del: 1,
+	em: 1,
+	i: 1,
+	ins: 1,
+	label: 1,
+	q: 1,
+	small: 1,
+	span: 1,
+	strong: 1
+}
+export default {
+	// 从顶层标签的样式中取出一些给 rich-text
+	getStyle: function(style) {
+		if (style) {
+			var i, j, res = '';
+			if ((i = style.indexOf('display')) != -1)
+				res = style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
+			if ((i = style.indexOf('float')) != -1)
+				res += ';' + style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
+			return res;
+		}
+	},
+	getNode: function(item) {
+		return [item];
+	},
+	// 是否通过 rich-text 显示
+	useRichText: function(item) {
+		return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1;
+	}
+}

+ 44 - 0
components/jyf-parser/libs/handler.wxs

@@ -0,0 +1,44 @@
+var inlineTags = {
+	abbr: 1,
+	b: 1,
+	big: 1,
+	code: 1,
+	del: 1,
+	em: 1,
+	i: 1,
+	ins: 1,
+	label: 1,
+	q: 1,
+	small: 1,
+	span: 1,
+	strong: 1
+}
+module.exports = {
+	// 从顶层标签的样式中取出一些给 rich-text
+	getStyle: function(style) {
+		if (style) {
+			var i, j, res = '';
+			if ((i = style.indexOf('display')) != -1)
+				res = style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
+			if ((i = style.indexOf('float')) != -1)
+				res += ';' + style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
+			return res;
+		}
+	},
+	// 处理懒加载
+	getNode: function(item, imgLoad) {
+		if (!imgLoad && item.attrs.i != '0') {
+			var img = {
+				name: 'img',
+				attrs: JSON.parse(JSON.stringify(item.attrs))
+			}
+			delete img.attrs.src;
+			img.attrs.style += ';width:20px;height:20px';
+			return [img];
+		} else return [item];
+	},
+	// 是否通过 rich-text 显示
+	useRichText: function(item) {
+		return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1;
+	}
+}

+ 476 - 0
components/jyf-parser/libs/trees.vue

@@ -0,0 +1,476 @@
+<!--
+  trees 递归显示组件
+  github:https://github.com/jin-yufeng/Parser 
+  docs:https://jin-yufeng.github.io/Parser
+  插件市场:https://ext.dcloud.net.cn/plugin?id=805
+  author:JinYufeng
+  update:2020/04/13
+-->
+<template>
+	<view class="interlayer">
+		<block v-for="(n, index) in nodes" v-bind:key="index">
+			<!--图片-->
+			<!--#ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY || APP-PLUS-->
+			<rich-text v-if="n.name=='img'" :id="n.attrs.id" class="_img" :style="''+handler.getStyle(n.attrs.style)" :nodes="handler.getNode(n,!lazyLoad||imgLoad)"
+			 :data-attrs="n.attrs" @tap="imgtap" @longpress="imglongtap" />
+			<!--#endif-->
+			<!--#ifdef MP-BAIDU || MP-TOUTIAO-->
+			<rich-text v-if="n.name=='img'" :id="n.attrs.id" class="_img" :style="n.attrs.contain" :nodes='[n]' :data-attrs="n.attrs"
+			 @tap="imgtap" @longpress="imglongtap" />
+			<!--#endif-->
+			<!--文本-->
+			<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="n.decode" class="_entity" :nodes="[n]"></rich-text>
+			<!--#endif-->
+			<text v-else-if="n.type=='text'" decode>{{n.text}}</text>
+			<text v-else-if="n.name=='br'">\n</text>
+			<!--视频-->
+			<view v-else-if="n.name=='video'">
+				<view v-if="(!loadVideo||n.lazyLoad)&&!(controls[n.attrs.id]&&controls[n.attrs.id].play)" :id="n.attrs.id" :class="'_video '+(n.attrs.class||'')"
+				 :style="n.attrs.style" @tap="_loadVideo" />
+				<video v-else :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay||(controls[n.attrs.id]&&controls[n.attrs.id].play)"
+				 :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :poster="n.attrs.poster" :src="n.attrs.source[(controls[n.attrs.id]&&controls[n.attrs.id].index)||0]"
+				 :unit-id="n.attrs['unit-id']" :data-id="n.attrs.id" data-from="video" data-source="source" @error="error" @play="play" />
+			</view>
+			<!--音频-->
+			<audio v-else-if="n.name=='audio'" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author" :autoplay="n.attrs.autoplay"
+			 :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster" :src="n.attrs.source[(controls[n.attrs.id]&&controls[n.attrs.id].index)||0]"
+			 :data-id="n.attrs.id" data-from="audio" data-source="source" @error="error" @play="play" />
+			<!--链接-->
+			<view v-else-if="n.name=='a'" :class="'_a '+(n.attrs.class||'')" hover-class="_hover" :style="n.attrs.style"
+			 :data-attrs="n.attrs" @tap="linkpress">
+				<trees class="_span" :nodes="n.children" />
+			</view>
+			<!--广告(按需打开注释)-->
+			<!--#ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO-->
+			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :unit-id="n.attrs['unit-id']"
+			 data-from="ad" @error="error" />-->
+			<!--#endif-->
+			<!--#ifdef MP-BAIDU-->
+			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :appid="n.attrs.appid"
+			 :apid="n.attrs.apid" :type="n.attrs.type" data-from="ad" @error="error" />-->
+			<!--#endif-->
+			<!--#ifdef APP-PLUS-->
+			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :adpid="n.attrs.adpid"
+			 data-from="ad" @error="error" />-->
+			<!--#endif-->
+			<!--列表-->
+			<view v-else-if="n.name=='li'" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:flex'">
+				<view v-if="n.type=='ol'" class="_ol-bef">{{n.num}}</view>
+				<view v-else class="_ul-bef">
+					<view v-if="n.floor%3==0" class="_ul-p1">█</view>
+					<view v-else-if="n.floor%3==2" class="_ul-p2" />
+					<view v-else class="_ul-p1" style="border-radius:50%">█</view>
+				</view>
+				<!--#ifdef MP-ALIPAY-->
+				<view class="_li">
+					<trees :nodes="n.children" />
+				</view>
+				<!--#endif-->
+				<!--#ifndef MP-ALIPAY-->
+				<trees class="_li" :nodes="n.children" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+				<!--#endif-->
+			</view>
+			<!--表格-->
+			<view v-else-if="n.name=='table'&&n.c" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:table'">
+				<view v-for="(tbody, i) in n.children" v-bind:key="i" :class="tbody.attrs.class" :style="(tbody.attrs.style||'')+(tbody.name[0]=='t'?';display:table-'+(tbody.name=='tr'?'row':'row-group'):'')">
+					<view v-for="(tr, j) in tbody.children" v-bind:key="j" :class="tr.attrs.class" :style="(tr.attrs.style||'')+(tr.name[0]=='t'?';display:table-'+(tr.name=='tr'?'row':'cell'):'')">
+						<trees v-if="tr.name=='td'" :nodes="tr.children" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+						<block v-else>
+							<!--#ifdef MP-ALIPAY-->
+							<view v-for="(td, k) in tr.children" v-bind:key="k" :class="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')">
+								<trees :nodes="td.children" />
+							</view>
+							<!--#endif-->
+							<!--#ifndef MP-ALIPAY-->
+							<trees v-for="(td, k) in tr.children" v-bind:key="k" :class="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')"
+							 :nodes="td.children" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+							<!--#endif-->
+						</block>
+					</view>
+				</view>
+			</view>
+			<!--#ifdef APP-PLUS-->
+			<iframe v-else-if="n.name=='iframe'" :style="n.attrs.style" :allowfullscreen="n.attrs.allowfullscreen" :frameborder="n.attrs.frameborder"
+			 :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
+			<embed v-else-if="n.name=='embed'" :style="n.attrs.style" :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
+			<!--#endif-->
+			<!--富文本-->
+			<!--#ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY || APP-PLUS-->
+			<rich-text v-else-if="handler.useRichText(n)" :id="n.attrs.id" :class="'_p __'+n.name" :nodes="[n]" />
+			<!--#endif-->
+			<!--#ifdef MP-BAIDU || MP-TOUTIAO-->
+			<rich-text v-else-if="!(n.c||n.continue)" :id="n.attrs.id" :class="_p" :style="n.attrs.contain" :nodes="[n]" />
+			<!--#endif-->
+			<!--#ifdef MP-ALIPAY-->
+			<view v-else :id="n.attrs.id" :class="'_'+n.name+' '+(n.attrs.class||'')" :style="n.attrs.style">
+				<trees :nodes="n.children" />
+			</view>
+			<!--#endif-->
+			<!--#ifndef MP-ALIPAY-->
+			<trees v-else :class="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')" :style="n.attrs.style" :nodes="n.children"
+			 :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+			<!--#endif-->
+		</block>
+	</view>
+</template>
+<script module="handler" lang="wxs" src="./handler.wxs"></script>
+<script module="handler" lang="sjs" src="./handler.sjs"></script>
+<script>
+	global.Parser = {};
+	import trees from './trees'
+	export default {
+		components: {
+			trees
+		},
+		name: 'trees',
+		data() {
+			return {
+				controls: {},
+				// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+				imgLoad: false,
+				// #endif
+				// #ifndef APP-PLUS
+				loadVideo: true
+				// #endif
+			}
+		},
+		props: {
+			nodes: Array,
+			// #ifdef MP-WEIXIN || MP-QQ || H5 || APP-PLUS
+			lazyLoad: Boolean,
+			// #endif
+			// #ifdef APP-PLUS
+			loadVideo: Boolean
+			// #endif
+		},
+		mounted() {
+			// 获取顶层组件
+			this.top = this.$parent;
+			while (this.top.$options.name != 'parser') {
+				if (this.top.top) {
+					this.top = this.top.top;
+					break;
+				}
+				this.top = this.top.$parent;
+			}
+		},
+		// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+		beforeDestroy() {
+			if (this.observer)
+				this.observer.disconnect();
+		},
+		// #endif
+		methods: {
+			// #ifndef MP-ALIPAY
+			play(e) {
+				if (this.top.videoContexts.length > 1 && this.top.autopause)
+					for (var i = this.top.videoContexts.length; i--;)
+						if (this.top.videoContexts[i].id != e.currentTarget.dataset.id)
+							this.top.videoContexts[i].pause();
+			},
+			// #endif
+			imgtap(e) {
+				var attrs = e.currentTarget.dataset.attrs;
+				if (!attrs.ignore) {
+					var preview = true, data = {
+						id: e.target.id,
+						src: attrs.src,
+						ignore: () => preview = false
+					};
+					global.Parser.onImgtap && global.Parser.onImgtap(data);
+					this.top.$emit('imgtap', data);
+					if (preview) {
+						var urls = this.top.imgList,
+							current = urls[attrs.i] ? parseInt(attrs.i) : (urls = [attrs.src], 0);
+						uni.previewImage({
+							current,
+							urls
+						})
+					}
+				}
+			},
+			imglongtap(e) {
+				var attrs = e.item.dataset.attrs;
+				if (!attrs.ignore)
+					this.top.$emit('imglongtap', {
+						id: e.target.id,
+						src: attrs.src
+					})
+			},
+			linkpress(e) {
+				var jump = true,
+					attrs = e.currentTarget.dataset.attrs;
+				attrs.ignore = () => jump = false;
+				global.Parser.onLinkpress && global.Parser.onLinkpress(attrs);
+				this.top.$emit('linkpress', attrs);
+				if (jump) {
+					// #ifdef MP
+					if (attrs['app-id']) {
+						return uni.navigateToMiniProgram({
+							appId: attrs['app-id'],
+							path: attrs.path
+						})
+					}
+					// #endif
+					if (attrs.href) {
+						if (attrs.href[0] == '#') {
+							if (this.top.useAnchor)
+								this.top.navigateTo({
+									id: attrs.href.substring(1)
+								})
+						} else if (attrs.href.indexOf('http') == 0 || attrs.href.indexOf('//') == 0) {
+							// #ifdef APP-PLUS
+							plus.runtime.openWeb(attrs.href);
+							// #endif
+							// #ifndef APP-PLUS
+							uni.setClipboardData({
+								data: attrs.href,
+								success: () =>
+									uni.showToast({
+										title: '链接已复制'
+									})
+							})
+							// #endif
+						} else
+							uni.navigateTo({
+								url: attrs.href
+							})
+					}
+				}
+			},
+			error(e) {
+				var context, target = e.currentTarget,
+					source = target.dataset.from;
+				if (source == 'video' || source == 'audio') {
+					// 加载其他 source
+					var index = this.controls[target.id] ? this.controls[target.id].index + 1 : 1;
+					if (index < target.dataset.source.length)
+						this.$set(this.controls, target.id + '.index', index);
+					if (source == 'video') context = uni.createVideoContext(target.id, this);
+				}
+				this.top && this.top.$emit('error', {
+					source,
+					target,
+					errMsg: e.detail.errMsg,
+					errCode: e.detail.errCode,
+					context
+				});
+			},
+			_loadVideo(e) {
+				this.$set(this.controls, e.currentTarget.id, {
+					play: true,
+					index: 0
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	/* 在这里引入自定义样式 */
+
+	/* 链接和图片效果 */
+	._a {
+		display: inline;
+		color: #366092;
+		word-break: break-all;
+		padding: 1.5px 0 1.5px 0;
+	}
+
+	._hover {
+		opacity: 0.7;
+		text-decoration: underline;
+	}
+
+	._img {
+		display: inline-block;
+		text-indent: 0;
+	}
+
+	/* #ifdef MP-WEIXIN */
+	:host {
+		display: inline;
+	}
+
+	/* #endif */
+
+	/* #ifdef MP */
+	.interlayer {
+		align-content: inherit;
+		align-items: inherit;
+		display: inherit;
+		flex-direction: inherit;
+		flex-wrap: inherit;
+		justify-content: inherit;
+		width: 100%;
+		white-space: inherit;
+	}
+
+	/* #endif */
+
+	._b,
+	._strong {
+		font-weight: bold;
+	}
+
+	._blockquote,
+	._div,
+	._p,
+	._ol,
+	._ul,
+	._li {
+		display: block;
+	}
+
+	._code {
+		font-family: monospace;
+	}
+
+	._del {
+		text-decoration: line-through;
+	}
+
+	._em,
+	._i {
+		font-style: italic;
+	}
+
+	._h1 {
+		font-size: 2em;
+	}
+
+	._h2 {
+		font-size: 1.5em;
+	}
+
+	._h3 {
+		font-size: 1.17em;
+	}
+
+	._h5 {
+		font-size: 0.83em;
+	}
+
+	._h6 {
+		font-size: 0.67em;
+	}
+
+	._h1,
+	._h2,
+	._h3,
+	._h4,
+	._h5,
+	._h6 {
+		display: block;
+		font-weight: bold;
+	}
+
+	._ins {
+		text-decoration: underline;
+	}
+
+	._li {
+		flex: 1;
+		width: 0;
+	}
+
+	._ol-bef {
+		margin-right: 5px;
+		text-align: right;
+		width: 36px;
+	}
+
+	._ul-bef {
+		line-height: normal;
+		margin: 0 12px 0 23px;
+	}
+
+	._ol-bef,
+	._ul_bef {
+		flex: none;
+		user-select: none;
+	}
+
+	._ul-p1 {
+		display: inline-block;
+		height: 0.3em;
+		line-height: 0.3em;
+		overflow: hidden;
+		width: 0.3em;
+	}
+
+	._ul-p2 {
+		border: 0.05em solid black;
+		border-radius: 50%;
+		display: inline-block;
+		height: 0.23em;
+		width: 0.23em;
+	}
+
+	._q::before {
+		content: '"';
+	}
+
+	._q::after {
+		content: '"';
+	}
+
+	._sub {
+		font-size: smaller;
+		vertical-align: sub;
+	}
+
+	._sup {
+		font-size: smaller;
+		vertical-align: super;
+	}
+
+	/* #ifndef MP-WEIXIN */
+	._abbr,
+	._b,
+	._code,
+	._del,
+	._em,
+	._i,
+	._ins,
+	._label,
+	._q,
+	._span,
+	._strong,
+	._sub,
+	._sup {
+		display: inline;
+	}
+
+	/* #endif */
+
+	/* #ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY */
+	.__bdo,
+	.__bdi,
+	.__ruby,
+	.__rt,
+	._entity {
+		display: inline-block;
+	}
+
+	/* #endif */
+	._video {
+		background-color: black;
+		display: inline-block;
+		height: 225px;
+		position: relative;
+		width: 300px;
+	}
+
+	._video::after {
+		border-color: transparent transparent transparent white;
+		border-style: solid;
+		border-width: 15px 0 15px 30px;
+		content: '';
+		left: 50%;
+		margin: -15px 0 0 -15px;
+		position: absolute;
+		top: 50%;
+	}
+</style>

+ 406 - 0
components/mpvue-calendar/browser-style.css

@@ -0,0 +1,406 @@
+.mpvue-calendar {
+    margin:auto;
+    width: 100%;
+    min-width:350px;
+    background: #fff;
+    user-select:none;
+    position: relative;
+}
+.calendar-tools{
+    height:40px;
+    font-size: 20px;
+    line-height: 40px;
+    color:#5e7a88;
+    box-shadow: 0px 4px 8px rgba(25, 47, 89, 0.1);
+    margin-bottom: 20px;
+    border-top: 1px solid rgba(200, 200, 200, .1);
+}
+.calendar-tools span{
+    cursor: pointer;
+}
+.calendar-prev{
+    width: 14.28571429%;
+    float:left;
+    text-align: center;
+}
+.calendar-prev img, .calendar-next img{
+    width: 34px;
+    height: 34px;
+}
+.calendar-info{
+    font-size:16px;
+    line-height: 1.3;
+    text-align: center;
+    width: 220px;
+    margin: 0 auto;
+}
+.calendar-info>div.mc-month{
+    margin:auto;
+    height:24px;
+    width:100px;
+    text-align: center;
+    color:#5e7a88;
+    overflow: hidden;
+    position: relative;
+}
+.calendar-info>div.mc-month .mc-month-inner{
+    position: absolute;
+    left:0;
+    top:0;
+    height:480px;
+}
+.month-transition{
+    transition:top .5s cubic-bezier(0.075, 0.82, 0.165, 1);
+}
+.calendar-info .mc-month-text{
+    display:block;
+    font-size:28px;
+    height:40px;
+    width:200px;
+    overflow:hidden;
+    text-align:center;
+}
+.calendar-info>div.mc-month .mc-month-inner>span{
+    display: block;
+    font-size: 14px;
+    height:24px;
+    line-height:24px;
+    width:100px;
+    overflow: hidden;
+    text-align: center;
+}
+.calendar-info>div.mc-year{
+    font-size:10px;
+    line-height: 1;
+    color:#999;
+}
+.calendar-next{
+    width: 14.28571429%;
+    float:right;
+    text-align: center;
+}
+.mpvue-calendar table {
+    clear: both;
+    width: 100%;
+    margin-bottom:10px;
+    border-collapse: collapse;
+    color: #444444;
+}
+.mpvue-calendar td {
+    margin:2px !important;
+    padding: 4px;
+    width: 14.28571429%;
+    box-sizing: border-box;
+    text-align: center;
+    vertical-align: middle;
+    font-size:14px;
+    cursor: pointer;
+    position: relative;
+    vertical-align: top;
+}
+.mpvue-calendar td.mc-week{
+    font-size:10px;
+    pointer-events:none !important;
+    cursor: default !important;
+}
+.mpvue-calendar td.disabled {
+    color: #ccc;
+}
+.mpvue-calendar td.disabled div{
+    color: #ccc;
+}
+.mpvue-calendar td span{
+    display:block;
+    height:100%;
+    width:100%;
+    margin:0px auto;
+    border-radius:50%;
+    position: relative;
+    z-index: 3;
+}
+.mpvue-calendar td:not(.disabled) span.mc-date-red{
+    color:#ea6151;
+}
+.mc-today{
+    color: #3b75fb;
+}
+.mpvue-calendar td.selected span{
+    background-color: #3b75fb;
+    color: #fff;
+    border-radius: 50%;
+}
+.mpvue-calendar td .mc-text{
+    box-sizing: border-box;
+    height: 0.7em;
+    overflow: hidden;
+    text-overflow:ellipsis;
+    white-space: nowrap;
+    position: absolute;
+    bottom: 0px;
+    left: 0;
+    right: 0;
+    text-align: center;
+    font-size: 0.7em;
+    line-height: 0.7em;
+    z-index: 4;
+}
+.mpvue-calendar td .isGregorianFestival,
+.mpvue-calendar td .isTerm,
+.mpvue-calendar td .isLunarFestival{
+    color:#ea6151;
+}
+.mpvue-calendar td.selected span.mc-date-red{
+    background-color: #3b75fb;
+    color: #fff;
+}
+.selected .mc-text {
+    color: #fff !important;
+}
+.mpvue-calendar .lunarStyle .mc-text{
+    overflow: visible;
+    bottom: 20%;
+}
+.mpvue-calendar thead td {
+    text-transform: uppercase;
+    height:30px;
+    vertical-align: middle;
+}
+.mc-head {
+    margin-bottom: 10px;
+}
+.mc-head div {
+    overflow: hidden;
+}
+.mc-head-box div {
+    flex:1;
+    text-align: center;
+    font-size: 18px;
+}
+.mc-head-box {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-content: space-between
+}
+.mc-body {
+    padding-bottom: 20px;
+}
+.mc-body tr {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-content: space-between;
+}
+.mc-dot {
+    width: 8px;
+    height: 8px;
+    background-color: #ea6151;
+    border-radius: 50%;
+    position: absolute;
+    bottom: -4px;
+    left: 50%;
+    margin-left: -4px;
+    z-index: 5;
+}
+.remark-text {
+    box-sizing: border-box;
+    height: 0.7em;
+    overflow: hidden;
+    text-overflow:ellipsis;
+    white-space: nowrap;
+    position: absolute;
+    bottom: 0px;
+    left: 0;
+    right: 0;
+    text-align: center;
+    font-size: 0.7em;
+    line-height: 0.7em;
+    z-index: 5;
+}
+.slot-element{
+    line-height: normal;
+    position: absolute;
+    z-index: 5;
+}
+.mpvue-calendar-change{
+    position: absolute;
+    left:0px;
+    top:42px;
+    right:0px;
+    bottom:0px;
+    background:#fff;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-wrap:wrap;
+    overflow: auto;
+    transition:all .5s cubic-bezier(0.075, 0.82, 0.165, 1);
+    opacity: 0;
+    pointer-events: none;
+    transform: translateY(-10px);
+    z-index: 9;
+}
+.mpvue-calendar-change.show{
+    opacity: 1;
+    pointer-events: auto;
+    transform: translateY(0px);
+}
+.mpvue-calendar-change span{
+    margin:4px 2%;
+    display: inline-block;
+    line-height: 30px;
+    border-radius: 20px;
+    text-align:center;
+    color:#999;
+    width: 20%;
+    float: left;
+    text-align: center;
+    border-radius: 40px;
+    box-sizing: border-box;
+    margin-bottom: 4%;
+    cursor: pointer;
+}
+.mpvue-calendar-change span.active{
+    background-color: #587dff;
+    box-shadow: 2px 2px 2px rgba(88, 125, 255, 0.7);
+    color:#fff;
+}
+.mpvue-calendar-change .calendar-week-switch-months{
+    height: 100%;
+}
+.mpvue-calendar-change .calendar-week-switch-months span {
+    margin-bottom: 10px;
+    margin-top: 0px;
+}
+.calendar-years, .calendar-months{
+    height: 50%;
+    width: 100%;
+    padding: 10px;
+    box-sizing: border-box;
+    position: relative;
+}
+.calendar-years:after {
+    content: '';
+    display: block;
+    width: 86%;
+    height: 1px;
+    background-color: #eee;
+    position: absolute;
+    bottom: 2%;
+    left: 7%;
+}
+/*range background*/
+.mc-range-mode .selected .mc-range-bg{
+    content: '';
+    display: block;
+    width: 150%;
+    height: 100%;
+    background-color: #01a1ed;
+    position: relative;
+    top: -100%;
+    left: 50%;
+}
+.mpvue-calendar .mc-range-mode .selected .calendar-date{
+    background-color: transparent;
+}
+.mpvue-calendar .mc-range-mode .mc-range-row-last .calendar-date, .mpvue-calendar .mc-range-mode .mc-range-row-first .calendar-date{
+    border-radius: 4px;
+    background-color: #01a1ed;
+}
+.mpvue-calendar .mc-range-mode .mc-range-month-first.selected .calendar-date, .mpvue-calendar .mc-range-mode .mc-range-month-last.selected .calendar-date{
+    background-color: #01a1ed;
+    border-radius: 4px;
+}
+.mc-range-mode .mc-range-month-last .mc-range-bg{
+    background-color: transparent;
+    border-radius: 4px;
+}
+.mc-range-mode .mc-range-end .mc-range-bg, .mc-range-mode .mc-range-row-last .mc-range-bg{
+    display: none;
+}
+.mc-range-row-first.mc-range-end .mc-range-bg{
+    display: block;
+    margin-left: -50%;
+    width: 50%;
+    border-radius: 4px;
+}
+.mpvue-calendar .mc-range-row-first.mc-range-end.month-first-date .mc-range-bg{
+    margin-left: 0px;
+}
+.mc-range-row-last.mc-range-begin .mc-range-bg{
+    display: block;
+    width: 50%;
+    border-radius: 4px;
+}
+.mpvue-calendar .mc-range-mode .selected.mc-range-second-to-last span{
+    background-color: #01a1ed;
+    border-radius: 4px;
+}
+.mc-range-begin.mc-range-second-to-last{
+    background-color: #01a1ed;
+    border-radius: 4px;
+}
+.mpvue-calendar .mc-range-mode .mc-range-end span.calendar-date, .mpvue-calendar .mc-range-mode .mc-range-begin span.calendar-date{
+    background-color: #3b75fb;
+    color: #fff;
+    border-radius: 50%;
+}
+.mpvue-calendar .mc-range-mode .month-last-date.mc-range-begin .mc-range-bg{
+    display: block;
+    width: 50%;
+    border-radius: 4px;
+}
+.mpvue-calendar .mc-range-mode .month-first-date.mc-range-end .mc-range-bg{
+    display: block;
+    width: 50%;
+    border-radius: 4px;
+    left: 0px;
+}
+.calendar-wrapper .mpvue-calendar .mc-range-mode .mc-range-select-one div.mc-range-bg{
+    display: none;
+}
+.mc-range-mode .mc-range-second-to-last .mc-range-bg{
+    border-radius: 0px 25% 25% 0px;
+}
+.mc-today-element .calendar-date{
+    background-color: rgba(25, 47, 89, 0.1);
+    border-radius: 4px;
+}
+/*week switch*/
+.mpvue-calendar .mc-range-mode.week-switch .month-last-date.mc-range-begin .mc-range-bg{
+    width: 150%;
+    border-radius: 0px 20% 20% 0px;
+}
+.mpvue-calendar .mc-range-mode.week-switch .mc-range-month-last .mc-range-bg{
+    background-color: #01a1ed;
+    border-radius: 0px 20% 20% 0px;
+}
+/*month range*/
+.mpvue-calendar .month-range-mode{
+  border-bottom: 1px solid #f2f2f2;
+  position: relative;
+}
+.mpvue-calendar .mc-month-range-mode-head{
+  box-shadow: 0 4px 8px rgba(25,47,89,.1);
+  padding: 8px 0px;
+  position: sticky;
+  top: 0px;
+  background-color: #fff;
+  z-index: 9;
+}
+.month-range-mode .month-rang-head {
+  text-align: left;
+  margin: 10px 0px;
+  padding-left: 10px;
+}
+.month-range-mode .mc-last-month, .month-range-mode .mc-next-month{
+  opacity: 0 !important;
+}
+.month-text-background{
+  position: absolute;
+  font-size: 140px;
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  line-height: 2.4;
+}

+ 524 - 0
components/mpvue-calendar/calendarinit.js

@@ -0,0 +1,524 @@
+/**
+ * @1900-2100区间内的公历、农历互转
+ * @charset UTF-8
+ * @Author  Jea杨(JJonline@JJonline.Cn)
+ * @Time    2014-7-21
+ * @Time    2016-8-13 Fixed 2033hex、Attribution Annals
+ * @Time    2016-9-25 Fixed lunar LeapMonth Param Bug
+ * @Version 1.0.2
+ * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+ * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+ */
+var calendar = {
+
+  /**
+   * 农历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 = calendar.lYearDays(1987) ;//count=387
+   */
+  lYearDays:function(y) {
+    var i, sum = 348;
+    for(i=0x8000; i>0x8; i>>=1) { sum += (calendar.lunarInfo[y-1900] & i)? 1: 0; }
+    return(sum+calendar.leapDays(y));
+  },
+
+  /**
+   * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+   * @param lunar Year
+   * @return Number (0-12)
+   * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+   */
+  leapMonth:function(y) { //闰字编码 \u95f0
+    return(calendar.lunarInfo[y-1900] & 0xf);
+  },
+
+  /**
+   * 返回农历y年闰月的天数 若该年没有闰月则返回0
+   * @param lunar Year
+   * @return Number (0、29、30)
+   * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+   */
+  leapDays:function(y) {
+    if(calendar.leapMonth(y))  {
+      return((calendar.lunarInfo[y-1900] & 0x10000)? 30: 29);
+    }
+    return(0);
+  },
+
+  /**
+   * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+   * @param lunar Year
+   * @return Number (-1、29、30)
+   * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+   */
+  monthDays:function(y,m) {
+    if(m>12 || m<1) {return -1}//月份参数从1至12,参数错误返回-1
+    return( (calendar.lunarInfo[y-1900] & (0x10000>>m))? 30: 29 );
+  },
+
+  /**
+   * 返回公历(!)y年m月的天数
+   * @param solar Year
+   * @return Number (-1、28、29、30、31)
+   * @eg:var solarMonthDay = calendar.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(calendar.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 calendar.Gan[ganKey-1] + calendar.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 calendar.Gan[offset%10] + calendar.Zhi[offset%12];
+  },
+
+  /**
+   * 传入公历(!)y年获得该年第n个节气的公历日期
+   * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+   * @return day Number
+   * @eg:var _24 = calendar.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 = calendar.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 = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+   */
+  toChinaMonth:function(m) { // 月 => \u6708
+    if(m>12 || m<1) {return -1} //若参数错误 返回-1
+    var s = calendar.nStr3[m-1];
+    s+= "\u6708";//加上月字
+    return s;
+  },
+
+  /**
+   * 传入农历日期数字返回汉字表示法
+   * @param lunar day
+   * @return Cn string
+   * @eg:var cnDay = calendar.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 = calendar.nStr2[Math.floor(d/10)];
+        s += calendar.nStr1[d%10];
+    }
+    return(s);
+  },
+
+  /**
+   * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+   * @param y year
+   * @return Cn string
+   * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+   */
+  getAnimal: function(y) {
+    return calendar.Animals[(y - 4) % 12]
+  },
+
+  /**
+   * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+   * @param y  solar year
+   * @param m  solar month
+   * @param d  solar day
+   * @return JSON object
+   * @eg:console.log(calendar.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=calendar.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 = calendar.nStr1[nWeek];
+    if(nWeek==0) {nWeek =7;}//数字表示周几顺应天朝周一开始的惯例
+    //农历年
+    var year = i;
+
+    var leap = calendar.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 = calendar.leapDays(year); //计算农历闰月天数
+      }
+      else{
+        temp = calendar.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     =   calendar.toGanZhiYear(year);
+
+    //月柱 1900年1月小寒以前为 丙子月(60进制12)
+    var firstNode   = calendar.getTerm(year,(m*2-1));//返回当月「节」为几日开始
+    var secondNode  = calendar.getTerm(year,(m*2));//返回当月「节」为几日开始
+
+    //依据12节气修正干支月
+    var gzM     =   calendar.toGanZhi((y-1900)*12+m+11);
+    if(d>=firstNode) {
+      gzM     =   calendar.toGanZhi((y-1900)*12+m+12);
+    }
+
+    //传入的日期的节气与否
+    var isTerm = false;
+    var Term   = null;
+    if(firstNode==d) {
+      isTerm  = true;
+      Term    = calendar.solarTerm[m*2-2];
+    }
+    if(secondNode==d) {
+      isTerm  = true;
+      Term    = calendar.solarTerm[m*2-1];
+    }
+    //日柱 当月一日与 1900/1/1 相差天数
+    var dayCyclical = Date.UTC(y,sm,1,0,0,0,0)/86400000+25567+10;
+    var gzD = calendar.toGanZhi(dayCyclical+d-1);
+    //该日期所属的星座
+    var astro = calendar.toAstro(m,d);
+
+    return {'lYear':year,'lMonth':month,'lDay':day,'Animal':calendar.getAnimal(year),'IMonthCn':(isLeap?"\u95f0":'')+calendar.toChinaMonth(month),'IDayCn':calendar.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(calendar.lunar2solar(1987,9,10));
+   */
+  lunar2solar:function(y,m,d,isLeapMonth) {   //参数区间1900.1.31~2100.12.1
+    var isLeapMonth = !!isLeapMonth;
+    var leapOffset  = 0;
+    var leapMonth   = calendar.leapMonth(y);
+    var leapDay     = calendar.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  = calendar.monthDays(y,m);
+    var _day = day;
+    //bugFix 2016-9-25
+    //if month is leap, _day use leapDays method
+    if(isLeapMonth) {
+      _day = calendar.leapDays(y,m);
+    }
+    if(y < 1900 || y > 2100 || d > _day) {return -1;}//参数合法性效验
+
+    //计算农历的时间差
+    var offset = 0;
+    for(var i=1900;i<y;i++) {
+      offset+=calendar.lYearDays(i);
+    }
+    var leap = 0,isAdd= false;
+    for(var i=1;i<m;i++) {
+      leap = calendar.leapMonth(y);
+      if(!isAdd) {//处理闰月
+        if(leap<=i && leap>0) {
+          offset+=calendar.leapDays(y);isAdd = true;
+        }
+      }
+      offset+=calendar.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 calendar.solar2lunar(cY,cM,cD);
+  }
+};
+
+export default calendar

+ 15 - 0
components/mpvue-calendar/icon.css

@@ -0,0 +1,15 @@
+@font-face {font-family: "iconfont";
+    src: url('data:font/truetype;charset=utf-8;base64,d09GRgABAAAAAASEAAsAAAAABuwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY7d0f0Y21hcAAAAYAAAABTAAABhmJUzs9nbHlmAAAB1AAAALcAAADIzC0F5mhlYWQAAAKMAAAALwAAADYS7IZUaGhlYQAAArwAAAAcAAAAJAfeA4RobXR4AAAC2AAAAAwAAAAMDAAAAGxvY2EAAALkAAAACAAAAAgANgBkbWF4cAAAAuwAAAAfAAAAIAEOACluYW1lAAADDAAAAUUAAAJtPlT+fXBvc3QAAARUAAAALQAAAEOUPjuMeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMj5jYm7438AQw9zA0AAUZgTJAQDdSgvleJztkMERgDAIBPdIzMOxEB8W5MvuTRsRMHbhzSwHR/IBWIDiHE4FXYjQ6akyL6yZ13zT3IXd6jYGfO6S75q7xT81fm1Z9zlZXOsl+j5BD35IDU4AeJwVzUEOwUAYBeD/mfxTEso/mkEJoYluqgtajUjYsHEOSytncROJK/QErjNMd+8lL+8jEP3eqq8uNCPiokK1L4t1ihzVCSPMEekAep3mQCh4tpVm95JWz2QGj3iyiN3LZMJBODU49IMuDxk32YifuI89X4+xqwcsHUtEjfVVWt1p5MvWNs9RY4RowNLrJ7Tq8ZKNN7wmvMp8jBc7PDpW3RPfPrISV5ss4QEO9pxcdrix/gMMIyHOAHicY2BkYGAAYmNBZtV4fpuvDNwsDCBw/dlCBQT9fzMLA3MKkMvBwAQSBQDyNAlAAHicY2BkYGBu+N/AEMPCAAJAkpEBFTADAEcJAmwEAAAABAAAAAQAAAAAAAAAADYAZHicY2BkYGBgZpBlANEMDExAzAWEDAz/wXwGAAuHATgAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicY2BigAAuBuyAmZGJkZmRhYEnKzMxryS/tDgjMS+dC8qpzC9lYAAAiPIJlAAAAA==');
+}
+
+.iconfont {
+    font-family:"iconfont" !important;
+    font-size:16px;
+    font-style:normal;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-arrow-right:before { content: "\e602"; }
+
+.icon-arrow-left:before { content: "\e501"; }

+ 1153 - 0
components/mpvue-calendar/mpvue-calendar.vue

@@ -0,0 +1,1153 @@
+<template>
+  <div class="mpvue-calendar" ref="calendar">
+    <div class="calendar-tools" v-if="!isMonthRange">
+      <div class="calendar-prev" @click="prev">
+        <img :src="arrowLeft" v-if="!!arrowLeft">
+        <i class="iconfont icon-arrow-left" v-else></i>
+      </div>
+      <div class="calendar-next"  @click="next">
+        <img :src="arrowRight" v-if="!!arrowRight">
+        <i class="iconfont icon-arrow-right" v-else></i>
+      </div>
+      <div class="calendar-info" @click.stop="changeYear">
+        <div class="mc-month">
+          <div :class="['mc-month-inner', oversliding ? '' : 'month-transition']" :style="{'top': monthPosition + unit}" v-if="isIos">
+            <span v-for="(m, i) in monthsLoop" :key="i" >{{m}}</span>
+          </div>
+          <div class="mc-month-text" v-else>{{monthText}}</div>
+        </div>
+        <div class="mc-year">{{year}}</div>
+      </div>
+    </div>
+    <table cellpadding="5">
+      <div class="mc-head" :class="['mc-head', {'mc-month-range-mode-head': isMonthRange}]">
+        <div class="mc-head-box">
+          <div v-for="(week, index) in weeks" :key="index" class="mc-week">{{week}}</div>
+        </div>
+      </div>
+      <div :class="['mc-body', {'mc-range-mode': range, 'week-switch': weekSwitch && !isMonthRange, 'month-range-mode': isMonthRange}]" v-for="(days, index) in monthRangeDays" :key='index'>
+        <div class="month-rang-head" v-if="isMonthRange">{{rangeOfMonths[index][2]}}</div>
+        <tr v-for="(day,k1) in days" :key="k1" :class="{'gregorianStyle': !lunar}">
+          <td v-for="(child,k2) in day" :key="k2" :class="[{'selected': child.selected, 'mc-today-element': child.isToday, 'disabled': child.disabled, 'mc-range-select-one': rangeBgHide && child.selected, 'lunarStyle': lunar, 'mc-range-row-first': k2 === 0 && child.selected, 'month-last-date': child.lastDay, 'month-first-date': 1 === child.day, 'mc-range-row-last': k2 === 6 && child.selected, 'mc-last-month': child.lastMonth, 'mc-next-month': child.nextMonth}, child.className, child.rangeClassName]" @click="select(k1, k2, child, $event, index)" class="mc-day" :style="itemStyle">
+            <span v-if="showToday.show && child.isToday" class="mc-today calendar-date">{{showToday.text}}</span>
+            <span :class="[{'mc-date-red': k2 === (monFirst ? 5 : 0) || k2 === 6}, 'calendar-date']" v-else>{{child.day}}</span>
+            <div class="slot-element" v-if="!!child.content">{{child.content}}</div>
+            <div class="mc-text remark-text" v-if="child.eventName && !clean">{{child.eventName}}</div>
+            <div class="mc-dot" v-if="child.eventName && clean"></div>
+            <div class="mc-text" :class="{'isLunarFestival': child.isAlmanac || child.isLunarFestival,'isGregorianFestival': child.isGregorianFestival,'isTerm': child.isTerm}" v-if="lunar && (!child.eventName || clean)">{{child.almanac || child.lunar}}</div>
+            <div class="mc-range-bg" v-if="range && child.selected"/>
+          </td>
+        </tr>
+      </div>
+    </table>
+    <div class="mpvue-calendar-change" :class="{'show': yearsShow}">
+      <div class="calendar-years" v-if="!weekSwitch">
+        <span v-for="y in years" :key="y" @click.stop="selectYear(y)" :class="{'active': y === year}">{{y}}</span>
+      </div>
+      <div :class="['calendar-months', {'calendar-week-switch-months': weekSwitch}]">
+        <span v-for="(m, i) in months" :key="m" @click.stop="changeMonth(i)" :class="{'active': i === month}">{{m}}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import calendar from './calendarinit.js';
+  import './icon.css';
+  const isBrowser = !!window;
+  const now = new Date();
+  const todayString = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('-');
+  export default {
+    props: {
+      multi: {
+        type: Boolean,
+        default: false
+      },
+      arrowLeft: {
+        type: String,
+        default: ''
+      },
+      arrowRight: {
+        type: String,
+        default: ''
+      },
+      clean: {
+        type: Boolean,
+        default: false
+      },
+      now: {
+        type: [String, Boolean],
+        default: true
+      },
+      range:{
+        type: Boolean,
+        default: false
+      },
+      completion:{
+        type: Boolean,
+        default: false
+      },
+      value: {
+        type: Array,
+        default: function(){
+          return []
+        }
+      },
+      begin:  {
+        type: Array,
+        default: function(){
+          return []
+        }
+      },
+      end:  {
+        type: Array,
+        default: function(){
+          return []
+        }
+      },
+      zero:{
+        type: Boolean,
+        default: false
+      },
+      disabled:{
+        type: Array,
+        default: function(){
+          return []
+        }
+      },
+      almanacs:{
+        type: Object,
+        default: function(){
+          return {}
+        }
+      },
+      tileContent:{
+        type: Array,
+        default: function(){
+          return []
+        }
+      },
+      lunar: {
+        type: Boolean,
+        default: false
+      },
+      monFirst: {
+        type: Boolean,
+        default: false
+      },
+      weeks: {
+        type: Array,
+        default:function(){
+          return this.monFirst ? ['一', '二', '三', '四', '五', '六', '日'] : ['日', '一', '二', '三', '四', '五', '六']
+        }
+      },
+      months:{
+        type: Array,
+        default:function(){
+          return ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
+        }
+      },
+      events:  {
+        type: Object,
+        default: function(){
+          return {}
+        }
+      },
+      weekSwitch: {
+        type: Boolean,
+        default: false
+      },
+      monthRange: {
+        type: Array,
+        default: function(){
+          return []
+        }
+      },
+      responsive: {
+        type: Boolean,
+        default: false
+      },
+      rangeMonthFormat: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        years:[],
+        yearsShow:false,
+        year: 0,
+        month: 0,
+        monthPosition: 0,
+        day: 0,
+        days: [],
+        multiDays:[],
+        today: [],
+        handleMultiDay: [],
+        firstRender: true,
+        isIos: true,
+        showToday: {},
+        monthText: '',
+        festival:{
+          lunar:{
+            "1-1":"春节",
+            "1-15":"元宵节",
+            "2-2":"龙头节",
+            "5-5":"端午节",
+            "7-7":"七夕节",
+            "7-15":"中元节",
+            "8-15":"中秋节",
+            "9-9":"重阳节",
+            "10-1":"寒衣节",
+            "10-15":"下元节",
+            "12-8":"腊八节",
+            "12-23":"小年",
+          },
+          gregorian:{
+            "1-1":"元旦",
+            "2-14":"情人节",
+            "3-8":"妇女节",
+            "3-12":"植树节",
+            "5-1":"劳动节",
+            "5-4":"青年节",
+            "6-1":"儿童节",
+            "7-1":"建党节",
+            "8-1":"建军节",
+            "9-10":"教师节",
+            "10-1":"国庆节",
+            "12-24":"平安夜",
+            "12-25":"圣诞节",
+          },
+        },
+        rangeBegin: [],
+        rangeEnd: [],
+        multiDaysData: [],
+        monthsLoop: [],
+        itemWidth: 50,
+        unit: isBrowser ? 'px' : 'rpx',
+        positionH: isBrowser ? -24 : -40,
+        monthIndex: 0,
+        oversliding: false,
+        rangeBgHide: false,
+        monthRangeDays: [],
+        rangeOfMonths: [],
+        monthDays: [],
+        weekIndex: 0,
+        startWeekIndex: 0,
+        positionWeek: true,
+        isMonthRange: false,
+      }
+    },
+    computed: {
+      itemStyle() {
+        return {width: this.itemWidth + 'px', height: this.itemWidth + 'px', fontSize: this.itemWidth / 4 + 'px', lineHeight: this.lunar ? (this.itemWidth / 1.5 + 'px') : (this.itemWidth + 'px')}
+      }
+    },
+    watch:{
+      events() {
+        if (this.isRendeRangeMode()) return;
+        this.render(this.year, this.month, '_WATCHRENDER_', 'events');
+      },
+      disabled() {
+        if (this.isRendeRangeMode()) return;
+        this.render(this.year, this.month, '_WATCHRENDER_', 'disabled');
+      },
+      value() {
+        if (this.isRendeRangeMode('_WATCHRENDERVALUE_')) return;
+        const value = this.value;
+        let year = value[0], month = value[1] - 1;
+        if (this.multi) {
+          year = value[value.length - 1][0];
+          month = value[value.length - 1][1] - 1;
+        } else if (this.range) {
+          if (this.isUserSelect) {
+            year = this.year;
+            month = this.month;
+            this.isUserSelect = false;
+          } else {
+            year = value[0][0];
+            month = value[0][1] - 1;
+            const day = value[0][2];
+            return this.render(year, month, '_WATCHRENDERVALUE_', [year, month, day]);
+          }
+        }
+        this.render(year, month, '_WATCHRENDERVALUE_');
+      },
+      tileContent() {
+        if (this.isRendeRangeMode()) return;
+        this.render(this.year, this.month, '_WATCHRENDER_', 'tileContent');
+      },
+      almanacs() {
+        if (this.isRendeRangeMode()) return;
+        this.render(this.year, this.month, '_WATCHRENDER_', 'almanacs');
+      },
+      monthRange() {
+        if (this.isRendeRangeMode()) return;
+        this.render(this.year, this.month, '_WATCHRENDER_', 'almanacs');
+      },
+      responsive() {
+        if (this.responsive) this.addResponsiveListener();
+      }
+    },
+    created() {
+      this.isMonthRange = !!this.monthRange.length;
+      const loopArray = this.months.concat();
+      loopArray.unshift(this.months[this.months.length - 1]);
+      loopArray.push(this.months[0]);
+      this.monthsLoop = loopArray;
+      this.monthsLoopCopy = this.monthsLoop.concat();
+    },
+    mounted() {
+      const self = this;
+      this.resize();
+      if (!isBrowser) {
+        wx.getSystemInfo({
+          success: function(res) {
+            self.isIos = (res.system.split(' ') || [])[0] === 'iOS';
+          }
+        });
+      } else if (this.responsive) {
+        this.addResponsiveListener();
+      }
+      this.oversliding = true;
+      this.initRender = true;
+      this.init();
+    },
+    beforeDestroy() {
+      if (isBrowser) {
+        window.removeEventListener('resize', this.resize)
+      }
+    },
+    methods: {
+      init() {
+        let now = new Date();
+        this.year = now.getFullYear();
+        this.month = now.getMonth();
+        this.day = now.getDate();
+        this.monthIndex = this.month + 1;
+        if (this.value.length || this.multi) {
+          if (this.range) {
+            this.year = Number(this.value[0][0]);
+            this.month = this.value[0][1] - 1;
+            this.day = Number(this.value[0][2]);
+            const yearEnd = Number(this.value[1][0]);
+            const monthEnd = this.value[1][1] - 1;
+            const dayEnd = this.value[1][2];
+            this.rangeBegin = [this.year, this.month, this.day];
+            this.rangeEnd = [yearEnd, monthEnd, dayEnd];
+          } else if (this.multi) {
+            this.multiDays = this.value;
+            const handleMultiDay = this.handleMultiDay;
+            if (this.firstRender) {
+              this.firstRender = false;
+              const thatYear = (this.value[0] || [])[0];
+              const thatMonth = (this.value[0] || [])[1];
+              if (isFinite(thatYear) && isFinite(thatMonth)) {
+                this.month = parseInt(thatMonth) - 1;
+                this.year = parseInt(thatYear);
+              }
+            } else if (this.handleMultiDay.length) {
+              this.month = parseInt(handleMultiDay[handleMultiDay.length - 1][1]) - 1;
+              this.year = parseInt(handleMultiDay[handleMultiDay.length - 1][0]);
+              this.handleMultiDay = [];
+            } else {
+              this.month = parseInt(this.value[this.value.length - 1][1]) - 1;
+              this.year = parseInt(this.value[this.value.length - 1][0]);
+            }
+            this.day = parseInt((this.value[0] || [])[2]);
+          } else {
+            this.year = parseInt(this.value[0]);
+            this.month = parseInt(this.value[1]) - 1;
+            this.day = parseInt(this.value[2]);
+          }
+        }
+        this.updateHeadMonth();
+        if (this.isRendeRangeMode()) return;
+        this.render(this.year, this.month);
+      },
+      renderOption(year, month, i, playload) {
+        const weekSwitch = this.monthRange.length ? false : this.weekSwitch;
+        const seletSplit = this.value;
+        const isMonthModeCurrentMonth = !weekSwitch && !playload;
+        const disabledFilter = (disabled) => {
+          return disabled.find(v => {
+            const dayArr = v.split('-');
+            return year === Number(dayArr[0]) && month === (dayArr[1] - 1) && i === Number(dayArr[2]);
+          });
+        };
+        if (this.range) {
+          const lastDay = new Date(year, month + 1, 0).getDate() === i ? {lastDay: true} : null;
+          const options = Object.assign(
+            {day: i},
+            this.getLunarInfo(year, month + 1, i),
+            this.getEvents(year, month + 1, i),
+            lastDay
+          );
+          const {date, day} = options;
+          const copyRangeBegin = this.rangeBegin.concat();
+          const copyRangeEnd = this.rangeEnd.concat();
+          copyRangeBegin[1] = copyRangeBegin[1] + 1;
+          copyRangeEnd[1] = copyRangeEnd[1] + 1;
+          if (weekSwitch || isMonthModeCurrentMonth) {
+            (copyRangeEnd.join('-') === date) && (options.rangeClassName = 'mc-range-end');
+            (copyRangeBegin.join('-') === date) && (options.rangeClassName = 'mc-range-begin');
+          }
+          if (year === copyRangeEnd[0] && (month + 1) === copyRangeEnd[1] && day === (copyRangeEnd[2] - 1)) {
+            options.rangeClassName = options.rangeClassName ? ['mc-range-begin', 'mc-range-second-to-last'] : 'mc-range-second-to-last';
+          }
+          if (this.rangeBegin.length) {
+            const beginTime = +new Date(this.rangeBegin[0], this.rangeBegin[1], this.rangeBegin[2]);
+            const endTime = +new Date(this.rangeEnd[0], this.rangeEnd[1], this.rangeEnd[2]);
+            const stepTime = +new Date(year, month, i);
+            if (beginTime <= stepTime && endTime >= stepTime) {
+              options.selected = true;
+            }
+          }
+          if (this.begin.length) {
+            const beginTime = +new Date(parseInt(this.begin[0]), parseInt(this.begin[1]) - 1, parseInt(this.begin[2]));
+            if (beginTime > +new Date(year, month, i)) {
+              options.disabled = true;
+            }
+          }
+          if (this.end.length) {
+            let endTime = Number(new Date(parseInt(this.end[0]), parseInt(this.end[1]) - 1, parseInt(this.end[2])));
+            if (endTime <  Number(new Date(year, month, i))) {
+              options.disabled = true;
+            }
+          }
+          if (playload && !weekSwitch) {
+            options.disabled = true;
+          } else if (this.disabled.length && disabledFilter(this.disabled)) {
+            options.disabled = true;
+          }
+          const monthFirstDay = year + '-' + (month + 1) + '-' + 1;
+          const monthLastDay = year + '-' + (month + 1) + '-' + new Date(year, month + 1, 0).getDate();
+          (monthFirstDay === date && options.selected && !options.rangeClassName) && (options.rangeClassName = 'mc-range-month-first');
+          (monthLastDay === date && options.selected && !options.rangeClassName) && (options.rangeClassName = 'mc-range-month-last');
+          this.isCurrentMonthToday(options) && (options.isToday = true);
+          (!weekSwitch && playload) && (options.selected = false);
+          return options;
+        } else if(this.multi) {
+          let options;
+          if (this.value.find(v => year === v[0] && month === v[1]-1 && i === v[2])){
+            options = Object.assign(
+              {day: i, selected: true},
+              this.getLunarInfo(year, month + 1, i),
+              this.getEvents(year, month + 1, i)
+            );
+          } else {
+            options = Object.assign(
+              {day: i, selected: false},
+              this.getLunarInfo(year, month + 1, i),
+              this.getEvents(year, month + 1, i)
+            );
+            if (this.begin.length) {
+              const beginTime = +new Date(parseInt(this.begin[0]), parseInt(this.begin[1]) - 1, parseInt(this.begin[2]));
+              if (beginTime > +(new Date(year, month, i))) {
+                options.disabled = true;
+              }
+            }
+            if (this.end.length){
+              const endTime = +new Date(parseInt(this.end[0]), parseInt(this.end[1]) - 1, parseInt(this.end[2]));
+              if (endTime < +(new Date(year, month, i))) {
+                options.disabled = true;
+              }
+            }
+            if (playload && !weekSwitch) {
+              options.disabled = true;
+            } else if (this.disabled.length && disabledFilter(this.disabled)) {
+              options.disabled = true;
+            }
+          }
+          if (options.selected && this.multiDaysData.length !== this.value.length) {
+            this.multiDaysData.push(options);
+          }
+          this.isCurrentMonthToday(options) && (options.isToday = true);
+          (!weekSwitch && playload) && (options.selected = false);
+          return options;
+        } else {
+          const options = {};
+          const monthHuman = month + 1;
+          if (seletSplit[0] === year && seletSplit[1] === monthHuman && seletSplit[2] === i) {
+            Object.assign(
+              options,
+              {day: i, selected: true},
+              this.getLunarInfo(year, monthHuman, i),
+              this.getEvents(year, monthHuman, i)
+            );
+          } else {
+            Object.assign(
+              options,
+              {day: i, selected: false},
+              this.getLunarInfo(year, monthHuman, i),
+              this.getEvents(year, monthHuman, i)
+            );
+            if (this.begin.length) {
+              const beginTime = +new Date(parseInt(this.begin[0]), parseInt(this.begin[1]) - 1, parseInt(this.begin[2]));
+              if (beginTime > Number(new Date(year, month, i))) {
+                options.disabled = true;
+              }
+            }
+            if (this.end.length){
+              const endTime = +new Date(parseInt(this.end[0]), parseInt(this.end[1]) - 1, parseInt(this.end[2]));
+              if (endTime < +(new Date(year, month, i))) {
+                options.disabled = true;
+              }
+            }
+            if (playload && !weekSwitch) {
+              options.disabled = true;
+            } else if (this.disabled.length && disabledFilter(this.disabled)) {
+              options.disabled = true;
+            }
+          }
+          this.isCurrentMonthToday(options) && (options.isToday = true);
+          (!weekSwitch && playload) && (options.selected = false);
+          return options;
+        }
+      },
+      isCurrentMonthToday(options) {
+        const isToday = todayString === options.date;
+        if (!isToday) return false;
+        return this.weekSwitch ? isToday : (Number(todayString.split('-')[1]) === this.month + 1);
+      },
+      watchRender(type) {
+        const weekSwitch = this.weekSwitch;
+        const daysDeepCopy = JSON.parse(JSON.stringify(this.monthDays));
+        if (type === 'events') {
+          const events = this.events || {};
+          Object.keys(events).forEach(value => {
+            daysDeepCopy.some(v => v.some(vv => {
+              if (vv.date === value) {
+                vv.eventName = events[value];
+                return true;
+              }
+            }))
+          });
+          this.monthDays = daysDeepCopy;
+        } else if (type === 'disabled') {
+          const disabled = this.disabled || [];
+          disabled.forEach(value => {
+            daysDeepCopy.some(v => v.some(vv => {
+              if (vv.date === value) {
+                vv.disabled = true;
+                return true;
+              }
+            }))
+          });
+        } else if (type === 'almanacs') {
+          const almanacs = this.almanacs || {};
+          Object.keys(almanacs).forEach(value => {
+            daysDeepCopy.some(v => v.some(vv => {
+              if (vv.date.slice(5, 20) === value) {
+                vv.lunar = almanacs[value];
+                return true;
+              }
+            }))
+          });
+        } else if (type === 'tileContent') {
+          const tileContent = this.tileContent || [];
+          tileContent.forEach(value => {
+            daysDeepCopy.some(v => v.some(vv => {
+              if (vv.date === value.date) {
+                vv.className = value.className;
+                vv.content = value.content;
+                return true;
+              }
+            }))
+          });
+        }
+        if (weekSwitch) {
+          this.monthDays = daysDeepCopy;
+          this.days = [daysDeepCopy[this.weekIndex]];
+          this.monthRangeDays = [this.days];
+        } else {
+          this.days = daysDeepCopy;
+          this.monthRangeDays = [this.days];
+        }
+      },
+      render(y, m, renderer, payload) {
+        const weekSwitch = this.weekSwitch;
+        const isCustomRender = renderer === 'CUSTOMRENDER';
+        const isWatchRenderValue = renderer === '_WATCHRENDERVALUE_';
+        this.year = y;
+        this.month = m;
+        if (renderer === '_WATCHRENDER_') return this.watchRender(payload);
+        if (this.range && isWatchRenderValue) {
+          if (!Array.isArray((this.value || [])[0])) {
+            this.rangeBegin = [];
+            this.rangeEnd = [];
+          } else {
+            this.rangeBegin = [this.value[0][0], this.value[0][1] - 1, this.value[0][2]];
+            this.rangeEnd = [this.value[1][0], this.value[1][1] - 1, this.value[1][2]];
+          }
+        }
+        if (isWatchRenderValue && weekSwitch) {
+          this.positionWeek = true;
+        }
+        if (isCustomRender) {
+          this.year = y;
+          this.month = m;
+          this.positionWeek = true;
+          if (weekSwitch && !payload) {
+            this.startWeekIndex = 0;
+            this.weekIndex = 0;
+          }
+          this.updateHeadMonth();
+        }
+        let firstDayOfMonth = new Date(y, m, 1).getDay();
+        const lastDateOfMonth = new Date(y, m + 1, 0).getDate();
+        let lastDayOfLastMonth = new Date(y, m, 0).getDate();
+        this.year = y;
+        let i = 1, line = 0, temp = [], nextMonthPushDays = 1;
+        for (i; i <= lastDateOfMonth; i++) {
+          let day = new Date(y, m, i).getDay();
+          let k;
+          if (day === 0) {
+            temp[line] = [];
+          } else if (i === 1) {
+            temp[line] = [];
+            k = lastDayOfLastMonth - firstDayOfMonth + 1;
+            for (let j = 0; j < firstDayOfMonth; j++) { //generate prev month surplus option
+              temp[line].push(Object.assign(
+                this.renderOption(this.computedPrevYear(y, m), this.computedPrevMonth(false, m), k, 'prevMonth'),
+                {lastMonth: true}
+              ));
+              k++;
+            }
+          }
+
+          temp[line].push(this.renderOption(y, m, i)); //generate current month option
+
+          if (day === 6 && i < lastDateOfMonth) {
+            line++;
+          } else if (i === lastDateOfMonth) {
+            let k = 1;
+            const lastDateOfMonthLength = this.monFirst ? 7 : 6;
+            for (let d = day; d < lastDateOfMonthLength; d++) { //generate next month surplus option
+              temp[line].push(Object.assign(
+                this.renderOption(this.computedNextYear(y, m), this.computedNextMonth(false, m), k, 'nextMonth'),
+                {nextMonth: true}
+              ));
+              k++;
+            }
+            nextMonthPushDays = k;
+          }
+        }
+        const completion = this.completion;
+        if (this.monFirst) {
+          if (!firstDayOfMonth) {
+            let lastMonthDay = lastDayOfLastMonth;
+            const LastMonthItems = [];
+            for (let i = 1; i <= 7; i++) {
+              LastMonthItems.unshift(Object.assign(
+                this.renderOption(this.computedPrevYear(y, m), this.computedPrevMonth(false, m), lastMonthDay, 'prevMonth'),
+                {lastMonth: true}
+              ));
+              lastMonthDay --;
+            }
+            temp.unshift(LastMonthItems);
+          }
+          temp.forEach((item, index) => {
+            if (!index) {
+              return item.splice(0, 1);
+            };
+            temp[index-1].length < 7 && temp[index-1].push(item.splice(0, 1)[0]);
+          });
+          if (this.isMonthRange && temp[temp.length - 1][0].nextMonth) {
+            temp.splice(temp.length - 1, 1); //if the first day of last line is nextMonth, delete this line
+          }
+          if (!completion && !weekSwitch) {
+            const lastIndex = temp.length - 1;
+            const secondToLastIndex = lastIndex - 1;
+            const differentMonth = temp[lastIndex][0].date.split('-')[1] !== temp[secondToLastIndex][6].date.split('-')[1];
+            differentMonth && temp.splice(lastIndex, 1);
+          }
+        }
+        if (completion && !weekSwitch && temp.length <= 5 && nextMonthPushDays > 0) {
+          for (let i = temp.length; i<=5; i++) {
+            temp[i] = [];
+            let start = nextMonthPushDays + (i - line -1) * 7;
+            for (let d = start; d <= start + 6; d++) {
+              temp[i].push(Object.assign(
+                {day: d, disabled: true,  nextMonth: true},
+                this.getLunarInfo(this.computedNextYear(), this.computedNextMonth(true), d),
+                this.getEvents(this.computedNextYear(), this.computedNextMonth(true), d)
+              ));
+            }
+          }
+        }
+        if (this.tileContent.length) {
+          temp.forEach((item, index) => {
+            item.forEach((v, i) => {
+              const contents = this.tileContent.find(val => val.date === v.date);
+              if (contents) {
+                const {className, content} = contents || {};
+                v.className = className;
+                v.content = content;
+              }
+            });
+          });
+        }
+        if (weekSwitch) {
+          const tempLength = temp.length;
+          const lastLineMonth = temp[tempLength - 1][0].date.split('-')[1]; // last line month
+          const secondLastMonth = temp[tempLength - 2][0].date.split('-')[1]; // second-to-last line month
+          lastLineMonth !== secondLastMonth && temp.splice(tempLength - 1, 1);
+        }
+        this.monthDays = temp;
+        if (weekSwitch && !this.isMonthRange) {
+          if (this.positionWeek) {
+            let payloadDay = '';
+            let searchIndex = true;
+            if (Array.isArray(payload)) { //range
+              payloadDay = [payload[0], payload[1] + 1, payload[2]].join('-');
+            } else if (this.multi || isWatchRenderValue) {
+              if (this.thisTimeSelect) {
+                payloadDay = this.thisTimeSelect;
+              } else {
+                payloadDay = this.multi ? this.value[this.value.length - 1].join('-') : this.value.join('-') ;
+              }
+            }
+            if (payload === 'SETTODAY') {
+              payloadDay = todayString;
+            } else if (isCustomRender) {
+              if (typeof payload === 'string') {
+                payloadDay = [y, Number(m) + 1, payload].join('-');
+                searchIndex = true;
+              } else if (typeof payload === 'number') {
+                const setIndex = payload > temp.length ? temp.length - 1 : payload;
+                this.startWeekIndex = setIndex;
+                this.weekIndex = setIndex;
+                this.positionWeek = false;
+                searchIndex = false;
+              }
+            }
+            const positionDay = payloadDay || todayString;
+            if (searchIndex) {
+              temp.some((v, i) => {
+                const isWeekNow = v.find(vv => vv.date === positionDay);
+                if (isWeekNow) {
+                  this.startWeekIndex = i;
+                  this.weekIndex = i;
+                  return true;
+                }
+              });
+            }
+            this.positionWeek = false;
+          }
+          this.days = [temp[this.startWeekIndex]];
+          if (this.initRender) {
+            this.setMonthRangeofWeekSwitch();
+            this.initRender = false;
+          }
+        } else {
+          this.days = temp;
+        }
+        const todayText = '今';
+        if (typeof this.now === 'boolean' && !this.now) {
+          this.showToday = {show: false};
+        } else if (typeof this.now === 'string') {
+          this.showToday = {
+            show: true,
+            text: this.now || todayText
+          };
+        } else {
+          this.showToday = {
+            show: true,
+            text: todayText
+          };
+        }
+        this.monthRangeDays = [this.days];
+        isWatchRenderValue && this.updateHeadMonth();
+        return this.days;
+      },
+      rendeRange(renderer) {
+        const range = [];
+        const self = this;
+        const monthRange = this.monthRange;
+        function formatDateText(fYear, fMonth) {
+          const reg = /([y]+)(.*?)([M]+)(.*?)$/i;
+          const rangeMonthFormat = self.rangeMonthFormat || 'yyyy-MM';
+          reg.exec(rangeMonthFormat);
+          return String(fYear).substring(4 - RegExp.$1.length) + RegExp.$2 + String(fMonth).substring(2 - RegExp.$3.length) + RegExp.$4;
+        }
+        if (monthRange[0] === monthRange[1]) {
+          const [y, m] = monthRange[0].split('-');
+          range.push([Number(y), Number(m), formatDateText(y, m)])
+        } else {
+          const monthRangeOfStart = monthRange[0].split('-');
+          const monthRangeOfEnd = monthRange[1].split('-');
+          let startYear = +monthRangeOfStart[0];
+          let startMonth = +monthRangeOfStart[1];
+          let endYear = +monthRangeOfEnd[0];
+          let endtMonth = +monthRangeOfEnd[1] > 12 ? 12 : +monthRangeOfEnd[1];
+          while (startYear < endYear || startMonth <= endtMonth) {
+            range.push([startYear, startMonth, formatDateText(startYear, startMonth)]);
+            if (startMonth === 12 && startYear !== endYear) {
+              startYear++;
+              startMonth = 0;
+            }
+            startMonth++;
+          }
+        }
+        this.rangeOfMonths = range;
+
+        const monthsRange = range.map(item => {
+          const [yearParam, monthParam] = item;
+          return this.render(yearParam, monthParam - 1, renderer);
+        });
+        this.monthRangeDays = monthsRange;
+      },
+      isRendeRangeMode(renderer) {
+        this.isMonthRange = !!this.monthRange.length;
+        if (this.isMonthRange) {
+          this.rendeRange(renderer);
+          return true;
+        }
+      },
+      renderer(y, m, w) {
+        const renderY = y || this.year;
+        const renderM = typeof parseInt(m) === 'number' ? (m - 1) : this.month;
+        this.initRender = true;
+        this.render(renderY, renderM, 'CUSTOMRENDER', w);
+        !this.weekSwitch && (this.monthsLoop = this.monthsLoopCopy.concat());
+      },
+      computedPrevYear(year, month) {
+        let value = year;
+        if((month - 1) < 0){
+          value--;
+        }
+        return value;
+      },
+      computedPrevMonth(isString, month) {
+        let value = month;
+        if((month - 1) < 0){
+          value = 11;
+        } else {
+          value--;
+        }
+        if(isString) {
+          return value + 1;
+        }
+        return value;
+      },
+      computedNextYear(year, month) {
+        let value = year;
+        if((month + 1) > 11){
+          value++;
+        }
+        return value;
+      },
+      computedNextMonth(isString, month) {
+        let value = month;
+        if((month + 1) > 11){
+          value = 0;
+        } else {
+          value++;
+        }
+        if(isString) {
+          return value + 1;
+        }
+        return value;
+      },
+      getLunarInfo(y, m, d) {
+        let lunarInfo = calendar.solar2lunar(y, m, d);
+        let yearEve = '';
+        if (lunarInfo.lMonth === 12 && lunarInfo.lDay === calendar.monthDays(lunarInfo.lYear, 12)) {
+          yearEve = '除夕';
+        }
+        let lunarValue = lunarInfo.IDayCn;
+        let Term = lunarInfo.Term;
+        let isLunarFestival = false;
+        let isGregorianFestival = false;
+        if(this.festival.lunar[lunarInfo.lMonth + "-" + lunarInfo.lDay]) {
+          lunarValue = this.festival.lunar[lunarInfo.lMonth + "-" + lunarInfo.lDay];
+          isLunarFestival = true;
+        } else if(this.festival.gregorian[m + "-" + d]) {
+          lunarValue = this.festival.gregorian[m + "-" + d];
+          isGregorianFestival = true;
+        }
+        const lunarInfoObj = {
+          date: `${y}-${m}-${d}`,
+          lunar: yearEve || Term || lunarValue,
+          isLunarFestival: isLunarFestival,
+          isGregorianFestival: isGregorianFestival,
+          isTerm: !!yearEve || lunarInfo.isTerm
+        };
+        if (Object.keys(this.almanacs).length) {
+          Object.assign(lunarInfoObj, {
+            almanac: this.almanacs[m + "-" + d] || '',
+            isAlmanac: !!this.almanacs[m + "-" + d]
+          });
+        }
+        return lunarInfoObj;
+      },
+      getEvents(y, m, d){
+        if(Object.keys(this.events).length == 0) return false;
+        let eventName = this.events[y + "-" + m + "-" + d];
+        let data = {};
+        if(eventName!=undefined){
+          data.eventName = eventName;
+        }
+        return data;
+      },
+      prev(e) {
+        e && e.stopPropagation();
+        if (this.isMonthRange) return;
+        const weekSwitch = this.weekSwitch;
+        const changeMonth = (changed) => {
+          if (this.monthIndex === 1) {
+            this.oversliding = false;
+            this.month = 11;
+            this.year = parseInt(this.year) - 1;
+            this.monthIndex = this.monthIndex - 1;
+          } else if (this.monthIndex === 0) {
+            this.oversliding = true;
+            this.monthIndex = 12;
+            setTimeout(() => this.prev(e), 50);
+            return this.updateHeadMonth('custom');
+          } else if (this.monthIndex === 13) {
+            this.month = 11;
+            this.year = parseInt(this.year) - 1;
+            this.monthIndex = this.monthIndex - 1;
+          } else {
+            this.oversliding = false;
+            this.month = parseInt(this.month) - 1;
+            this.monthIndex = this.monthIndex - 1;
+          }
+          this.updateHeadMonth('custom');
+          this.render(this.year, this.month);
+          (typeof changed === 'function') && changed();
+          const weekIndex = weekSwitch ? this.weekIndex : undefined;
+          this.$emit('prev', this.year, this.month + 1, weekIndex);
+        }
+        if (!this.weekSwitch) return changeMonth();
+        const changeWeek = () => {
+          this.weekIndex = this.weekIndex - 1;
+          this.days = [this.monthDays[this.weekIndex]];
+          this.monthRangeDays = [this.days];
+          this.setMonthRangeofWeekSwitch();
+          this.$emit('prev', this.year, this.month + 1, this.weekIndex);
+        }
+        const currentWeek = (this.days[0] || [])[0] || {};
+        if (currentWeek.lastMonth || currentWeek.day === 1) {
+          const monthChenged = () => {
+            const lastMonthLength = this.monthDays.length;
+            const startWeekIndex = currentWeek.lastMonth ? lastMonthLength - 1: lastMonthLength;
+            this.startWeekIndex = startWeekIndex;
+            this.weekIndex = startWeekIndex;
+            changeWeek();
+          }
+          changeMonth(monthChenged);
+        } else {
+          changeWeek();
+        }
+      },
+      next(e) {
+        e && e.stopPropagation();
+        if (this.isMonthRange) return;
+        const weekSwitch = this.weekSwitch;
+        const changeMonth = () => {
+          if (this.monthIndex === 12) {
+            this.oversliding = false;
+            this.month = 0;
+            this.year = parseInt(this.year) + 1;
+            this.monthIndex = this.monthIndex + 1;
+          } else if (this.monthIndex === 0 && this.month === 11) {
+            this.oversliding = false;
+            this.month = 0;
+            this.year = parseInt(this.year) + 1;
+            this.monthIndex = this.monthIndex + 1;
+          } else if (this.monthIndex === 13) {
+            this.oversliding = true;
+            this.monthIndex = 1;
+            setTimeout(() => this.next(e), 50);
+            return this.updateHeadMonth('custom');
+          } else {
+            this.oversliding = false;
+            this.month = parseInt(this.month) + 1;
+            this.monthIndex = this.monthIndex + 1;
+          }
+          this.updateHeadMonth('custom');
+          this.render(this.year, this.month);
+          const weekIndex = weekSwitch ? this.weekIndex : undefined;
+          this.$emit('next', this.year, this.month + 1, weekIndex);
+        }
+        if (!this.weekSwitch) return changeMonth();
+        const changeWeek = () => {
+          this.weekIndex = this.weekIndex + 1;
+          this.days = [this.monthDays[this.weekIndex]];
+          this.monthRangeDays = [this.days];
+          this.setMonthRangeofWeekSwitch();
+          this.$emit('next', this.year, this.month + 1, this.weekIndex);
+        }
+        const currentWeek = (this.days[0] || [])[6] || {};
+        if (currentWeek.nextMonth || currentWeek.day === (new Date(this.year, this.month + 1, 0).getDate())) {
+          const startWeekIndex = currentWeek.nextMonth ? 1 : 0;
+          this.startWeekIndex = startWeekIndex;
+          this.weekIndex = startWeekIndex;
+          changeMonth();
+        } else {
+          changeWeek();
+        }
+      },
+      select(k1, k2, data, e, monthIndex) {
+        e && e.stopPropagation();
+        const weekSwitch = this.weekSwitch;
+        if (data.lastMonth && !weekSwitch) {
+          return this.prev(e);
+        } else if (data.nextMonth && !weekSwitch) {
+          return this.next(e);
+        }
+        if (data.disabled) return;
+        (data || {}).event = (this.events || {})[data.date] || '';
+        const {selected, day, date} = data;
+        const selectedDates = date.split('-');
+        const selectYear = Number(selectedDates[0]);
+        const selectMonth = selectedDates[1] - 1;
+        const selectMonthHuman = Number(selectedDates[1]);
+        const selectDay = Number(selectedDates[2]);;
+        if (this.range) {
+          this.isUserSelect = true;
+          if (this.rangeBegin.length === 0 || this.rangeEndTemp !== 0) {
+            this.rangeBegin = [selectYear, selectMonth, selectDay];
+            this.rangeBeginTemp = this.rangeBegin;
+            this.rangeEnd = [selectYear, selectMonth, selectDay];
+            this.thisTimeSelect = this.rangeEnd;
+            this.rangeEndTemp = 0;
+          } else {
+            this.rangeEnd = [selectYear, selectMonth, selectDay];
+            this.thisTimeSelect = [selectYear, selectMonth, selectDay];
+            if (this.rangeBegin.join('-') === this.rangeEnd.join('-')) {
+              return this.rangeEndTemp = 0;
+            }
+            this.rangeEndTemp = 1;
+            if (+new Date(this.rangeEnd[0], this.rangeEnd[1], this.rangeEnd[2]) < +new Date(this.rangeBegin[0], this.rangeBegin[1], this.rangeBegin[2])) {
+              this.rangeBegin = this.rangeEnd;
+              this.rangeEnd = this.rangeBeginTemp;
+            }
+            const rangeDate = (date) => {
+              return date.map((v, k) =>{
+                const value = k === 1 ? v + 1 : v;
+                return this.zero ? this.zeroPad(value) : value;
+              });
+            }
+            const begin = rangeDate(this.rangeBegin);
+            const end = rangeDate(this.rangeEnd);
+            this.value.splice(0, 1, begin)
+            this.value.splice(1, 1, end)
+            this.$emit('select', begin, end);
+          }
+          this.rangeBgHide = !this.rangeEndTemp || (this.rangeBegin.join('-') === this.rangeEnd.join('-'));
+          this.positionWeek = true;
+          if (this.isMonthRange) {
+            this.rendeRange();
+          } else {
+            this.render(this.year, this.month, undefined, this.thisTimeSelect);
+          }
+        } else if (this.multi) {
+          const filterDayIndex = this.value.findIndex(v => v.join('-') === date);
+          if(~filterDayIndex) {
+            this.handleMultiDay = this.value.splice(filterDayIndex, 1);
+          } else {
+            this.value.push([Number(Number(selectedDates[0])), Number(selectedDates[1]), day]);
+          }
+          this.days[k1][k2].selected = !selected;
+          if (this.monthDays[k1][k2].selected) {
+            this.multiDaysData.push(data);
+          } else {
+            this.multiDaysData = this.multiDaysData.filter(item => item.date !== date);
+          }
+          this.thisTimeSelect = date;
+          this.$emit('select', this.value, this.multiDaysData);
+        } else {
+          const currentSelected = this.value.join('-');
+          this.monthRangeDays.some(value => value.some(v => !!v.find(vv => {
+            if (vv.date === currentSelected) {
+              vv.selected = false;
+              return true;
+            }
+          })));
+          this.monthRangeDays[monthIndex][k1][k2].selected = true;
+          this.day = day;
+          const selectDate = [selectYear, selectMonthHuman, selectDay];
+          this.value[0] = selectYear;
+          this.value[1] = selectMonthHuman;
+          this.value[2] = selectDay;
+          this.today = [k1, k2];
+          this.$emit('select', selectDate, data);
+        }
+      },
+      changeYear() {
+        if(this.yearsShow) {
+          this.yearsShow = false;
+          return false;
+        }
+        this.yearsShow = true;
+        this.years = [];
+        for (let i = this.year - 5; i < this.year + 7; i++){
+          this.years.push(i);
+        }
+      },
+      changeMonth(value) {
+        this.oversliding && (this.oversliding = false);
+        this.yearsShow = false;
+        this.month = value;
+        this.render(this.year, this.month, 'CUSTOMRENDER', 0);
+        this.updateHeadMonth();
+        this.weekSwitch && this.setMonthRangeofWeekSwitch();
+        this.$emit('selectMonth', this.month + 1, this.year);
+      },
+      selectYear(value) {
+        this.yearsShow = false;
+        this.year = value;
+        this.render(this.year, this.month);
+        this.$emit('selectYear', value);
+      },
+      setToday() {
+        const now = new Date();
+        this.year = now.getFullYear();
+        this.month = now.getMonth();
+        this.day = now.getDate();
+        this.positionWeek = true;
+        this.render(this.year, this.month, undefined, 'SETTODAY');
+        this.updateHeadMonth();
+      },
+      setMonthRangeofWeekSwitch() {
+        this.monthsLoop = this.monthsLoopCopy.concat();
+        this.days[0].reduce((prev, current) => {
+          if (!prev) return;
+          const prveDate = ((prev || {}).date || '').split('-');
+          const prevYear = prveDate[0];
+          const prevMonth = prveDate[1];
+          const currentMonth = ((current || {}).date || '').split('-')[1];
+          if (prevMonth === currentMonth) {
+            return current;
+          } else {
+            const prevMonthText = this.months[prevMonth - 1];
+            const currentMonthText = this.months[currentMonth - 1];
+            this.monthsLoop[this.monthIndex] = prevMonthText + '~' + currentMonthText;
+          }
+        });
+      },
+      dateInfo(y, m, d) {
+        return calendar.solar2lunar(y, m, d);
+      },
+      zeroPad(n) {
+        return String(n < 10 ? '0' + n : n)
+      },
+      updateHeadMonth(type) {
+        if (!type) this.monthIndex = this.month + 1;
+        this.monthPosition = this.monthIndex * this.positionH;
+        this.monthText = this.months[this.month];
+      },
+      addResponsiveListener() {
+        window.addEventListener('resize', this.resize);
+      },
+      resize() {
+        const calendar = this.$refs.calendar;
+        this.itemWidth = (calendar.clientWidth/7 - 4).toFixed(5);
+      }
+    }
+  }
+</script>

+ 394 - 0
components/mpvue-calendar/style.css

@@ -0,0 +1,394 @@
+.mpvue-calendar {
+  margin:auto;
+  width: 100%;
+  min-width:300rpx;
+  background: #fff;
+  user-select:none;
+  position: relative;
+}
+.calendar-tools{
+  height:40px;
+  font-size: 20px;
+  line-height: 40px;
+  color:#5e7a88;
+  box-shadow: 0rpx 4rpx 8rpx rgba(25, 47, 89, 0.1);
+  margin-bottom: 30rpx;
+  border-top: 1px solid rgba(200, 200, 200, .1);
+}
+.calendar-prev{
+  width: 14.28571429%;
+  float:left;
+  text-align: center;
+}
+.calendar-prev img, .calendar-next img{
+  width: 34rpx;
+  height: 34rpx;
+}
+.calendar-info{
+  padding-top: 3px;
+  font-size:16px;
+  line-height: 1.3;
+  text-align: center;
+  width: 220rpx;
+  margin: 0 auto;
+}
+.calendar-info>div.mc-month{
+  margin:auto;
+  height:40rpx;
+  width:100px;
+  text-align: center;
+  color:#5e7a88;
+  overflow: hidden;
+  position: relative;
+}
+.calendar-info>div.mc-month .mc-month-inner{
+  position: absolute;
+  left:0;
+  top:0;
+  height:480rpx;
+}
+.month-transition{
+  transition:top .5s cubic-bezier(0.075, 0.82, 0.165, 1);
+}
+.calendar-info .mc-month-text{
+  display:block;
+  font-size:28rpx;
+  height:40rpx;
+  width:200rpx;
+  overflow:hidden;
+  text-align:center;
+}
+.calendar-info>div.mc-month .mc-month-inner>span{
+  display: block;
+  font-size: 14px;
+  height:20px;
+  width:100px;
+  overflow: hidden;
+  text-align: center;
+}
+.calendar-info>div.mc-year{
+  font-size:10px;
+  line-height: 1;
+  color:#999;
+}
+.calendar-next{
+  width: 14.28571429%;
+  float:right;
+  text-align: center;
+}
+.mpvue-calendar table {
+  clear: both;
+  width: 100%;
+  margin-bottom:10px;
+  border-collapse: collapse;
+  color: #444444;
+}
+.mpvue-calendar td {
+  margin:2px !important;
+  padding:0px 0;
+  width: 14.28571429%;
+  height:88rpx;
+  text-align: center;
+  vertical-align: middle;
+  font-size:14px;
+  line-height: 125%;
+  cursor: pointer;
+  position: relative;
+  vertical-align: top;
+}
+.mpvue-calendar td.mc-week{
+  font-size:10px;
+  pointer-events:none !important;
+  cursor: default !important;
+}
+.mpvue-calendar td.disabled {
+  color: #ccc;
+}
+.mpvue-calendar td.disabled div{
+  color: #ccc;
+}
+.mpvue-calendar td span{
+  display:block;
+  height:76rpx;
+  width:76rpx;
+  font-size: 28rpx;
+  line-height:76rpx;
+  margin:0px auto;
+  position: relative;
+  z-index: 3;
+}
+.mpvue-calendar td:not(.disabled) span.mc-date-red{
+  color:#ea6151;
+}
+.mc-today{
+  color: #3b75fb;
+}
+.mpvue-calendar td.selected span{
+  background-color: #3b75fb;
+  color: #fff;
+  border-radius:50%;
+}
+.mpvue-calendar td .mc-text{
+  position: absolute;
+  top:28px;
+  left:0;
+  right:0;
+  text-align: center;
+  padding:2px;
+  font-size:20rpx;
+  line-height: 1.2;
+  color:#444;
+  z-index: 4;
+}
+.mpvue-calendar td .isGregorianFestival,
+.mpvue-calendar td .isTerm,
+.mpvue-calendar td .isLunarFestival{
+  color:#ea6151;
+}
+.mpvue-calendar td.selected span.mc-date-red{
+  background-color: #3b75fb;
+  color: #fff;
+}
+.selected .mc-text {
+  color: #fff !important;
+}
+.mpvue-calendar .lunarStyle span{
+  width: 80rpx;
+  height: 80rpx;
+  line-height:54rpx;
+}
+.mpvue-calendar .lunarStyle .mc-text{
+  top: 44rpx;
+}
+.mpvue-calendar thead td {
+  text-transform: uppercase;
+  height:30px;
+  vertical-align: middle;
+}
+.mc-head {
+  margin-bottom: 20rpx;
+}
+.mc-head div {
+  overflow: hidden;
+}
+.mc-head-box div {
+  flex:1;
+  text-align: center;
+}
+.mc-head-box {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-content: space-between
+}
+.mc-head-box div {
+  font-size: 28rpx;
+}
+.mc-body tr {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-content: space-between
+}
+.mc-dot {
+  width: 10rpx;
+  height: 10rpx;
+  background-color: #ea6151;
+  border-radius: 50%;
+  margin: 0 auto;
+  margin-top: 5rpx;
+  position: absolute;
+  bottom: -5rpx;
+  left: 50%;
+  margin-left: -5rpx;
+  z-index: 5;
+}
+.remark-text {
+  padding-left: 8rpx;
+  padding-right: 8rpx;
+  box-sizing: border-box;
+  height: 34rpx;
+  overflow: hidden;
+  text-overflow:ellipsis;
+  white-space: nowrap;
+}
+.slot-element{
+  line-height: normal;
+  position: absolute;
+  z-index: 5;
+}
+.mpvue-calendar-change{
+  position: absolute;
+  left:0rpx;
+  top:85rpx;
+  right:0rpx;
+  bottom:0rpx;
+  background:#fff;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-wrap:wrap;
+  overflow: auto;
+  transition:all .5s cubic-bezier(0.075, 0.82, 0.165, 1);
+  opacity: 0;
+  pointer-events: none;
+  transform: translateY(-10px);
+  z-index: 9;
+}
+.mpvue-calendar-change.show{
+  opacity: 1;
+  pointer-events: auto;
+  transform: translateY(0px);
+}
+.mpvue-calendar-change span{
+  margin:4px 2%;
+  display: inline-block;
+  line-height: 30px;
+  border-radius: 20px;
+  text-align:center;
+  color:#999;
+  width: 20%;
+  float: left;
+  text-align: center;
+  border-radius: 40px;
+  box-sizing: border-box;
+  margin-bottom: 4%;
+}
+.mpvue-calendar-change span.active{
+  background-color: #587dff;
+  box-shadow: 2px 2px 2px rgba(88, 125, 255, 0.7);
+  color:#fff;
+}
+.mpvue-calendar-change .calendar-week-switch-months{
+  height: 100%;
+  padding: 10rpx 20rpx;
+}
+.mpvue-calendar-change .calendar-week-switch-months span {
+  margin-bottom: 20rpx;
+  margin-top: 0px;
+  font-size: 26rpx;
+  line-height: 40rpx;
+}
+.calendar-years, .calendar-months{
+  height: 50%;
+  width: 100%;
+  padding: 10px;
+  box-sizing: border-box;
+  position: relative;
+}
+.calendar-years:after {
+  content: '';
+  display: block;
+  width: 86%;
+  height: 1rpx;
+  background-color: #eee;
+  position: absolute;
+  bottom: 2%;
+  left: 7%;
+}
+/*range background*/
+.mc-range-mode .selected .mc-range-bg{
+  content: '';
+  display: block;
+  width: 110rpx;
+  height: 80rpx;
+  background-color: #01a1ed;
+  position: absolute;
+  top: 0rpx;
+  left: 50%;
+}
+.mpvue-calendar .mc-range-mode .selected .calendar-date{
+  background-color: transparent;
+}
+.mpvue-calendar .mc-range-mode .mc-range-row-last span.calendar-date, .mpvue-calendar .mc-range-mode .mc-range-row-first span.calendar-date{
+  border-radius: 6rpx;
+  background-color: #01a1ed;
+}
+.mpvue-calendar .mc-range-mode .mc-range-month-first.selected .calendar-date, .mpvue-calendar .mc-range-mode .mc-range-month-last.selected .calendar-date{
+  border-radius: 6rpx;
+  background-color: #01a1ed;
+}
+.mc-range-mode .mc-range-month-last .mc-range-bg{
+  background-color: transparent;
+  border-radius: 6rpx;
+}
+.mc-range-mode .mc-range-end .mc-range-bg, .mc-range-mode .mc-range-row-last .mc-range-bg{
+  display: none;
+}
+.mpvue-calendar .mc-range-mode .mc-range-end span.calendar-date, .mpvue-calendar .mc-range-mode .mc-range-begin span.calendar-date{
+  background-color: #3b75fb;
+  color: #fff;
+  border-radius: 50%;
+}
+.mc-range-mode .mc-range-row-first.mc-range-end .mc-range-bg{
+  display: block;
+  border-radius: 6rpx;
+  width: 40rpx;
+  left: 5px;
+}
+.mpvue-calendar .mc-range-row-first.mc-range-end.month-first-date .mc-range-bg{
+  margin-left: 0px;
+}
+.mc-range-mode .mc-range-row-last.mc-range-begin .mc-range-bg{
+  display: block;
+  border-radius: 4rpx;
+  width: 40rpx;
+  right: 10px;
+}
+.mpvue-calendar .mc-range-mode .month-last-date.mc-range-begin .mc-range-bg{
+  display: block;
+  width: 40rpx;
+  border-radius: 6rpx;
+}
+.mpvue-calendar .mc-range-mode .month-first-date.mc-range-end .mc-range-bg{
+  display: block;
+  width: 40rpx;
+  border-radius: 6rpx;
+  left: 10rpx;
+}
+.mpvue-calendar .mc-range-mode .mc-range-select-one div.mc-range-bg{
+  display: none !important;
+}
+.mc-body .mc-today-element .calendar-date{
+  background-color: rgba(25, 47, 89, 0.1);
+  border-radius: 6rpx;
+}
+/*week switch*/
+.mpvue-calendar .mc-range-mode.week-switch .month-last-date.mc-range-begin .mc-range-bg{
+  width: 130%;
+  border-radius: 0px 20% 20% 0px;
+}
+.mpvue-calendar .mc-range-mode.week-switch .mc-range-month-last .mc-range-bg{
+  background-color: #01a1ed;
+  border-radius: 0px 20% 20% 0px;
+}
+/*month range*/
+.mpvue-calendar .month-range-mode{
+  border-bottom: 1px solid #f2f2f2;
+  position: relative;
+}
+.mpvue-calendar .mc-month-range-mode-head{
+  box-shadow: 0 4px 8px rgba(25,47,89,.1);
+  padding: 15rpx 0rpx;
+  position: sticky;
+  top: 0px;
+  background-color: #fff;
+  z-index: 9;
+}
+.month-range-mode .month-rang-head {
+  text-align: left;
+  margin: 20rpx 0px;
+  padding-left: 40rpx;
+  font-size: 28rpx;
+}
+.month-range-mode .mc-last-month, .month-range-mode .mc-next-month{
+  opacity: 0 !important;
+}
+.month-text-background{
+  position: absolute;
+  font-size: 140px;
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  line-height: 2.4;
+}

+ 95 - 0
components/orderGoods/index.vue

@@ -0,0 +1,95 @@
+<template>
+	<view class="orderGoods">
+		<view class='total'>共{{totalNmu}}件商品</view>
+		<view class='goodWrapper'>
+			<view class='item acea-row row-between-wrapper' v-for="(item,index) in cartInfo" :key="index" @click="jumpCon(item.product_id)">
+				<view class='pictrue'>
+					<image :src='item.productInfo.attrInfo.image' v-if="item.productInfo.attrInfo"></image>
+					<image :src='item.productInfo.image' v-else></image>
+				</view>
+				<view class='text'>
+					<view class='acea-row row-between-wrapper'>
+						<view class='name line1'>{{item.productInfo.store_name}}</view>
+						<view class='num'>x {{item.cart_num}}</view>
+					</view>
+					<view class='attr line1' v-if="item.productInfo.attrInfo">{{item.productInfo.attrInfo.suk}}</view>
+					<view class='money font-color' v-if="item.productInfo.attrInfo">¥{{item.productInfo.attrInfo.price}}</view>
+					<view class='money font-color' v-else>¥{{item.productInfo.price}}</view>
+					<view class='evaluate' v-if='item.is_reply==0 && evaluate==3' @click.stop="evaluateTap(item.unique,orderId)">评价</view>
+					<view class='evaluate' v-else-if="item.is_reply==1 && evaluate==3">已评价</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			evaluate: {
+				type: Number,
+				default: 0,
+			},
+			cartInfo: {
+				type: Array,
+				default: function() {
+					return [];
+				}
+			},
+			orderId: {
+				type: String,
+				default: '',
+			},
+			jump: {
+				type: Boolean,
+				default: false,
+			}
+		},
+		data() {
+			return {
+				totalNmu:''
+			};
+		},
+		watch:{
+			cartInfo:function(nVal,oVal){
+				let num = 0
+				nVal.forEach((item,index)=>{
+					num += item.cart_num
+				})
+				this.totalNmu = num
+			}
+		},
+		methods: {
+			evaluateTap:function(unique,orderId){
+				uni.navigateTo({
+					url:"/pages/users/goods_comment_con/index?unique="+unique+"&uni="+orderId
+				})
+			},
+			jumpCon:function(id){
+				if(this.jump){
+					uni.navigateTo({
+						url: `/pages/goods_details/index?id=${id}`
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.orderGoods {
+		background-color: #fff;
+		margin-top: 12rpx;
+	}
+
+	.orderGoods .total {
+		width: 100%;
+		height: 86rpx;
+		padding: 0 30rpx;
+		border-bottom: 2rpx solid #f0f0f0;
+		font-size: 30rpx;
+		color: #282828;
+		line-height: 86rpx;
+		box-sizing: border-box;
+	}
+</style>

+ 290 - 0
components/payment/index.vue

@@ -0,0 +1,290 @@
+<template>
+	<view>
+		<view class="payment" :class="pay_close ? 'on' : ''">
+			<view class="title acea-row row-center-wrapper">
+				选择付款方式<text class="iconfont icon-guanbi" @click='close'></text>
+			</view>
+			<view class="item acea-row row-between-wrapper" @click='goPay(item.number || 0 , item.value)' v-for="(item,index) in payMode"
+			 :key="index">
+				<view class="left acea-row row-between-wrapper">
+					<view class="iconfont" :class="item.icon"></view>
+					<view class="text">
+						<view class="name">{{item.name}}</view>
+						<view class="info" v-if="item.number">
+							{{item.title}} <span class="money">¥{{ item.number }}</span>
+						</view>
+						<view class="info" v-else>{{item.title}}</view>
+					</view>
+				</view>
+				<view class="iconfont icon-xiangyou"></view>
+			</view>
+		</view>
+		<view class="mask" @click='close' v-if="pay_close"></view>
+	</view>
+</template>
+
+<script>
+	import {
+		orderPay
+	} from '@/api/order.js';
+	export default {
+		props: {
+			payMode: {
+				type: Array,
+				default: function() {
+					return [];
+				}
+			},
+			pay_close: {
+				type: Boolean,
+				default: false,
+			},
+			order_id: {
+				type: String,
+				default: ''
+			},
+			totalPrice: {
+				type: String,
+				default: '0'
+			}
+		},
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			close: function() {
+				this.$emit('onChangeFun', {
+					action: 'payClose'
+				});
+			},
+			goPay: function(number, paytype) {
+				let that = this;
+				if (!that.order_id) return that.$util.Tips({
+					title: '请选择要支付的订单'
+				});
+				if (paytype == 'yue' && parseFloat(number) < parseFloat(that.totalPrice)) return that.$util.Tips({
+					title: '余额不足!'
+				});
+				uni.showLoading({
+					title: '支付中'
+				});
+				orderPay({
+					uni: that.order_id,
+					paytype: paytype,
+					// #ifdef MP 
+					'from': 'routine',
+					// #endif
+					// #ifdef H5 || APP-PLUS
+					'from': this.$wechat.isWeixin() ? 'weixin' : 'weixinh5',
+					// #endif
+				}).then(res => {
+					switch (paytype) {
+						case 'weixin':
+							if (res.data.result === undefined) return that.$util.Tips({
+								title: '缺少支付参数'
+							});
+							// #ifdef MP || APP-PLUS
+							let jsConfig = res.data.result.jsConfig;
+							uni.requestPayment({
+								timeStamp: jsConfig.timestamp,
+								nonceStr: jsConfig.nonceStr,
+								package: jsConfig.package,
+								signType: jsConfig.signType,
+								paySign: jsConfig.paySign,
+								success: function(res) {
+									uni.hideLoading();
+									return that.$util.Tips({
+										title: res.msg,
+										icon: 'success'
+									}, () => {
+										that.$emit('onChangeFun', {
+											action: 'pay_complete'
+										});
+									});
+								},
+								fail: function(e) {
+									uni.hideLoading();
+									return that.$util.Tips({
+										title: '取消支付'
+									}, () => {
+										that.$emit('onChangeFun', {
+											action: 'pay_fail'
+										});
+									});
+								},
+								complete: function(e) {
+									uni.hideLoading();
+									if (e.errMsg == 'requestPayment:cancel') return that.$util.Tips({
+										title: '取消支付'
+									}, () => {
+										that.$emit('onChangeFun', {
+											action: 'pay_fail'
+										});
+									});
+								},
+							});
+							// #endif
+							// #ifdef H5
+							let data = res.data;
+							if (data.status == "WECHAT_H5_PAY") {
+								uni.hideLoading();
+								location.replace(data.result.jsConfig.mweb_url);
+								return that.$util.Tips({
+									title: "支付成功",
+									icon: 'success'
+								}, () => {
+									that.$emit('onChangeFun', {
+										action: 'pay_complete'
+									});
+								});
+							} else {
+								that.$wechat.pay(data.result.jsConfig)
+									.finally(() => {
+										return that.$util.Tips({
+											title: "支付成功",
+											icon: 'success'
+										}, () => {
+											that.$emit('onChangeFun', {
+												action: 'pay_complete'
+											});
+										});
+									})
+									.catch(function() {
+										return that.$util.Tips({
+											title: '支付失败'
+										});
+									});
+							}
+							// #endif
+							break;
+						case 'yue':
+							uni.hideLoading();
+							return that.$util.Tips({
+								title: res.msg,
+								icon: 'success'
+							}, () => {
+								that.$emit('onChangeFun', {
+									action: 'pay_complete'
+								});
+							});
+							break;
+						case 'offline':
+							uni.hideLoading();
+							return that.$util.Tips({
+								title: res.msg,
+								icon: 'success'
+							}, () => {
+								that.$emit('onChangeFun', {
+									action: 'pay_complete'
+								});
+							});
+							break;
+					}
+				}).catch(err => {
+					uni.hideLoading();
+					return that.$util.Tips({
+						title: err
+					}, () => {
+						that.$emit('onChangeFun', {
+							action: 'pay_fail'
+						});
+					});
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.payment {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		border-radius: 16rpx 16rpx 0 0;
+		background-color: #fff;
+		padding-bottom: 60rpx;
+		z-index: 99;
+		transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
+		transform: translate3d(0, 100%, 0);
+	}
+
+	.payment.on {
+		transform: translate3d(0, 0, 0);
+	}
+
+	.payment .title {
+		text-align: center;
+		height: 123rpx;
+		font-size: 32rpx;
+		color: #282828;
+		font-weight: bold;
+		padding-right: 30rpx;
+		margin-left: 30rpx;
+		position: relative;
+		border-bottom: 1rpx solid #eee;
+	}
+
+	.payment .title .iconfont {
+		position: absolute;
+		right: 30rpx;
+		top: 50%;
+		transform: translateY(-50%);
+		font-size: 43rpx;
+		color: #8a8a8a;
+		font-weight: normal;
+	}
+
+	.payment .item {
+		border-bottom: 1rpx solid #eee;
+		height: 130rpx;
+		margin-left: 30rpx;
+		padding-right: 30rpx;
+	}
+
+	.payment .item .left {
+		width: 610rpx;
+	}
+
+	.payment .item .left .text {
+		width: 540rpx;
+	}
+
+	.payment .item .left .text .name {
+		font-size: 32rpx;
+		color: #282828;
+	}
+
+	.payment .item .left .text .info {
+		font-size: 24rpx;
+		color: #999;
+	}
+
+	.payment .item .left .text .info .money {
+		color: #ff9900;
+	}
+
+	.payment .item .left .iconfont {
+		font-size: 45rpx;
+		color: #09bb07;
+	}
+
+	.payment .item .left .iconfont.icon-zhifubao {
+		color: #00aaea;
+	}
+
+	.payment .item .left .iconfont.icon-yuezhifu {
+		color: #ff9900;
+	}
+
+	.payment .item .left .iconfont.icon-yuezhifu1 {
+		color: #eb6623;
+	}
+
+	.payment .item .iconfont {
+		font-size: 0.3rpx;
+		color: #999;
+	}
+</style>

+ 89 - 0
components/productConSwiper/index.vue

@@ -0,0 +1,89 @@
+<template>
+	   <!-- <view class='product-bg'>
+	        <swiper  :indicator-dots="indicatorDots"
+	            :autoplay="autoplay" :circular="circular" :interval="interval" :duration="duration" @change="change">
+	            <block v-for="(item,index) in imgUrls" :key="index"> 
+	                <swiper-item>
+	                   <image :src="item" class="slide-image"/>
+					   
+	                </swiper-item>
+	            </block>
+	        </swiper>
+	        <view class='pages'>{{currents}}/{{imgUrls.length || 1}}</view>
+	    </view> -->
+		    <view class='product-bg'>
+		        <swiper  :indicator-dots="indicatorDots" indicator-active-color="#e93323"
+		            :autoplay="autoplay" :circular="circular" :interval="interval" :duration="duration" @change="change">
+		            <swiper-item v-if="videoline">
+		              <view class="item">
+		                 <video id="myVideo" :src='videoline' objectFit="cover" controls	 style="width:100%;height:100% " show-center-play-btn show-mute-btn="true" auto-pause-if-navigate  :custom-cache="false"></video>
+		                 <cover-view class="poster" v-if="controls">
+		                    <cover-image class="image" :src="imgUrls[0]"></cover-image>
+		                 </cover-view>
+		                 <cover-view class="stop" v-if="controls"  @tap="bindPause">
+		                     <cover-image class="image" src="../../static/images/stop.png"></cover-image>
+		                 </cover-view>
+		              </view>  
+		            </swiper-item>
+		            <block v-for="(item,index) in imgUrls" :key='index'> 
+		               <swiper-item>
+		                  <image :src="item" class="slide-image"/>
+		               </swiper-item>
+		            </block>
+		        </swiper>
+		    </view>
+</template>
+
+<script>
+	export default {
+		props: {
+			    imgUrls: {
+					type: Array,
+					default: function(){
+						return [];
+					}
+			    },
+				    videoline: 
+				      {
+				        type:String,
+				        value:""
+				      }
+		},
+		data() {
+			return {
+				    indicatorDots: true,
+				        circular: true,
+				        autoplay: false,
+				        interval: 3000,
+				        duration: 500,
+				        currents: "1",
+				        controls:true
+			};
+		},
+		mounted(){
+			this.videoContext = uni.createVideoContext('myVideo',this);
+		},
+		methods: {
+			 bindPause:function(){
+			      this.videoContext.play();
+				  this.$set(this,'controls',false)
+			    },
+			    change: function (e) {
+				  this.$set(this,'currents',e.detail.current + 1); 
+			    }
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.product-bg{width:100%;height:750rpx;position:relative;}
+	.product-bg swiper{width:100%;height:100%;position:relative;}
+	.product-bg .slide-image{width:100%;height:100%;}
+	.product-bg .pages{position:absolute;background-color:#fff;height:34rpx;padding:0 10rpx;border-radius:3rpx;right:30rpx;bottom:30rpx;line-height:34rpx;font-size:24rpx;color:#050505;}
+	#myVideo{width: 100%;height: 100%}
+	.product-bg .item{position:relative;width:100%;height:100%;}
+	.product-bg .item .poster{position:absolute;top:0;left:0;height:750rpx;width:100%;z-index:9;}
+	.product-bg .item .poster .image{width:100%;height:100%;}
+	.product-bg .item .stop{position:absolute;top:50%;left:50%;width:136rpx;height:136rpx;margin-top:-68rpx;margin-left:-68rpx;z-index:9;}
+	.product-bg .item .stop .image{width:100%;height:100%;}
+</style>

+ 290 - 0
components/productWindow/index.vue

@@ -0,0 +1,290 @@
+<template>
+	<view>
+		<view class="product-window" :class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt?'join':'')">
+			<view class="textpic acea-row row-between-wrapper">
+				<view class="pictrue">
+					<image :src="attr.productSelect.image"></image>
+				</view>
+				<view class="text">
+					<view class="line1">
+						{{ attr.productSelect.store_name }}
+					</view>
+					<view class="money font-color">
+						¥<text class="num">{{ attr.productSelect.price }}</text>
+						<text class="stock" v-if='isShow'>库存: {{ attr.productSelect.stock }}</text>
+						<text class='stock' v-if="limitNum">限量: {{attr.productSelect.quota_show}}</text>
+					</view>
+				</view>
+				<view class="iconfont icon-guanbi" @click="closeAttr"></view>
+			</view>
+			<view class="productWinList">
+				<view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
+					<view class="title">{{ item.attr_name }}</view>
+					<view class="listn acea-row row-middle">
+						<view class="itemn" :class="item.index === itemn.attr ? 'on' : ''" v-for="(itemn, indexn) in item.attr_value"
+						 @click="tapAttr(indexw, indexn)" :key="indexn">
+							{{ itemn.attr }}
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="cart">
+				<view class="title">数量</view>
+				<view class="carnum acea-row row-left">
+					<view class="item reduce" :class="attr.productSelect.cart_num <= 1 ? 'on' : ''" @click="CartNumDes">
+						-
+					</view>
+					<view class='item num'>
+					    <input type="number" v-model="attr.productSelect.cart_num" data-name="productSelect.cart_num" @input="bindCode(attr.productSelect.cart_num)"></input>
+					</view>
+					<view v-if="iSplus" class="item plus" :class="
+	              attr.productSelect.cart_num >= attr.productSelect.stock
+	                ? 'on'
+	                : ''
+	            "
+					 @click="CartNumAdd">
+						+
+					</view>
+					<view v-else class='item plus' :class='(attr.productSelect.cart_num >= attr.productSelect.quota_show) || (attr.productSelect.cart_num >= attr.productSelect.product_stock)? "on":""' @click='CartNumAdd'>+</view>
+				</view>
+			</view>
+			<view class="joinBnt bg-color" v-if="iSbnt && attr.productSelect.product_stock>0 &&attr.productSelect.quota>0" @click="goCat">我要参团</view>
+			<view class="joinBnt on" v-else-if="(iSbnt && attr.productSelect.quota<=0)||(iSbnt &&attr.productSelect.product_stock<=0)">已售罄</view>
+		</view>
+		<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+
+		props: {
+			attr: {
+				type: Object,
+				default: () => {}
+			},
+			    limitNum:{
+			      type: Number,
+			      value: 0
+			    },
+				isShow:{
+				  type: Number,
+				  value: 0
+				},
+				iSbnt:{
+				   type:Number,
+				   value:0
+				},
+				iSplus:{
+					type:Number,
+					value:0
+			    }
+		},
+		data() {
+			return {};
+		},
+		methods: {
+			    goCat:function(){
+			      this.$emit('goCat');
+			    },
+			 /**
+			    * 购物车手动输入数量
+			    * 
+			    */
+			    bindCode: function (e) {
+			      this.$emit('iptCartNum', this.attr.productSelect.cart_num);
+			    },
+			closeAttr: function() {
+				this.$emit('myevent');
+			},
+			CartNumDes: function() {
+				this.$emit('ChangeCartNum', false);
+			},
+			CartNumAdd: function() {
+				this.$emit('ChangeCartNum', true);
+			},
+			tapAttr: function(indexw, indexn) {
+				let that = this;
+				that.$emit("attrVal", {
+					indexw: indexw,
+					indexn: indexn
+				});
+				this.$set(this.attr.productAttr[indexw], 'index', this.attr.productAttr[indexw].attr_values[indexn]);
+				let value = that
+					.getCheckedValue()
+					.sort()
+					.join(",");
+				that.$emit("ChangeAttr", value);
+
+			},
+			//获取被选中属性;
+			getCheckedValue: function() {
+				let productAttr = this.attr.productAttr;
+				let value = [];
+				for (let i = 0; i < productAttr.length; i++) {
+					for (let j = 0; j < productAttr[i].attr_values.length; j++) {
+						if (productAttr[i].index === productAttr[i].attr_values[j]) {
+							value.push(productAttr[i].attr_values[j]);
+						}
+					}
+				}
+				return value;
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.product-window {
+		position: fixed;
+		bottom: 0;
+		width: 100%;
+		left: 0;
+		background-color: #fff;
+		z-index: 77;
+		border-radius: 16rpx 16rpx 0 0;
+		padding-bottom: 140rpx;
+		transform: translate3d(0, 100%, 0);
+		transition: all .3s cubic-bezier(.25, .5, .5, .9);
+	}
+
+	.product-window.on {
+		transform: translate3d(0, 0, 0);
+	}
+	
+	.product-window.join{padding-bottom: 30rpx;}
+
+	.product-window .textpic {
+		padding: 0 130rpx 0 30rpx;
+		margin-top: 29rpx;
+		position: relative;
+	}
+
+	.product-window .textpic .pictrue {
+		width: 150rpx;
+		height: 150rpx;
+	}
+
+	.product-window .textpic .pictrue image {
+		width: 100%;
+		height: 100%;
+		border-radius: 10rpx;
+	}
+
+	.product-window .textpic .text {
+		width: 410rpx;
+		font-size: 32rpx;
+		color: #202020;
+	}
+
+	.product-window .textpic .text .money {
+		font-size: 24rpx;
+		margin-top: 40rpx;
+	}
+
+	.product-window .textpic .text .money .num {
+		font-size: 36rpx;
+	}
+
+	.product-window .textpic .text .money .stock {
+		color: #999;
+		margin-left: 18rpx;
+	}
+
+	.product-window .textpic .iconfont {
+		position: absolute;
+		right: 30rpx;
+		top: -5rpx;
+		font-size: 35rpx;
+		color: #8a8a8a;
+	}
+
+	.product-window .productWinList {
+		max-height: 395rpx;
+		overflow: auto;
+		margin-top: 36rpx;
+	}
+
+	.product-window .productWinList .item~.item {
+		margin-top: 36rpx;
+	}
+
+	.product-window .productWinList .item .title {
+		font-size: 30rpx;
+		color: #999;
+		padding: 0 30rpx;
+	}
+
+	.product-window .productWinList .item .listn {
+		padding: 0 30rpx 0 16rpx;
+	}
+
+	.product-window .productWinList .item .listn .itemn {
+		border: 1px solid #bbb;
+		font-size: 26rpx;
+		color: #282828;
+		padding: 7rpx 33rpx;
+		border-radius: 6rpx;
+		margin: 14rpx 0 0 14rpx;
+	}
+
+	.product-window .productWinList .item .listn .itemn.on {
+		color: #fff;
+		background-color: #ff3700;
+		border-color: #ff3700;
+	}
+
+	.product-window .cart {
+		margin-top: 36rpx;
+		padding: 0 30rpx;
+	}
+
+	.product-window .cart .title {
+		font-size: 30rpx;
+		color: #999;
+	}
+
+	.product-window .cart .carnum {
+		height: 54rpx;
+		margin-top: 24rpx;
+	}
+
+	.product-window .cart .carnum view {
+		border: 1px solid #a4a4a4;
+		width: 84rpx;
+		text-align: center;
+		height: 100%;
+		line-height: 54rpx;
+		color: #a4a4a4;
+		font-size: 45rpx;
+	}
+
+	.product-window .cart .carnum .reduce {
+		border-right: 0;
+		border-radius: 6rpx 0 0 6rpx;
+		line-height: 48rpx;
+	}
+
+	.product-window .cart .carnum .reduce.on {
+		border-color: #e3e3e3;
+		color: #dedede;
+	}
+
+	.product-window .cart .carnum .plus {
+		border-left: 0;
+		border-radius: 0 6rpx 6rpx 0;
+		line-height: 46rpx;
+	}
+
+	.product-window .cart .carnum .plus.on {
+		border-color: #e3e3e3;
+		color: #dedede;
+	}
+
+	.product-window .cart .carnum .num {
+		color: #282828;
+		font-size: 28rpx;
+	}
+	.product-window .joinBnt{font-size: 30rpx;width: 620rpx;height: 86rpx;border-radius: 50rpx;text-align: center;line-height: 86rpx;color: #fff;margin: 21rpx auto 0 auto;}
+	.product-window .joinBnt.on{background-color:#bbb;color:#fff;}
+</style>

+ 110 - 0
components/promotionGood/index.vue

@@ -0,0 +1,110 @@
+<template>
+	<view class='promotionGood'>
+		<block v-for="(item,index) in benefit" :key="index">
+			<view class='item acea-row row-between-wrapper' @tap="goDetail(item)" hover-class="none">
+				<view class='pictrue'>
+					<image :src='item.image'></image>
+					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
+					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
+					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
+				</view>
+				<view class='text'>
+					<view class='name line1'>{{item.store_name}}</view>
+					<view class='sp-money acea-row'>
+						<view class='moneyCon'>促销价: ¥<text class='num'>{{item.price}}</text></view>
+					</view>
+					<view class='acea-row row-between-wrapper'>
+						<view class='money'>日常价:¥{{item.ot_price}}</view>
+						<view>仅剩:{{item.stock}}{{item.unit_name}}</view>
+					</view>
+				</view>
+			</view>
+		</block>
+	</view>
+</template>
+<script>
+	import {mapGetters} from "vuex";
+	import { goShopDetail } from '@/libs/order.js'
+	export default {
+		computed: mapGetters(['uid']),
+		props: {
+			benefit: {
+				type: Array,
+				default: function() {
+					return [];
+				}
+			}
+		},
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			goDetail(item){
+				goShopDetail(item,this.uid).then(res=>{
+					uni.navigateTo({
+						url:`/pages/goods_details/index?id=${item.id}`
+					})
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang='scss'>
+	.promotionGood {
+		padding: 0 30rpx;
+	}
+
+	.promotionGood .item {
+		border-bottom: 1rpx solid #eee;
+		height: 250rpx;
+	}
+
+	.promotionGood .item .pictrue {
+		position: relative;
+		width: 188rpx;
+		height: 188rpx;
+	}
+
+	.promotionGood .item .pictrue image {
+		width: 100%;
+		height: 100%;
+		border-radius: 8rpx;
+	}
+
+	.promotionGood .item .text {
+		font-size: 24rpx;
+		color: #999;
+		width: 472rpx;
+	}
+
+	.promotionGood .item .text .name {
+		font-size: 30rpx;
+		color: #333;
+	}
+
+	.promotionGood .item .text .sp-money {
+		margin: 34rpx 0 20rpx 0;
+	}
+
+	.promotionGood .item .text .sp-money .moneyCon {
+		padding: 0 18rpx;
+		background-color: red;
+		height: 46rpx;
+		line-height: 46rpx;
+		background-image: linear-gradient(to right, #ff6248 0%, #ff3e1e 100%);
+		font-size: 20rpx;
+		color: #fff;
+		border-radius: 24rpx 3rpx 24rpx 3rpx;
+	}
+
+	.promotionGood .item .text .sp-money .moneyCon .num {
+		font-size: 24rpx;
+	}
+
+	.promotionGood .item .text .money {
+		text-decoration: line-through;
+	}
+</style>

+ 113 - 0
components/recommend/index.vue

@@ -0,0 +1,113 @@
+<template>
+	<view class='recommend'>
+		<view class='title acea-row row-center-wrapper'>
+			<text class='iconfont icon-zhuangshixian'></text>
+			<text class='name'>热门推荐</text>
+			<text class='iconfont icon-zhuangshixian lefticon'></text>
+		</view>
+		<view class='recommendList acea-row row-between-wrapper'>
+			<view class='item' v-for="(item,index) in hostProduct" :key="index" hover-class='none' @tap="goDetail(item)">
+				<view class='pictrue'>
+					<image :src='item.image'></image>
+					<span class="pictrue_log_big pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
+					<span class="pictrue_log_big pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
+					<span class="pictrue_log_big pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
+				</view>
+				<view class='name line1'>{{item.store_name}}</view>
+				<view class='money font-color'>¥<text class='num'>{{item.price}}</text></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {mapGetters} from "vuex";
+	import { goShopDetail } from '@/libs/order.js'
+	export default {
+	computed: mapGetters(['uid']),
+		props: {
+			hostProduct: {
+				type: Array,
+				default: function() {
+					return [];
+				}
+			}
+		},
+		data() {
+			return {
+
+			};
+		},
+
+		methods: {
+			goDetail(item){
+				goShopDetail(item,this.uid).then(res=>{
+					uni.navigateTo({
+						url:`/pages/goods_details/index?id=${item.id}`
+					})
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.recommend {
+		background-color: #fff;
+	}
+
+	.recommend .title {
+		height: 135rpx;
+		font-size: 28rpx;
+		color: #282828;
+	}
+
+	.recommend .title .name {
+		margin: 0 28rpx;
+	}
+
+	.recommend .title .iconfont {
+		font-size: 170rpx;
+		color: #454545;
+	}
+
+	.recommend .title .iconfont.lefticon {
+		transform: rotate(180deg);
+	}
+
+	.recommend .recommendList {
+		padding: 0 30rpx;
+	}
+
+	.recommend .recommendList .item {
+		width: 335rpx;
+		margin-bottom: 30rpx;
+	}
+
+	.recommend .recommendList .item .pictrue {
+		position: relative;
+		width: 100%;
+		height: 335rpx;
+	}
+
+	.recommend .recommendList .item .pictrue image {
+		width: 100%;
+		height: 100%;
+		border-radius: 6rpx;
+	}
+
+	.recommend .recommendList .item .name {
+		font-size: 28rpx;
+		color: #282828;
+		margin-top: 20rpx;
+	}
+
+	.recommend .recommendList .item .money {
+		font-size: 20rpx;
+		margin-top: 8rpx;
+	}
+
+	.recommend .recommendList .item .money .num {
+		font-size: 28rpx;
+	}
+</style>

+ 47 - 0
components/shareInfo/index.vue

@@ -0,0 +1,47 @@
+<template>
+	<view v-if="shareInfoStatus" class="poster-first">
+	    <view class="mask-share">
+			<image src="/static/images/share-info.png" @click="shareInfoClose" @touchmove.stop.prevent="false"></image>
+	    </view>
+	  </view>
+</template>
+
+<script>
+	
+export default {
+	props: {
+		 shareInfoStatus: {
+		      type: Boolean,
+		      default:false,
+		    }
+	},
+  data: function() {
+    return {};
+  },
+  mounted: function() {},
+  methods: {
+    shareInfoClose: function() {
+      this.$emit("setShareInfoStatus");
+    }
+  }
+};
+
+</script>
+
+<style scoped lang="scss">
+	.poster-first {
+	  overscroll-behavior: contain;
+	}
+	.mask-share {
+	  position: fixed;
+	  top: 0;
+	  left: 0;
+	  right: 0;
+	  bottom: 0;
+	  z-index: 99;
+	}
+	.mask-share image {
+	  width: 100%;
+	  height:100%;
+	}
+</style>

+ 57 - 0
components/shareRedPackets/index.vue

@@ -0,0 +1,57 @@
+<template>
+	<view class='sharing-packets' :class='sharePacket.isState==true?"on":""'>
+	   <view class='iconfont icon-guanbi' @click="closeShare"></view>
+	   <view class='line'></view>
+	   <view class='sharing-con' @click='goShare'>
+	      <image src='../../static/images/red-packets.png'></image>
+	      <view class='text font-color'>
+	        <view>会员分享返</view>
+	        <view class='money'><text class='label'>¥</text>{{sharePacket.priceName}}</view>
+	        <view class='tip'>下单即返佣金</view>
+	        <view class='shareBut'>立即分享</view>
+	      </view>
+	   </view>  
+	</view>
+</template>
+
+<script>
+	export default {
+		
+		props: {
+			    sharePacket: {
+					type: Object,
+					default: function(){
+						return {isState: true,priceName:''}
+					}
+			    }
+		},
+		data() {
+			return {
+
+			};
+		},
+		
+		methods: {
+			closeShare:function(){
+				  this.$emit('closeChange');
+			    },
+				goShare:function(){
+				      this.$emit('listenerActionSheet');
+				    }
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.sharing-packets{position:fixed;left:30rpx;bottom:200rpx;z-index:5;transition:all 0.3s ease-in-out 0s;opacity:1;transform: scale(1);}
+	.sharing-packets.on{transform: scale(0);opacity:0;}
+	.sharing-packets .iconfont{width:44rpx;height:44rpx;border-radius:50%;text-align:center;line-height:44rpx;background-color:#999;font-size:20rpx;color:#fff;margin:0 auto;box-sizing:border-box;padding-left:1px;}
+	.sharing-packets .line{width:2rpx;height:40rpx;background-color:#999;margin:0 auto;}
+	.sharing-packets .sharing-con{width:187rpx;height:210rpx;position:relative;}
+	.sharing-packets .sharing-con image{width:100%;height:100%;}
+	.sharing-packets .sharing-con .text{position:absolute;top:30rpx;font-size:20rpx;width:100%;text-align:center;}
+	.sharing-packets .sharing-con .text .money{font-size:32rpx;font-weight:bold;margin-top:5rpx;}
+	.sharing-packets .sharing-con .text .money .label{font-size:20rpx;}
+	.sharing-packets .sharing-con .text .tip{font-size:18rpx;color:#999;margin-top:5rpx;}
+	.sharing-packets .sharing-con .text .shareBut{font-size:22rpx;color:#fff;margin-top:18rpx;height:50rpx;line-height:50rpx;}
+</style>

+ 52 - 0
components/swipers/index.vue

@@ -0,0 +1,52 @@
+<template>
+	    <view class='swiper'>
+	        <swiper :autoplay="autoplay" :circular="circular" :interval="interval" :duration="duration" @change="swiperChange">
+	            <block v-for="(item,index) in imgUrls" :key="index">
+	              <swiper-item>
+	                <navigator :url="item.link" style='width:100%;height:100%;' hover-class='none'><image :src="item.img" class="slide-image"/></navigator>
+	              </swiper-item>
+	            </block>
+	        </swiper>
+	        <view class="dots acea-row">
+	          <view class="dot" :class="index == currentSwiper ? 'active' : ''" v-for="(item,index) in imgUrls" :key="index"></view>
+	        </view>
+	    </view>
+</template>
+
+	<script>
+		export default {
+			
+			props: {
+				 imgUrls: {
+				 	type: Array,
+				 	default: function(){
+				 		return [];
+				 	}
+				 }
+			},
+			data() {
+				return {
+					circular: true,
+					    autoplay: true,
+					    interval: 3000,
+					    duration: 500,
+					    currentSwiper: 0
+				};
+			},
+			
+			methods: {
+				swiperChange: function (e) {
+					 this.currentSwiper = e.detail.current
+				    }
+			}
+		}
+	</script>
+
+<style scoped lang="scss">
+	.swiper{width:100%;height:282rpx;position:relative;}
+	.swiper swiper{width:100%;height:100%;position:relative;}
+	.swiper swiper .slide-image{width:100%;height:100%;}
+	.swiper .dots{position:absolute;right:40rpx;bottom:20rpx;}
+	.swiper .dots .dot{width:12rpx;height:12rpx;border:2rpx solid #fff;border-radius:50%;margin-right:15rpx;}
+	.swiper .dots .dot.active{border-color:#e93323;background-color:#e93323;}
+</style>

+ 185 - 0
components/tabNav.vue

@@ -0,0 +1,185 @@
+<template>
+	<view class="navTabBox">
+		<view class="longTab">
+			<scroll-view scroll-x="true" style="white-space: nowrap; display: flex;" scroll-with-animation :scroll-left="tabLeft" show-scrollbar="true">
+				<view class="longItem" :style='"width:"+isWidth+"px"' :data-index="index" :class="index===tabClick?'click':''" v-for="(item,index) in tabTitle" :key="index" :id="'id'+index" @click="longClick(index)">{{item.cate_name}}</view>
+				<view class="underlineBox" :style='"transform:translateX("+isLeft+"px);width:"+isWidth+"px"'>
+					<view class="underline"></view>
+				</view>
+			</scroll-view>
+		</view>
+		<view class="child-box" v-if="tabClick>0 && tabTitle[tabClick].children.length>0">
+			<scroll-view scroll-x="true" style="white-space: nowrap; display: flex;align-items: center; height: 100%;" scroll-with-animation :scroll-left="tabLeft" show-scrollbar="false">
+				<view class="wrapper">
+					<view v-for="(item,index) in tabTitle[tabClick].children" class="child-item" :class="{on:index == childIndex}" @click="childTab(tabClick,index)">
+						<image :src="item.pic" mode=""></image>
+						<view class="txt">{{item.cate_name}}</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getProductslist,
+		getProductHot
+	} from '@/api/store.js';
+	export default {
+		name: 'navTab',
+		props: {
+			tabTitle: {
+				type: Array,
+				default: []
+			}
+
+		},
+		data() {
+			return {
+				tabClick: 0, //导航栏被点击
+				isLeft: 0, //导航栏下划线位置
+				isWidth: 0, //每个导航栏占位
+				tabLeft:0,
+				swiperIndex:0,
+				childIndex:0,
+				childID:0
+			};
+		},
+		created() {
+			
+			var that = this
+			// 获取设备宽度
+			uni.getSystemInfo({
+				success(e) {
+					that.isWidth = e.windowWidth / 5 
+				}
+			})
+		},
+		methods: {
+			// 导航栏点击
+			longClick(index){
+				this.childIndex = 0;
+				if(this.tabTitle.length>5){
+					var tempIndex = index - 2;
+					tempIndex = tempIndex<=0 ? 0 : tempIndex;
+					this.tabLeft = (index-2) * this.isWidth //设置下划线位置
+				}
+				this.tabClick = index //设置导航点击了哪一个
+				this.isLeft = index * this.isWidth //设置下划线位置
+				let obj = {
+					type:'big',  //大标题
+					index:index
+				}
+				this.parentEmit(obj)
+				// this.$parent.currentTab = index //设置swiper的第几页
+			},
+			// 导航子类点击
+			childTab(tabClick,index){
+				this.childIndex = index
+				let obj = {
+					parentIndex:tabClick,
+					childIndex:index,
+					type:'small' //小标题
+				}
+				this.parentEmit(obj)
+			},
+			parentEmit(data){
+				this.$emit('changeTab', data);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navTabBox {
+		width: 100%;
+		color: rgba(255, 255, 255, 1);
+		.click {
+			color: white;
+		}
+		.longTab {
+			width: 100%;
+			/* #ifdef H5 */
+			padding-bottom: 20rpx;
+			/* #endif */
+			/* #ifdef MP */
+			padding-top: 12rpx;
+			padding-bottom: 12rpx;
+			/* #endif */
+			.longItem{ 
+				height: 50upx; 
+				display: inline-block;
+				line-height: 50upx;
+				text-align: center;
+				font-size: 30rpx;
+				&.click{
+					font-weight: bold;
+				}
+			}
+			.underlineBox {
+				height: 3px;
+				width: 20%;
+				display: flex;
+				align-content: center;
+				justify-content: center;
+				transition: .5s;
+				.underline {
+					width: 33rpx;
+					height: 4rpx;
+					background-color: white;
+				}
+			}
+		}
+	}
+	.child-box{
+		width: 100%;
+		position: relative;
+		// height: 152rpx;
+		background-color: #fff;
+		/* #ifdef H5 */
+		box-shadow: 0 2px 5px 1px rgba(0, 0, 0, 0.02);
+		/* #endif */
+		/* #ifdef MP */
+		box-shadow: 0 2rpx 3rpx 1rpx #f9f9f9;
+		/* #endif */
+		
+		.wrapper{
+			display: flex;
+			align-items: center;
+			padding: 20rpx 0;
+			background: #fff;
+			/* #ifdef H5 */
+			//box-shadow: 0 2px 5px 1px rgba(0, 0, 0, 0.06);
+			/* #endif */
+		}
+		.child-item{
+			flex-shrink: 0;
+			width:140rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			margin-left: 10rpx;
+			image{
+				width: 90rpx;
+				height: 90rpx;
+				border-radius: 50%;
+			}
+			.txt{
+				font-size: 24rpx;
+				color: #282828;
+				text-align: center;
+				margin-top: 10rpx;
+			}
+			&.on{
+				image{
+					border: 1px solid $theme-color-opacity;
+				}
+				.txt{
+					color: $theme-color;
+				}
+			}
+		}
+	}
+</style>

+ 165 - 0
components/ucharts/component.vue

@@ -0,0 +1,165 @@
+<template>
+	<canvas v-if="canvasId" :id="canvasId" :canvasId="canvasId" :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"
+	 @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @error="error">
+	</canvas>
+</template>
+
+<script>
+	import uCharts from './u-charts.js';
+	var canvases = {};
+	
+	export default {
+		props: {
+			chartType: {
+				required: true,
+				type: String,
+				default: 'column'
+			},
+			opts: {
+				required: true,
+				type: Object,
+				default () {
+					return null;
+				},
+			},
+			canvasId: {
+				type: String,
+				default: 'u-canvas',
+			},
+			cWidth: {
+				default: 375,
+			},
+			cHeight: {
+				default: 250,
+			},
+			pixelRatio: {
+				type: Number,
+				default: 1,
+			},
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				switch (this.chartType) {
+					case 'column':
+						this.initColumnChart();
+						break;
+					case 'line':
+						this.initLineChart();
+						break;
+					default:
+						break;
+				}
+			},
+			initColumnChart() {
+				canvases[this.canvasId] = new uCharts({
+					$this: this,
+					canvasId: this.canvasId,
+					type: 'column',
+					legend: true,
+					fontSize: 11,
+					background: '#FFFFFF',
+					pixelRatio: this.pixelRatio,
+					animation: true,
+					categories: this.opts.categories,
+					series: this.opts.series,
+					enableScroll: true,
+					xAxis: {
+						disableGrid: true,
+						itemCount: 4,
+						scrollShow: true
+					},
+					yAxis: {
+						//disabled:true
+					},
+					dataLabel: true,
+					width: this.cWidth * this.pixelRatio,
+					height: this.cHeight * this.pixelRatio,
+					extra: {
+						column: {
+							type: 'group',
+						}
+					}
+				});
+			},
+			initLineChart() {
+				canvases[this.canvasId] = new uCharts({
+					$this: this,
+					canvasId: this.canvasId,
+					type: 'line',
+					fontSize: 11,
+					legend: true,
+					dataLabel: false,
+					dataPointShape: true,
+					background: '#FFFFFF',
+					pixelRatio: this.pixelRatio,
+					categories: this.opts.categories,
+					series: this.opts.series,
+					animation: true,
+					enableScroll: true,
+					xAxis: {
+						type: 'grid',
+						gridColor: '#CCCCCC',
+						gridType: 'dash',
+						dashLength: 8,
+						itemCount: 4,
+						scrollShow: true
+					},
+					yAxis: {
+						gridType: 'dash',
+						gridColor: '#CCCCCC',
+						dashLength: 8,
+						splitNumber: 5,
+						min: 10,
+						max: 180,
+						format: (val) => {
+							return val.toFixed(0) + '元'
+						}
+					},
+					width: this.cWidth * this.pixelRatio,
+					height: this.cHeight * this.pixelRatio,
+					extra: {
+						line: {
+							type: 'straight'
+						}
+					}
+				});
+			},
+			// 这里仅作为示例传入两个参数,cid为canvas-id,newdata为更新的数据,需要更多参数请自行修改
+			changeData(cid,newdata) {
+				canvases[cid].updateData({
+					series: newdata.series,
+					categories: newdata.categories
+				});
+			},
+			touchStart(e) {
+				canvases[this.canvasId].showToolTip(e, {
+					format: function(item, category) {
+						return category + ' ' + item.name + ':' + item.data
+					}
+				});
+				canvases[this.canvasId].scrollStart(e);
+			},
+			touchMove(e) {
+				canvases[this.canvasId].scroll(e);
+			},
+			touchEnd(e) {
+				canvases[this.canvasId].scrollEnd(e);
+			},
+			error(e) {
+				console.log(e)
+			}
+		},
+	};
+</script>
+
+<style scoped>
+	.charts {
+		width: 100%;
+		height: 100%;
+		flex: 1;
+		background-color: #FFFFFF;
+	}
+</style>

+ 5658 - 0
components/ucharts/ucharts.js

@@ -0,0 +1,5658 @@
+/*
+ * uCharts v1.9.3.20190922
+ * uni-app平台高性能跨全端图表,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)
+ * Copyright (c) 2019 QIUN秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 
+ * uCharts官方网站
+ * https://www.uCharts.cn
+ * 
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ * 
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ * 
+ */
+
+'use strict';
+
+var config = {
+  yAxisWidth: 15,
+  yAxisSplit: 5,
+  xAxisHeight: 15,
+  xAxisLineHeight: 15,
+  legendHeight: 15,
+  yAxisTitleWidth: 15,
+  padding: [10, 10, 10, 10],
+  pixelRatio: 1,
+  rotate: false,
+  columePadding: 3,
+  fontSize: 13,
+  //dataPointShape: ['diamond', 'circle', 'triangle', 'rect'],
+  dataPointShape: ['circle', 'circle', 'circle', 'circle'],
+  colors: ['#1890ff', '#2fc25b', '#facc14', '#f04864', '#8543e0', '#90ed7d'],
+  pieChartLinePadding: 15,
+  pieChartTextPadding: 5,
+  xAxisTextPadding: 3,
+  titleColor: '#333333',
+  titleFontSize: 20,
+  subtitleColor: '#999999',
+  subtitleFontSize: 15,
+  toolTipPadding: 3,
+  toolTipBackground: '#000000',
+  toolTipOpacity: 0.7,
+  toolTipLineHeight: 20,
+  radarLabelTextMargin: 15,
+  gaugeLabelTextMargin: 15
+};
+
+let assign = function (target, ...varArgs) {
+    if (target == null) {
+        throw new TypeError('Cannot convert undefined or null to object');
+    }
+    if (!varArgs || varArgs.length <= 0) {
+        return target;
+    }
+    // 深度合并对象
+    function deepAssign(obj1, obj2) {
+        for (let key in obj2) {
+            obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ?
+                deepAssign(obj1[key], obj2[key]) : obj1[key] = obj2[key];
+        }
+        return obj1;
+    }
+
+    varArgs.forEach(val => {
+        target = deepAssign(target, val);
+    });
+    return target;
+};
+
+var util = {
+  toFixed: function toFixed(num, limit) {
+    limit = limit || 2;
+    if (this.isFloat(num)) {
+      num = num.toFixed(limit);
+    }
+    return num;
+  },
+  isFloat: function isFloat(num) {
+    return num % 1 !== 0;
+  },
+  approximatelyEqual: function approximatelyEqual(num1, num2) {
+    return Math.abs(num1 - num2) < 1e-10;
+  },
+  isSameSign: function isSameSign(num1, num2) {
+    return Math.abs(num1) === num1 && Math.abs(num2) === num2 || Math.abs(num1) !== num1 && Math.abs(num2) !== num2;
+  },
+  isSameXCoordinateArea: function isSameXCoordinateArea(p1, p2) {
+    return this.isSameSign(p1.x, p2.x);
+  },
+  isCollision: function isCollision(obj1, obj2) {
+    obj1.end = {};
+    obj1.end.x = obj1.start.x + obj1.width;
+    obj1.end.y = obj1.start.y - obj1.height;
+    obj2.end = {};
+    obj2.end.x = obj2.start.x + obj2.width;
+    obj2.end.y = obj2.start.y - obj2.height;
+    var flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y;
+    return !flag;
+  }
+};
+
+//兼容H5点击事件
+function getH5Offset(e) {
+  e.mp = {
+    changedTouches: []
+  };
+  e.mp.changedTouches.push({
+    x: e.offsetX,
+    y: e.offsetY
+  });
+  return e;
+}
+
+// hex 转 rgba
+function hexToRgb(hexValue, opc) {
+  var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
+  var hex = hexValue.replace(rgx, function(m, r, g, b) {
+    return r + r + g + g + b + b;
+  });
+  var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+  var r = parseInt(rgb[1], 16);
+  var g = parseInt(rgb[2], 16);
+  var b = parseInt(rgb[3], 16);
+  return 'rgba(' + r + ',' + g + ',' + b + ',' + opc + ')';
+}
+
+function findRange(num, type, limit) {
+  if (isNaN(num)) {
+    throw new Error('[uCharts] unvalid series data!');
+  }
+  limit = limit || 10;
+  type = type ? type : 'upper';
+  var multiple = 1;
+  while (limit < 1) {
+    limit *= 10;
+    multiple *= 10;
+  }
+  if (type === 'upper') {
+    num = Math.ceil(num * multiple);
+  } else {
+    num = Math.floor(num * multiple);
+  }
+  while (num % limit !== 0) {
+    if (type === 'upper') {
+      num++;
+    } else {
+      num--;
+    }
+  }
+  return num / multiple;
+}
+
+function calCandleMA(dayArr, nameArr, colorArr, kdata) {
+  let seriesTemp = [];
+  for (let k = 0; k < dayArr.length; k++) {
+    let seriesItem = {
+      data: [],
+      name: nameArr[k],
+      color: colorArr[k]
+    };
+    for (let i = 0, len = kdata.length; i < len; i++) {
+      if (i < dayArr[k]) {
+        seriesItem.data.push(null);
+        continue;
+      }
+      let sum = 0;
+      for (let j = 0; j < dayArr[k]; j++) {
+        sum += kdata[i - j][1];
+      }
+      seriesItem.data.push(+(sum / dayArr[k]).toFixed(3));
+    }
+    seriesTemp.push(seriesItem);
+  }
+  return seriesTemp;
+}
+
+function calValidDistance(self,distance, chartData, config, opts) {
+  var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3];
+  var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length-1);
+  var validDistance = distance;
+  if (distance >= 0) {
+    validDistance = 0;
+		self.event.trigger('scrollLeft');
+  } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) {
+    validDistance = dataChartAreaWidth - dataChartWidth;
+		self.event.trigger('scrollRight');
+  }
+  return validDistance;
+}
+
+function isInAngleRange(angle, startAngle, endAngle) {
+  function adjust(angle) {
+    while (angle < 0) {
+      angle += 2 * Math.PI;
+    }
+    while (angle > 2 * Math.PI) {
+      angle -= 2 * Math.PI;
+    }
+    return angle;
+  }
+  angle = adjust(angle);
+  startAngle = adjust(startAngle);
+  endAngle = adjust(endAngle);
+  if (startAngle > endAngle) {
+    endAngle += 2 * Math.PI;
+    if (angle < startAngle) {
+      angle += 2 * Math.PI;
+    }
+  }
+  return angle >= startAngle && angle <= endAngle;
+}
+
+function calRotateTranslate(x, y, h) {
+  var xv = x;
+  var yv = h - y;
+  var transX = xv + (h - yv - xv) / Math.sqrt(2);
+  transX *= -1;
+  var transY = (h - yv) * (Math.sqrt(2) - 1) - (h - yv - xv) / Math.sqrt(2);
+  return {
+    transX: transX,
+    transY: transY
+  };
+}
+
+function createCurveControlPoints(points, i) {
+
+  function isNotMiddlePoint(points, i) {
+    if (points[i - 1] && points[i + 1]) {
+      return points[i].y >= Math.max(points[i - 1].y, points[i + 1].y) || points[i].y <= Math.min(points[i - 1].y,points[i + 1].y);
+    } else {
+      return false;
+    }
+  }
+	function isNotMiddlePointX(points, i) {
+	  if (points[i - 1] && points[i + 1]) {
+	    return points[i].x >= Math.max(points[i - 1].x, points[i + 1].x) || points[i].x <= Math.min(points[i - 1].x,points[i + 1].x);
+	  } else {
+	    return false;
+	  }
+	}
+  var a = 0.2;
+  var b = 0.2;
+  var pAx = null;
+  var pAy = null;
+  var pBx = null;
+  var pBy = null;
+  if (i < 1) {
+    pAx = points[0].x + (points[1].x - points[0].x) * a;
+    pAy = points[0].y + (points[1].y - points[0].y) * a;
+  } else {
+    pAx = points[i].x + (points[i + 1].x - points[i - 1].x) * a;
+    pAy = points[i].y + (points[i + 1].y - points[i - 1].y) * a;
+  }
+
+  if (i > points.length - 3) {
+    var last = points.length - 1;
+    pBx = points[last].x - (points[last].x - points[last - 1].x) * b;
+    pBy = points[last].y - (points[last].y - points[last - 1].y) * b;
+  } else {
+    pBx = points[i + 1].x - (points[i + 2].x - points[i].x) * b;
+    pBy = points[i + 1].y - (points[i + 2].y - points[i].y) * b;
+  }
+  if (isNotMiddlePoint(points, i + 1)) {
+    pBy = points[i + 1].y;
+  }
+  if (isNotMiddlePoint(points, i)) {
+    pAy = points[i].y;
+  }
+	if (isNotMiddlePointX(points, i + 1)) {
+	  pBx = points[i + 1].x;
+	}
+	if (isNotMiddlePointX(points, i)) {
+	  pAx = points[i].x;
+	}
+	if (pAy >= Math.max(points[i].y, points[i + 1].y) || pAy <= Math.min(points[i].y, points[i + 1].y)) {
+	pAy = points[i].y;
+	}
+	if (pBy >= Math.max(points[i].y, points[i + 1].y) || pBy <= Math.min(points[i].y, points[i + 1].y)) {
+	pBy = points[i + 1].y;
+	}
+	if (pAx >= Math.max(points[i].x, points[i + 1].x) || pAx <= Math.min(points[i].x, points[i + 1].x)) {
+	pAx = points[i].x;
+	}
+	if (pBx >= Math.max(points[i].x, points[i + 1].x) || pBx <= Math.min(points[i].x, points[i + 1].x)) {
+	pBx = points[i + 1].x;
+	}
+  return {
+    ctrA: {
+      x: pAx,
+      y: pAy
+    },
+    ctrB: {
+      x: pBx,
+      y: pBy
+    }
+  };
+}
+
+function convertCoordinateOrigin(x, y, center) {
+  return {
+    x: center.x + x,
+    y: center.y - y
+  };
+}
+
+function avoidCollision(obj, target) {
+  if (target) {
+    // is collision test
+    while (util.isCollision(obj, target)) {
+      if (obj.start.x > 0) {
+        obj.start.y--;
+      } else if (obj.start.x < 0) {
+        obj.start.y++;
+      } else {
+        if (obj.start.y > 0) {
+          obj.start.y++;
+        } else {
+          obj.start.y--;
+        }
+      }
+    }
+  }
+  return obj;
+}
+
+function fillSeries(series, opts, config) {
+  var index = 0;
+  return series.map(function(item) {
+    if (!item.color) {
+      item.color = config.colors[index];
+      index = (index + 1) % config.colors.length;
+    }
+    if (!item.index) {
+      item.index = 0;
+    }
+    if (!item.type) {
+      item.type = opts.type;
+    }
+    if (typeof item.show == "undefined") {
+      item.show = true;
+    }
+    if (!item.type) {
+      item.type = opts.type;
+    }
+    if (!item.pointShape) {
+      item.pointShape = "circle";
+    }
+    if (!item.legendShape) {
+      switch (item.type) {
+        case 'line':
+          item.legendShape = "line";
+          break;
+        case 'column':
+          item.legendShape = "rect";
+          break;
+        case 'area':
+          item.legendShape = "triangle";
+          break;
+        default:
+          item.legendShape = "circle";
+      }
+    }
+    return item;
+  });
+}
+
+function getDataRange(minData, maxData) {
+  var limit = 0;
+  var range = maxData - minData;
+  if (range >= 10000) {
+    limit = 1000;
+  } else if (range >= 1000) {
+    limit = 100;
+  } else if (range >= 100) {
+    limit = 10;
+  } else if (range >= 10) {
+    limit = 5;
+  } else if (range >= 1) {
+    limit = 1;
+  } else if (range >= 0.1) {
+    limit = 0.1;
+  } else if (range >= 0.01) {
+    limit = 0.01;
+  } else if (range >= 0.001) {
+    limit = 0.001;
+  } else if (range >= 0.0001) {
+    limit = 0.0001;
+  } else if (range >= 0.00001) {
+    limit = 0.00001;
+  } else {
+    limit = 0.000001;
+  }
+  return {
+    minRange: findRange(minData, 'lower', limit),
+    maxRange: findRange(maxData, 'upper', limit)
+  };
+}
+
+function measureText(text) {
+  var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config.fontSize;
+  text = String(text);
+  var text = text.split('');
+  var width = 0;
+  for (let i = 0; i < text.length; i++) {
+    let item = text[i];
+    if (/[a-zA-Z]/.test(item)) {
+      width += 7;
+    } else if (/[0-9]/.test(item)) {
+      width += 5.5;
+    } else if (/\./.test(item)) {
+      width += 2.7;
+    } else if (/-/.test(item)) {
+      width += 3.25;
+    } else if (/[\u4e00-\u9fa5]/.test(item)) {
+      width += 10;
+    } else if (/\(|\)/.test(item)) {
+      width += 3.73;
+    } else if (/\s/.test(item)) {
+      width += 2.5;
+    } else if (/%/.test(item)) {
+      width += 8;
+    } else {
+      width += 10;
+    }
+  }
+  return width * fontSize / 10;
+}
+
+function dataCombine(series) {
+  return series.reduce(function(a, b) {
+    return (a.data ? a.data : a).concat(b.data);
+  }, []);
+}
+
+function dataCombineStack(series, len) {
+  var sum = new Array(len);
+  for (var j = 0; j < sum.length; j++) {
+    sum[j] = 0;
+  }
+  for (var i = 0; i < series.length; i++) {
+    for (var j = 0; j < sum.length; j++) {
+      sum[j] += series[i].data[j];
+    }
+  }
+  return series.reduce(function(a, b) {
+    return (a.data ? a.data : a).concat(b.data).concat(sum);
+  }, []);
+}
+
+function getTouches(touches, opts, e) {
+  let x, y;
+  if (touches.clientX) {
+    if (opts.rotate) {
+      y = opts.height - touches.clientX * opts.pixelRatio;
+      x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) *
+        opts.pixelRatio;
+    } else {
+      x = touches.clientX * opts.pixelRatio;
+      y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) *
+        opts.pixelRatio;
+    }
+  } else {
+    if (opts.rotate) {
+      y = opts.height - touches.x * opts.pixelRatio;
+      x = touches.y * opts.pixelRatio;
+    } else {
+      x = touches.x * opts.pixelRatio;
+      y = touches.y * opts.pixelRatio;
+    }
+  }
+  return {
+    x: x,
+    y: y
+  }
+}
+
+function getSeriesDataItem(series, index) {
+  var data = [];
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    if (item.data[index] !== null && typeof item.data[index] !== 'undefined' && item.show) {
+      let seriesItem = {};
+      seriesItem.color = item.color;
+      seriesItem.type = item.type;
+      seriesItem.style = item.style;
+      seriesItem.pointShape = item.pointShape;
+      seriesItem.disableLegend = item.disableLegend;
+      seriesItem.name = item.name;
+      seriesItem.show = item.show;
+      seriesItem.data = item.format ? item.format(item.data[index]) : item.data[index];
+      data.push(seriesItem);
+    }
+  }
+  return data;
+}
+
+function getMaxTextListLength(list) {
+  var lengthList = list.map(function(item) {
+    return measureText(item);
+  });
+  return Math.max.apply(null, lengthList);
+}
+
+function getRadarCoordinateSeries(length) {
+  var eachAngle = 2 * Math.PI / length;
+  var CoordinateSeries = [];
+  for (var i = 0; i < length; i++) {
+    CoordinateSeries.push(eachAngle * i);
+  }
+
+  return CoordinateSeries.map(function(item) {
+    return -1 * item + Math.PI / 2;
+  });
+}
+
+function getToolTipData(seriesData, calPoints, index, categories) {
+  var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
+
+  var textList = seriesData.map(function(item) {
+		let titleText=[];
+		if(categories){
+			titleText=categories;
+		}else{
+			titleText=item.data;
+		}
+    return {
+      text: option.format ? option.format(item, titleText[index]) : item.name + ': ' + item.data,
+      color: item.color
+    };
+  });
+  var validCalPoints = [];
+  var offset = {
+    x: 0,
+    y: 0
+  };
+  for (let i = 0; i < calPoints.length; i++) {
+    let points = calPoints[i];
+    if (typeof points[index] !== 'undefined' && points[index] !== null) {
+      validCalPoints.push(points[index]);
+    }
+  }
+  for (let i = 0; i < validCalPoints.length; i++) {
+    let item = validCalPoints[i];
+    offset.x = Math.round(item.x);
+    offset.y += item.y;
+  }
+  offset.y /= validCalPoints.length;
+  return {
+    textList: textList,
+    offset: offset
+  };
+}
+
+function getMixToolTipData(seriesData, calPoints, index, categories) {
+  var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
+  var textList = seriesData.map(function(item) {
+    return {
+      text: option.format ? option.format(item, categories[index]) : item.name + ': ' + item.data,
+      color: item.color,
+      disableLegend: item.disableLegend ? true : false
+    };
+  });
+  textList = textList.filter(function(item) {
+    if (item.disableLegend !== true) {
+      return item;
+    }
+  });
+  var validCalPoints = [];
+  var offset = {
+    x: 0,
+    y: 0
+  };
+  for (let i = 0; i < calPoints.length; i++) {
+    let points = calPoints[i];
+    if (typeof points[index] !== 'undefined' && points[index] !== null) {
+      validCalPoints.push(points[index]);
+    }
+  }
+  for (let i = 0; i < validCalPoints.length; i++) {
+    let item = validCalPoints[i];
+    offset.x = Math.round(item.x);
+    offset.y += item.y;
+  }
+  offset.y /= validCalPoints.length;
+  return {
+    textList: textList,
+    offset: offset
+  };
+}
+
+function getCandleToolTipData(series, seriesData, calPoints, index, categories, extra) {
+  var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
+  let upColor = extra.color.upFill;
+  let downColor = extra.color.downFill;
+  //颜色顺序为开盘,收盘,最低,最高
+  let color = [upColor, upColor, downColor, upColor];
+  var textList = [];
+  let text0 = {
+    text: categories[index],
+    color: null
+  };
+  textList.push(text0);
+  seriesData.map(function(item) {
+    if (index == 0 && item.data[1] - item.data[0] < 0) {
+      color[1] = downColor;
+    } else {
+      if (item.data[0] < series[index - 1][1]) {
+        color[0] = downColor;
+      }
+      if (item.data[1] < item.data[0]) {
+        color[1] = downColor;
+      }
+      if (item.data[2] > series[index - 1][1]) {
+        color[2] = upColor;
+      }
+      if (item.data[3] < series[index - 1][1]) {
+        color[3] = downColor;
+      }
+    }
+    let text1 = {
+      text: '开盘:' + item.data[0],
+      color: color[0]
+    };
+    let text2 = {
+      text: '收盘:' + item.data[1],
+      color: color[1]
+    };
+    let text3 = {
+      text: '最低:' + item.data[2],
+      color: color[2]
+    };
+    let text4 = {
+      text: '最高:' + item.data[3],
+      color: color[3]
+    };
+    textList.push(text1, text2, text3, text4);
+  });
+  var validCalPoints = [];
+  var offset = {
+    x: 0,
+    y: 0
+  };
+  for (let i = 0; i < calPoints.length; i++) {
+    let points = calPoints[i];
+    if (typeof points[index] !== 'undefined' && points[index] !== null) {
+      validCalPoints.push(points[index]);
+    }
+  }
+  offset.x = Math.round(validCalPoints[0][0].x);
+  return {
+    textList: textList,
+    offset: offset
+  };
+}
+
+function filterSeries(series) {
+  let tempSeries = [];
+  for (let i = 0; i < series.length; i++) {
+    if (series[i].show == true) {
+      tempSeries.push(series[i])
+    }
+  }
+  return tempSeries;
+}
+
+function findCurrentIndex(currentPoints, calPoints, opts, config) {
+  var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
+  var currentIndex = -1;
+  var spacing = opts.chartData.eachSpacing/2;
+	let xAxisPoints=[];
+	if(calPoints.length>0){
+		if(opts.type=='candle'){
+			for(let i=0;i<calPoints[0].length;i++){
+				xAxisPoints.push(calPoints[0][i][0].x)
+			}
+		}else{
+			for(let i=0;i<calPoints[0].length;i++){
+				xAxisPoints.push(calPoints[0][i].x)
+			}
+		}
+		if((opts.type=='line' || opts.type=='area') && opts.xAxis.boundaryGap=='justify'){
+		  spacing = opts.chartData.eachSpacing/2;
+		}
+		if(!opts.categories){
+			spacing=0
+		}
+		if (isInExactChartArea(currentPoints, opts, config)) {
+		  xAxisPoints.forEach(function(item, index) {
+		    if (currentPoints.x + offset + spacing > item) {
+		      currentIndex = index;
+		    }
+		  });
+		}
+	}
+  return currentIndex;
+}
+
+function findLegendIndex(currentPoints, legendData, opts) {
+  let currentIndex = -1;
+  if (isInExactLegendArea(currentPoints, legendData.area)) {
+    let points = legendData.points;
+    let index = -1;
+    for (let i = 0, len = points.length; i < len; i++) {
+      let item = points[i];
+      for (let j = 0; j < item.length; j++) {
+        index += 1;
+        let area = item[j]['area'];
+        if (currentPoints.x > area[0] && currentPoints.x < area[2] && currentPoints.y > area[1] && currentPoints.y < area[3]) {
+          currentIndex = index;
+          break;
+        }
+      }
+    }
+    return currentIndex;
+  }
+  return currentIndex;
+}
+
+function isInExactLegendArea(currentPoints, area) {
+  return currentPoints.x > area.start.x && currentPoints.x < area.end.x && currentPoints.y > area.start.y &&
+    currentPoints.y < area.end.y;
+}
+
+function isInExactChartArea(currentPoints, opts, config) {
+  return currentPoints.x <= opts.width - opts.area[1] + 10 && currentPoints.x >= opts.area[3] -10 && currentPoints.y >= opts.area[0] && currentPoints.y <= opts.height - opts.area[2];
+}
+
+function findRadarChartCurrentIndex(currentPoints, radarData, count) {
+  var eachAngleArea = 2 * Math.PI / count;
+  var currentIndex = -1;
+  if (isInExactPieChartArea(currentPoints, radarData.center, radarData.radius)) {
+    var fixAngle = function fixAngle(angle) {
+      if (angle < 0) {
+        angle += 2 * Math.PI;
+      }
+      if (angle > 2 * Math.PI) {
+        angle -= 2 * Math.PI;
+      }
+      return angle;
+    };
+
+    var angle = Math.atan2(radarData.center.y - currentPoints.y, currentPoints.x - radarData.center.x);
+    angle = -1 * angle;
+    if (angle < 0) {
+      angle += 2 * Math.PI;
+    }
+
+    var angleList = radarData.angleList.map(function(item) {
+      item = fixAngle(-1 * item);
+
+      return item;
+    });
+
+    angleList.forEach(function(item, index) {
+      var rangeStart = fixAngle(item - eachAngleArea / 2);
+      var rangeEnd = fixAngle(item + eachAngleArea / 2);
+      if (rangeEnd < rangeStart) {
+        rangeEnd += 2 * Math.PI;
+      }
+      if (angle >= rangeStart && angle <= rangeEnd || angle + 2 * Math.PI >= rangeStart && angle + 2 * Math.PI <=
+        rangeEnd) {
+        currentIndex = index;
+      }
+    });
+  }
+
+  return currentIndex;
+}
+
+function findFunnelChartCurrentIndex(currentPoints, funnelData) {
+  var currentIndex = -1;
+  for (var i = 0, len = funnelData.series.length; i < len; i++) {
+    var item = funnelData.series[i];
+    if (currentPoints.x > item.funnelArea[0] && currentPoints.x < item.funnelArea[2] && currentPoints.y > item.funnelArea[1] && currentPoints.y < item.funnelArea[3]) {
+      currentIndex = i;
+      break;
+    }
+  }
+  return currentIndex;
+}
+
+function findWordChartCurrentIndex(currentPoints, wordData) {
+  var currentIndex = -1;
+  for (var i = 0, len = wordData.length; i < len; i++) {
+    var item = wordData[i];
+    if (currentPoints.x > item.area[0] && currentPoints.x < item.area[2] && currentPoints.y > item.area[1] && currentPoints.y < item.area[3]) {
+      currentIndex = i;
+      break;
+    }
+  }
+  return currentIndex;
+}
+
+function findMapChartCurrentIndex(currentPoints, opts) {
+  var currentIndex = -1;
+  var cData=opts.chartData.mapData;
+  var data=opts.series;
+  var tmp=pointToCoordinate(currentPoints.y, currentPoints.x,cData.bounds,cData.scale,cData.xoffset,cData.yoffset);
+  var poi=[tmp.x, tmp.y];
+  for (var i = 0, len = data.length; i < len; i++) {
+    var item = data[i].geometry.coordinates;
+    if(isPoiWithinPoly(poi,item)){
+      currentIndex = i;
+      break;
+    }
+  }
+  return currentIndex;
+}
+
+function findPieChartCurrentIndex(currentPoints, pieData) {
+  var currentIndex = -1;
+  if (isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) {
+    var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x);
+    angle = -angle;
+    for (var i = 0, len = pieData.series.length; i < len; i++) {
+      var item = pieData.series[i];
+      if (isInAngleRange(angle, item._start_, item._start_ + item._proportion_ * 2 * Math.PI)) {
+        currentIndex = i;
+        break;
+      }
+    }
+  }
+
+  return currentIndex;
+}
+
+function isInExactPieChartArea(currentPoints, center, radius) {
+  return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2);
+}
+
+function splitPoints(points) {
+  var newPoints = [];
+  var items = [];
+  points.forEach(function(item, index) {
+    if (item !== null) {
+      items.push(item);
+    } else {
+      if (items.length) {
+        newPoints.push(items);
+      }
+      items = [];
+    }
+  });
+  if (items.length) {
+    newPoints.push(items);
+  }
+
+  return newPoints;
+}
+
+function calLegendData(series, opts, config, chartData) {
+  let legendData = {
+    area: {
+      start: {
+        x: 0,
+        y: 0
+      },
+      end: {
+        x: 0,
+        y: 0
+      },
+      width: 0,
+      height: 0,
+      wholeWidth: 0,
+      wholeHeight: 0
+    },
+    points: [],
+    widthArr: [],
+    heightArr: []
+  };
+  if (opts.legend.show === false) {
+    chartData.legendData = legendData;
+    return legendData;
+  }
+
+  let padding = opts.legend.padding;
+  let margin = opts.legend.margin;
+  let fontSize = opts.legend.fontSize;
+  let shapeWidth = 15 * opts.pixelRatio;
+  let shapeRight = 5 * opts.pixelRatio;
+  let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize);
+  if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+    let legendList = [];
+    let widthCount = 0;
+    let widthCountArr = [];
+    let currentRow = [];
+    for (let i = 0; i < series.length; i++) {
+      let item = series[i];
+      let itemWidth = shapeWidth + shapeRight + measureText(item.name || 'undefined', fontSize) + opts.legend.itemGap;
+      if (widthCount + itemWidth > opts.width - opts.padding[1] - opts.padding[3]) {
+        legendList.push(currentRow);
+        widthCountArr.push(widthCount - opts.legend.itemGap);
+        widthCount = itemWidth;
+        currentRow = [item];
+      } else {
+        widthCount += itemWidth;
+        currentRow.push(item);
+      }
+    }
+    if (currentRow.length) {
+      legendList.push(currentRow);
+      widthCountArr.push(widthCount - opts.legend.itemGap);
+      legendData.widthArr = widthCountArr;
+      let legendWidth = Math.max.apply(null, widthCountArr);
+      switch (opts.legend.float) {
+        case 'left':
+          legendData.area.start.x = opts.padding[3];
+          legendData.area.end.x = opts.padding[3] + 2 * padding;
+          break;
+        case 'right':
+          legendData.area.start.x = opts.width - opts.padding[1] - legendWidth - 2 * padding;
+          legendData.area.end.x = opts.width - opts.padding[1];
+          break;
+        default:
+          legendData.area.start.x = (opts.width - legendWidth) / 2 - padding;
+          legendData.area.end.x = (opts.width + legendWidth) / 2 + padding;
+      }
+      legendData.area.width = legendWidth + 2 * padding;
+      legendData.area.wholeWidth = legendWidth + 2 * padding;
+      legendData.area.height = legendList.length * lineHeight + 2 * padding;
+      legendData.area.wholeHeight = legendList.length * lineHeight + 2 * padding + 2 * margin;
+      legendData.points = legendList;
+    }
+  } else {
+    let len = series.length;
+    let maxHeight = opts.height - opts.padding[0] - opts.padding[2] - 2 * margin - 2 * padding;
+    let maxLength = Math.min(Math.floor(maxHeight / lineHeight), len);
+    legendData.area.height = maxLength * lineHeight + padding * 2;
+    legendData.area.wholeHeight = maxLength * lineHeight + padding * 2;
+    switch (opts.legend.float) {
+      case 'top':
+        legendData.area.start.y = opts.padding[0] + margin;
+        legendData.area.end.y = opts.padding[0] + margin + legendData.area.height;
+        break;
+      case 'bottom':
+        legendData.area.start.y = opts.height - opts.padding[2] - margin - legendData.area.height;
+        legendData.area.end.y = opts.height - opts.padding[2] - margin;
+        break;
+      default:
+        legendData.area.start.y = (opts.height - legendData.area.height) / 2;
+        legendData.area.end.y = (opts.height + legendData.area.height) / 2;
+    }
+    let lineNum = len % maxLength === 0 ? len / maxLength : Math.floor((len / maxLength) + 1);
+    let currentRow = [];
+    for (let i = 0; i < lineNum; i++) {
+      let temp = series.slice(i * maxLength, i * maxLength + maxLength);
+      currentRow.push(temp);
+    }
+
+    legendData.points = currentRow;
+
+    if (currentRow.length) {
+      for (let i = 0; i < currentRow.length; i++) {
+        let item = currentRow[i];
+        let maxWidth = 0;
+        for (let j = 0; j < item.length; j++) {
+          let itemWidth = shapeWidth + shapeRight + measureText(item[j].name || 'undefined', fontSize) + opts.legend.itemGap;
+          if (itemWidth > maxWidth) {
+            maxWidth = itemWidth;
+          }
+        }
+        legendData.widthArr.push(maxWidth);
+        legendData.heightArr.push(item.length * lineHeight + padding * 2);
+      }
+      let legendWidth = 0
+      for (let i = 0; i < legendData.widthArr.length; i++) {
+        legendWidth += legendData.widthArr[i];
+      }
+      legendData.area.width = legendWidth - opts.legend.itemGap + 2 * padding;
+      legendData.area.wholeWidth = legendData.area.width + padding;
+    }
+  }
+
+  switch (opts.legend.position) {
+    case 'top':
+      legendData.area.start.y = opts.padding[0] + margin;
+      legendData.area.end.y = opts.padding[0] + margin + legendData.area.height;
+      break;
+    case 'bottom':
+      legendData.area.start.y = opts.height - opts.padding[2] - legendData.area.height - margin;
+      legendData.area.end.y = opts.height - opts.padding[2] - margin;
+      break;
+    case 'left':
+      legendData.area.start.x = opts.padding[3];
+      legendData.area.end.x = opts.padding[3] + legendData.area.width;
+      break;
+    case 'right':
+      legendData.area.start.x = opts.width - opts.padding[1] - legendData.area.width;
+      legendData.area.end.x = opts.width - opts.padding[1];
+      break;
+  }
+  chartData.legendData = legendData;
+  return legendData;
+}
+
+function calCategoriesData(categories, opts, config, eachSpacing) {
+  var result = {
+    angle: 0,
+    xAxisHeight: config.xAxisHeight
+  };
+  var categoriesTextLenth = categories.map(function(item) {
+    return measureText(item,opts.xAxis.fontSize||config.fontSize);
+  });
+  var maxTextLength = Math.max.apply(this, categoriesTextLenth);
+
+  if (opts.xAxis.rotateLabel == true && maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) {
+    result.angle = 45 * Math.PI / 180;
+    result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle);
+  }
+  return result;
+}
+
+function getXAxisTextList(series, opts, config) {
+  var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1;
+  var data = dataCombine(series);
+  var sorted = [];
+  // remove null from data
+  data = data.filter(function(item) {
+    //return item !== null;
+    if (typeof item === 'object' && item !== null) {
+      if (item.constructor == Array) {
+        return item !== null;
+      } else {
+        return item.value !== null;
+      }
+    } else {
+      return item !== null;
+    }
+  });
+  data.map(function(item) {
+    if (typeof item === 'object') {
+      if (item.constructor == Array) {
+				if(opts.type=='candle'){
+					item.map(function(subitem) {
+					  sorted.push(subitem);
+					})
+				}else{
+					sorted.push(item[0]);
+				}
+      } else {
+        sorted.push(item.value);
+      }
+    } else {
+      sorted.push(item);
+    }
+  })
+	
+  var minData = 0;
+  var maxData = 0;
+  if (sorted.length > 0) {
+    minData = Math.min.apply(this, sorted);
+    maxData = Math.max.apply(this, sorted);
+  }
+  //为了兼容v1.9.0之前的项目
+  if(index>-1){
+    if (typeof opts.xAxis.data[index].min === 'number') {
+      minData = Math.min(opts.xAxis.data[index].min, minData);
+    }
+    if (typeof opts.xAxis.data[index].max === 'number') {
+      maxData = Math.max(opts.xAxis.data[index].max, maxData);
+    }
+  }else{
+    if (typeof opts.xAxis.min === 'number') {
+      minData = Math.min(opts.xAxis.min, minData);
+    }
+    if (typeof opts.xAxis.max === 'number') {
+      maxData = Math.max(opts.xAxis.max, maxData);
+    }
+  }
+  
+
+  if (minData === maxData) {
+    var rangeSpan = maxData || 10;
+    maxData += rangeSpan;
+  }
+
+  //var dataRange = getDataRange(minData, maxData);
+  var minRange = minData;
+  var maxRange = maxData;
+
+  var range = [];
+  var eachRange = (maxRange - minRange) / opts.xAxis.splitNumber;
+
+  for (var i = 0; i <= opts.xAxis.splitNumber; i++) {
+    range.push(minRange + eachRange * i);
+  }
+  return range;
+}
+
+function calXAxisData(series, opts, config){
+    var result = {
+        angle: 0,
+        xAxisHeight: config.xAxisHeight
+    };
+
+    result.ranges = getXAxisTextList(series, opts, config);
+    result.rangesFormat = result.ranges.map(function(item){
+        item = opts.xAxis.format? opts.xAxis.format(item):util.toFixed(item, 2);
+        return item;
+    });
+		
+    var xAxisScaleValues = result.ranges.map(function (item) {
+        // 如果刻度值是浮点数,则保留两位小数
+        item = util.toFixed(item, 2);
+        // 若有自定义格式则调用自定义的格式化函数
+        item = opts.xAxis.format ? opts.xAxis.format(Number(item)) : item;
+        return item;
+    });
+
+    result = Object.assign(result,getXAxisPoints(xAxisScaleValues, opts, config));
+    // 计算X轴刻度的属性譬如每个刻度的间隔,刻度的起始点\结束点以及总长
+    var eachSpacing = result.eachSpacing;
+
+    var textLength = xAxisScaleValues.map(function (item) {
+        return measureText(item);
+    });
+    
+    // get max length of categories text
+    var maxTextLength = Math.max.apply(this, textLength);
+
+    // 如果刻度值文本内容过长,则将其逆时针旋转45°
+    if (maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) {
+        result.angle = 45 * Math.PI / 180;
+        result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle);
+    }
+
+    if (opts.xAxis.disabled === true) {
+        result.xAxisHeight = 0;
+    }
+
+    return result;
+}
+
+function getRadarDataPoints(angleList, center, radius, series, opts) {
+  var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;
+
+  var radarOption = opts.extra.radar || {};
+  radarOption.max = radarOption.max || 0;
+  var maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series)));
+
+  var data = [];
+  for (let i = 0; i < series.length; i++) {
+    let each = series[i];
+    let listItem = {};
+    listItem.color = each.color;
+		listItem.legendShape = each.legendShape;
+		listItem.pointShape = each.pointShape;
+    listItem.data = [];
+    each.data.forEach(function(item, index) {
+      let tmp = {};
+      tmp.angle = angleList[index];
+
+      tmp.proportion = item / maxData;
+      tmp.position = convertCoordinateOrigin(radius * tmp.proportion * process * Math.cos(tmp.angle), radius * tmp.proportion *
+        process * Math.sin(tmp.angle), center);
+      listItem.data.push(tmp);
+    });
+
+    data.push(listItem);
+  }
+
+  return data;
+}
+
+function getPieDataPoints(series, radius) {
+  var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+
+  var count = 0;
+  var _start_ = 0;
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    count += item.data;
+  }
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    if (count === 0) {
+      item._proportion_ = 1 / series.length * process;
+    } else {
+      item._proportion_ = item.data / count * process;
+    }
+    item._radius_ = radius;
+  }
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item._start_ = _start_;
+    _start_ += 2 * item._proportion_ * Math.PI;
+  }
+
+  return series;
+}
+
+function getFunnelDataPoints(series, radius) {
+  var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+  series = series.sort(function(a,b){return parseInt(b.data)-parseInt(a.data);});
+  for (let i = 0; i < series.length; i++) {
+    series[i].radius = series[i].data/series[0].data*radius*process;
+    series[i]._proportion_ = series[i].data/series[0].data;
+  }
+  return series.reverse();
+}
+
+function getRoseDataPoints(series, type, minRadius, radius) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var count = 0;
+  var _start_ = 0;
+
+  var dataArr = [];
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    count += item.data;
+    dataArr.push(item.data);
+  }
+  
+  var minData = Math.min.apply(null, dataArr);
+  var maxData = Math.max.apply(null, dataArr);
+  var radiusLength = radius - minRadius;
+  
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    if (count === 0 || type == 'area') {
+      item._proportion_ = item.data / count * process;
+      item._rose_proportion_ = 1 / series.length * process;
+    } else {
+      item._proportion_ = item.data / count * process;
+      item._rose_proportion_ = item.data / count * process;
+    }
+    item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData));
+  }
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item._start_ = _start_;
+    _start_ += 2 * item._rose_proportion_ * Math.PI;
+  }
+
+  return series;
+}
+
+function getArcbarDataPoints(series, arcbarOption) {
+  var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+  if (process == 1) {
+    process = 0.999999;
+  }
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    let totalAngle;
+    if (arcbarOption.type == 'circle') {
+      totalAngle = 2;
+    } else {
+			if (arcbarOption.endAngle < arcbarOption.startAngle) {
+			  totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle;
+			} else{
+			  totalAngle = arcbarOption.startAngle - arcbarOption.endAngle;
+			}
+    }
+    item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle;
+    if (item._proportion_ >= 2) {
+      item._proportion_ = item._proportion_ % 2;
+    }
+  }
+  return series;
+}
+
+function getGaugeAxisPoints(categories, startAngle, endAngle) {
+  let totalAngle = startAngle - endAngle + 1;
+  let tempStartAngle = startAngle;
+  for (let i = 0; i < categories.length; i++) {
+    categories[i].value = categories[i].value === null ? 0 : categories[i].value;
+    categories[i]._startAngle_ = tempStartAngle;
+    categories[i]._endAngle_ = totalAngle * categories[i].value + startAngle;
+    if (categories[i]._endAngle_ >= 2) {
+      categories[i]._endAngle_ = categories[i]._endAngle_ % 2;
+    }
+    tempStartAngle = categories[i]._endAngle_;
+  }
+  return categories;
+}
+
+function getGaugeDataPoints(series, categories, gaugeOption) {
+  let process = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    item.data = item.data === null ? 0 : item.data;
+    if (gaugeOption.pointer.color == 'auto') {
+      for (let i = 0; i < categories.length; i++) {
+        if (item.data <= categories[i].value) {
+          item.color = categories[i].color;
+          break;
+        }
+      }
+    } else {
+      item.color = gaugeOption.pointer.color;
+    }
+    let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+    item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle;
+    item._oldAngle_ = gaugeOption.oldAngle;
+    if (gaugeOption.oldAngle < gaugeOption.endAngle) {
+      item._oldAngle_ += 2;
+    }
+    if (item.data >= gaugeOption.oldData) {
+      item._proportion_ = (item._endAngle_ - item._oldAngle_) * process + gaugeOption.oldAngle;
+    } else {
+      item._proportion_ = item._oldAngle_ - (item._oldAngle_ - item._endAngle_) * process;
+    }
+    if (item._proportion_ >= 2) {
+      item._proportion_ = item._proportion_ % 2;
+    }
+  }
+  return series;
+}
+
+function getPieTextMaxLength(series) {
+  series = getPieDataPoints(series);
+  let maxLength = 0;
+  for (let i = 0; i < series.length; i++) {
+    let item = series[i];
+    let text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + '%';
+    maxLength = Math.max(maxLength, measureText(text));
+  }
+
+  return maxLength;
+}
+
+function fixColumeData(points, eachSpacing, columnLen, index, config, opts) {
+  return points.map(function(item) {
+    if (item === null) {
+      return null;
+    }
+    item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / columnLen);
+
+    if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+      item.width = Math.min(item.width, +opts.extra.column.width);
+    }
+    if (item.width <= 0) {
+      item.width = 1;
+    }
+    item.x += (index + 0.5 - columnLen / 2) * item.width;
+    return item;
+  });
+}
+
+function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) {
+  return points.map(function(item) {
+    if (item === null) {
+      return null;
+    }
+    item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2);
+
+    if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+      item.width = Math.min(item.width, +opts.extra.column.width);
+    }
+
+    if (index > 0) {
+      item.width -= 2 * border;
+    }
+    return item;
+  });
+}
+
+function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) {
+
+  return points.map(function(item, indexn) {
+
+    if (item === null) {
+      return null;
+    }
+    item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2);
+
+    if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+      item.width = Math.min(item.width, +opts.extra.column.width);
+    }
+    return item;
+  });
+}
+
+function getXAxisPoints(categories, opts, config) {
+  var spacingValid = opts.width - opts.area[1] - opts.area[3];
+  var dataCount = opts.enableScroll ? Math.min(opts.xAxis.itemCount, categories.length) : categories.length;
+  if((opts.type=='line' || opts.type=='area') && dataCount>1 && opts.xAxis.boundaryGap=='justify'){
+    dataCount -=1;
+  }
+  var eachSpacing = spacingValid / dataCount;
+
+  var xAxisPoints = [];
+  var startX = opts.area[3];
+  var endX = opts.width - opts.area[1];
+  categories.forEach(function(item, index) {
+    xAxisPoints.push(startX + index * eachSpacing);
+  });
+  if(opts.xAxis.boundaryGap !=='justify'){
+    if (opts.enableScroll === true) {
+      xAxisPoints.push(startX + categories.length * eachSpacing);
+    } else {
+      xAxisPoints.push(endX);
+    }
+  }
+  return {
+    xAxisPoints: xAxisPoints,
+    startX: startX,
+    endX: endX,
+    eachSpacing: eachSpacing
+  };
+}
+
+function getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) {
+  var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
+  var points = [];
+  var validHeight = opts.height - opts.area[0] - opts.area[2];
+  data.forEach(function(item, index) {
+    if (item === null) {
+      points.push(null);
+    } else {
+      var cPoints = [];
+      item.forEach(function(items, indexs) {
+        var point = {};
+        point.x = xAxisPoints[index] + Math.round(eachSpacing / 2);
+        var value = items.value || items;
+        var height = validHeight * (value - minRange) / (maxRange - minRange);
+        height *= process;
+        point.y = opts.height - Math.round(height) - opts.area[2];
+        cPoints.push(point);
+      });
+      points.push(cPoints);
+    }
+  });
+
+  return points;
+}
+
+function getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) {
+  var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
+  var boundaryGap='center';
+  if (opts.type == 'line'||opts.type == 'area'){
+    boundaryGap=opts.xAxis.boundaryGap;
+  }
+  var points = [];
+  var validHeight = opts.height - opts.area[0] - opts.area[2];
+	var validWidth = opts.width - opts.area[1] - opts.area[3];
+  data.forEach(function(item, index) {
+    if (item === null) {
+      points.push(null);
+    } else {
+      var point = {};
+      point.color = item.color;
+      point.x = xAxisPoints[index];
+      var value = item;
+      if (typeof item === 'object' && item !== null) {
+				if (item.constructor == Array) {
+					let xranges,xminRange,xmaxRange;
+					xranges = [].concat(opts.chartData.xAxisData.ranges);
+					xminRange = xranges.shift();
+					xmaxRange = xranges.pop();
+				  value = item[1];
+					point.x = opts.area[3]+ validWidth * (item[0] - xminRange) / (xmaxRange - xminRange);
+				} else {
+				  value = item.value;
+				}
+      }
+			if(boundaryGap=='center'){
+			  point.x += Math.round(eachSpacing / 2);
+			}
+      var height = validHeight * (value - minRange) / (maxRange - minRange);
+      height *= process;
+      point.y = opts.height - Math.round(height) - opts.area[2];
+      points.push(point);
+    }
+  });
+
+  return points;
+}
+
+function getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) {
+  var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1;
+  var points = [];
+  var validHeight = opts.height - opts.area[0] - opts.area[2];
+
+  data.forEach(function(item, index) {
+    if (item === null) {
+      points.push(null);
+    } else {
+      var point = {};
+      point.color = item.color;
+      point.x = xAxisPoints[index] + Math.round(eachSpacing / 2);
+
+      if (seriesIndex > 0) {
+        var value = 0;
+        for (let i = 0; i <= seriesIndex; i++) {
+          value += stackSeries[i].data[index];
+        }
+        var value0 = value - item;
+        var height = validHeight * (value - minRange) / (maxRange - minRange);
+        var height0 = validHeight * (value0 - minRange) / (maxRange - minRange);
+      } else {
+        var value = item;
+        var height = validHeight * (value - minRange) / (maxRange - minRange);
+        var height0 = 0;
+      }
+      var heightc = height0;
+      height *= process;
+      heightc *= process;
+      point.y = opts.height - Math.round(height) - opts.area[2];
+      point.y0 = opts.height - Math.round(heightc) - opts.area[2];
+      points.push(point);
+    }
+  });
+
+  return points;
+}
+
+function getYAxisTextList(series, opts, config, stack) {
+  var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1;
+  var data;
+  if (stack == 'stack') {
+    data = dataCombineStack(series, opts.categories.length);
+  } else {
+    data = dataCombine(series);
+  }
+  var sorted = [];
+  // remove null from data
+  data = data.filter(function(item) {
+    //return item !== null;
+    if (typeof item === 'object' && item !== null) {
+      if (item.constructor == Array) {
+        return item !== null;
+      } else {
+        return item.value !== null;
+      }
+    } else {
+      return item !== null;
+    }
+  });
+  data.map(function(item) {
+    if (typeof item === 'object') {
+      if (item.constructor == Array) {
+				if(opts.type=='candle'){
+					item.map(function(subitem) {
+					  sorted.push(subitem);
+					})
+				}else{
+					sorted.push(item[1]);
+				}
+      } else {
+        sorted.push(item.value);
+      }
+    } else {
+      sorted.push(item);
+    }
+  })
+	
+  var minData = 0;
+  var maxData = 0;
+  if (sorted.length > 0) {
+    minData = Math.min.apply(this, sorted);
+    maxData = Math.max.apply(this, sorted);
+  }
+  //为了兼容v1.9.0之前的项目
+  if(index>-1){
+    if (typeof opts.yAxis.data[index].min === 'number') {
+      minData = Math.min(opts.yAxis.data[index].min, minData);
+    }
+    if (typeof opts.yAxis.data[index].max === 'number') {
+      maxData = Math.max(opts.yAxis.data[index].max, maxData);
+    }
+  }else{
+    if (typeof opts.yAxis.min === 'number') {
+      minData = Math.min(opts.yAxis.min, minData);
+    }
+    if (typeof opts.yAxis.max === 'number') {
+      maxData = Math.max(opts.yAxis.max, maxData);
+    }
+  }
+  
+
+  if (minData === maxData) {
+    var rangeSpan = maxData || 10;
+    maxData += rangeSpan;
+  }
+
+  var dataRange = getDataRange(minData, maxData);
+  var minRange = dataRange.minRange;
+  var maxRange = dataRange.maxRange;
+
+  var range = [];
+  var eachRange = (maxRange - minRange) / opts.yAxis.splitNumber;
+
+  for (var i = 0; i <= opts.yAxis.splitNumber; i++) {
+    range.push(minRange + eachRange * i);
+  }
+  return range.reverse();
+}
+
+function calYAxisData(series, opts, config) {
+  //堆叠图重算Y轴
+  var columnstyle = assign({}, {
+    type: ""
+  }, opts.extra.column);
+  //如果是多Y轴,重新计算
+  var YLength = opts.yAxis.data.length;
+  var newSeries=new Array(YLength);
+  if(YLength>0){
+    for(let i=0;i<YLength;i++){
+      newSeries[i]=[];
+      for(let j=0;j<series.length;j++){
+        if(series[j].index == i){
+          newSeries[i].push(series[j]);
+        }
+      }
+    }
+    var rangesArr =new Array(YLength);
+    var rangesFormatArr = new Array(YLength);
+    var yAxisWidthArr =new Array(YLength);
+		
+    for(let i=0;i<YLength;i++){
+      let yData = opts.yAxis.data[i];
+			//如果总开关不显示,强制每个Y轴为不显示
+			if(opts.yAxis.disabled == true){
+				yData.disabled = true;
+			}
+			rangesArr[i]=getYAxisTextList(newSeries[i], opts, config, columnstyle.type,i);
+			let yAxisFontSizes = yData.fontSize || config.fontSize;
+			yAxisWidthArr[i] = {position:yData.position?yData.position:'left',width:0};
+			rangesFormatArr[i]= rangesArr[i].map(function(items) {
+				items = util.toFixed(items, 6);
+				items = yData.format ? yData.format(Number(items)) : items;
+				yAxisWidthArr[i].width = Math.max(yAxisWidthArr[i].width, measureText(items, yAxisFontSizes) + 5);
+				return items;
+			});
+			let calibration= yData.calibration? 4*opts.pixelRatio : 0 ;
+			yAxisWidthArr[i].width += calibration +3*opts.pixelRatio;
+      if (yData.disabled === true) {
+        yAxisWidthArr[i].width=0;
+      }
+    }
+    
+  }else{
+    var rangesArr =new Array(1);
+    var rangesFormatArr = new Array(1);
+    var yAxisWidthArr =new Array(1);
+		rangesArr[0] = getYAxisTextList(series, opts, config, columnstyle.type);
+		yAxisWidthArr[0] = {position:'left',width:0};
+		var yAxisFontSize = opts.yAxis.fontSize || config.fontSize;
+		rangesFormatArr[0] = rangesArr[0].map(function(item) {
+			item = util.toFixed(item, 6);
+			item = opts.yAxis.format ? opts.yAxis.format(Number(item)) : item;
+			yAxisWidthArr[0].width = Math.max(yAxisWidthArr[0].width, measureText(item, yAxisFontSize) + 5);
+			return item;
+		});
+		yAxisWidthArr[0].width += 3*opts.pixelRatio;
+		if (opts.yAxis.disabled === true) {
+		  yAxisWidthArr[0] = {position:'left',width:0};
+		  opts.yAxis.data[0]={disabled:true};
+		}else{
+			opts.yAxis.data[0]={disabled:false,position:'left',max:opts.yAxis.max,min:opts.yAxis.min,format:opts.yAxis.format};
+		}
+    
+  }
+
+  return {
+    rangesFormat: rangesFormatArr,
+    ranges: rangesArr,
+    yAxisWidth: yAxisWidthArr
+  };
+  
+}
+
+function calTooltipYAxisData(point, series, opts, config, eachSpacing) {
+  let ranges = [].concat(opts.chartData.yAxisData.ranges);
+  let spacingValid = opts.height - opts.area[0] - opts.area[2];
+  let minAxis = opts.area[0];
+  let items=[];
+  for(let i=0;i<ranges.length;i++){
+    let maxVal = ranges[i].shift();
+    let minVal = ranges[i].pop();
+    let item = maxVal - (maxVal - minVal) * (point - minAxis) / spacingValid;
+    item = opts.yAxis.data[i].format ? opts.yAxis.data[i].format(Number(item)) : item.toFixed(0);
+    items.push(String(item))
+  }
+  return items;
+}
+
+function calMarkLineData(points, opts) {
+  let minRange, maxRange;
+  let spacingValid = opts.height - opts.area[0] - opts.area[2];
+  for (let i = 0; i < points.length; i++) {
+    points[i].yAxisIndex = points[i].yAxisIndex ? points[i].yAxisIndex:0;
+    let range = [].concat(opts.chartData.yAxisData.ranges[points[i].yAxisIndex]);
+    minRange = range.pop();
+    maxRange = range.shift();
+    let height = spacingValid * (points[i].value - minRange) / (maxRange - minRange);
+    points[i].y = opts.height - Math.round(height) - opts.area[2];
+  }
+  return points;
+}
+
+function contextRotate(context, opts) {
+  if (opts.rotateLock !== true) {
+    context.translate(opts.height, 0);
+    context.rotate(90 * Math.PI / 180);
+  } else if (opts._rotate_ !== true) {
+    context.translate(opts.height, 0);
+    context.rotate(90 * Math.PI / 180);
+    opts._rotate_ = true;
+  }
+}
+
+function drawPointShape(points, color, shape, context, opts) {
+  context.beginPath();
+	if(opts.dataPointShapeType == 'hollow'){
+		context.setStrokeStyle(color);
+		context.setFillStyle(opts.background);
+		context.setLineWidth(2 * opts.pixelRatio);
+	}else{
+		context.setStrokeStyle("#ffffff");
+		context.setFillStyle(color);
+		context.setLineWidth(1 * opts.pixelRatio);
+	}
+  if (shape === 'diamond') {
+    points.forEach(function(item, index) {
+      if (item !== null) {
+        context.moveTo(item.x, item.y - 4.5);
+        context.lineTo(item.x - 4.5, item.y);
+        context.lineTo(item.x, item.y + 4.5);
+        context.lineTo(item.x + 4.5, item.y);
+        context.lineTo(item.x, item.y - 4.5);
+      }
+    });
+  } else if (shape === 'circle') {
+    points.forEach(function(item, index) {
+      if (item !== null) {
+        context.moveTo(item.x + 2.5 * opts.pixelRatio, item.y);
+        context.arc(item.x, item.y, 3 * opts.pixelRatio, 0, 2 * Math.PI, false);
+      }
+    });
+  } else if (shape === 'rect') {
+    points.forEach(function(item, index) {
+      if (item !== null) {
+        context.moveTo(item.x - 3.5, item.y - 3.5);
+        context.rect(item.x - 3.5, item.y - 3.5, 7, 7);
+      }
+    });
+  } else if (shape === 'triangle') {
+    points.forEach(function(item, index) {
+      if (item !== null) {
+        context.moveTo(item.x, item.y - 4.5);
+        context.lineTo(item.x - 4.5, item.y + 4.5);
+        context.lineTo(item.x + 4.5, item.y + 4.5);
+        context.lineTo(item.x, item.y - 4.5);
+      }
+    });
+  }
+  context.closePath();
+  context.fill();
+  context.stroke();
+}
+
+function drawRingTitle(opts, config, context, center) {
+  var titlefontSize = opts.title.fontSize || config.titleFontSize;
+  var subtitlefontSize = opts.subtitle.fontSize || config.subtitleFontSize;
+  var title = opts.title.name || '';
+  var subtitle = opts.subtitle.name || '';
+  var titleFontColor = opts.title.color || config.titleColor;
+  var subtitleFontColor = opts.subtitle.color || config.subtitleColor;
+  var titleHeight = title ? titlefontSize : 0;
+  var subtitleHeight = subtitle ? subtitlefontSize : 0;
+  var margin = 5;
+
+  if (subtitle) {
+    var textWidth = measureText(subtitle, subtitlefontSize);
+    var startX = center.x - textWidth / 2 + (opts.subtitle.offsetX || 0);
+    var startY = center.y + subtitlefontSize / 2 + (opts.subtitle.offsetY || 0);
+    if (title) {
+      startY += (titleHeight + margin) / 2;
+    }
+    context.beginPath();
+    context.setFontSize(subtitlefontSize);
+    context.setFillStyle(subtitleFontColor);
+    context.fillText(subtitle, startX, startY);
+    context.closePath();
+    context.stroke();
+  }
+  if (title) {
+    var _textWidth = measureText(title, titlefontSize);
+    var _startX = center.x - _textWidth / 2 + (opts.title.offsetX || 0);
+    var _startY = center.y + titlefontSize / 2 + (opts.title.offsetY || 0);
+    if (subtitle) {
+      _startY -= (subtitleHeight + margin) / 2;
+    }
+    context.beginPath();
+    context.setFontSize(titlefontSize);
+    context.setFillStyle(titleFontColor);
+    context.fillText(title, _startX, _startY);
+    context.closePath();
+    context.stroke();
+  }
+}
+
+function drawPointText(points, series, config, context) {
+  // 绘制数据文案
+  var data = series.data;
+  points.forEach(function(item, index) {
+    if (item !== null) {
+      //var formatVal = series.format ? series.format(data[index]) : data[index];
+      context.beginPath();
+      context.setFontSize(series.textSize || config.fontSize);
+      context.setFillStyle(series.textColor || '#666666');
+      var value = data[index]
+      if (typeof data[index] === 'object' && data[index] !== null) {
+				if (data[index].constructor == Array) {
+					value = data[index][1];
+				}else{
+					value = data[index].value
+				}
+      }
+      var formatVal = series.format ? series.format(value) : value;
+      context.fillText(String(formatVal), item.x - measureText(formatVal, series.textSize || config.fontSize) / 2, item.y -4);
+      context.closePath();
+      context.stroke();
+    }
+  });
+
+}
+
+function drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context) {
+  radius -= gaugeOption.width / 2 + config.gaugeLabelTextMargin;
+
+  let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+  let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
+  let totalNumber = gaugeOption.endNumber - gaugeOption.startNumber;
+  let splitNumber = totalNumber / gaugeOption.splitLine.splitNumber;
+  let nowAngle = gaugeOption.startAngle;
+  let nowNumber = gaugeOption.startNumber;
+  for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) {
+    var pos = {
+      x: radius * Math.cos(nowAngle * Math.PI),
+      y: radius * Math.sin(nowAngle * Math.PI)
+    };
+    var labelText = gaugeOption.labelFormat ? gaugeOption.labelFormat(nowNumber) : nowNumber;
+    pos.x += centerPosition.x - measureText(labelText) / 2;
+    pos.y += centerPosition.y;
+    var startX = pos.x;
+    var startY = pos.y;
+    context.beginPath();
+    context.setFontSize(config.fontSize);
+    context.setFillStyle(gaugeOption.labelColor || '#666666');
+    context.fillText(labelText, startX, startY + config.fontSize / 2);
+    context.closePath();
+    context.stroke();
+
+    nowAngle += splitAngle;
+    if (nowAngle >= 2) {
+      nowAngle = nowAngle % 2;
+    }
+    nowNumber += splitNumber;
+  }
+
+}
+
+function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) {
+  var radarOption = opts.extra.radar || {};
+  radius += config.radarLabelTextMargin;
+
+  angleList.forEach(function(angle, index) {
+    var pos = {
+      x: radius * Math.cos(angle),
+      y: radius * Math.sin(angle)
+    };
+    var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition);
+    var startX = posRelativeCanvas.x;
+    var startY = posRelativeCanvas.y;
+    if (util.approximatelyEqual(pos.x, 0)) {
+      startX -= measureText(opts.categories[index] || '') / 2;
+    } else if (pos.x < 0) {
+      startX -= measureText(opts.categories[index] || '');
+    }
+    context.beginPath();
+    context.setFontSize(config.fontSize);
+    context.setFillStyle(radarOption.labelColor || '#666666');
+    context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2);
+    context.closePath();
+    context.stroke();
+  });
+
+}
+
+function drawPieText(series, opts, config, context, radius, center) {
+  var lineRadius = config.pieChartLinePadding;
+  var textObjectCollection = [];
+  var lastTextObject = null;
+
+  var seriesConvert = series.map(function(item) {
+    var text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_.toFixed(4) * 100) +'%';
+    if(item._rose_proportion_) item._proportion_=item._rose_proportion_;
+    var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2);
+    var color = item.color;
+    var radius = item._radius_;
+    return {
+      arc: arc,
+      text: text,
+      color: color,
+      radius: radius,
+      textColor: item.textColor,
+      textSize: item.textSize,
+    };
+  });
+  for (let i = 0; i < seriesConvert.length; i++) {
+    let item = seriesConvert[i];
+    // line end
+    let orginX1 = Math.cos(item.arc) * (item.radius + lineRadius);
+    let orginY1 = Math.sin(item.arc) * (item.radius + lineRadius);
+
+    // line start
+    let orginX2 = Math.cos(item.arc) * item.radius;
+    let orginY2 = Math.sin(item.arc) * item.radius;
+
+    // text start
+    let orginX3 = orginX1 >= 0 ? orginX1 + config.pieChartTextPadding : orginX1 - config.pieChartTextPadding;
+    let orginY3 = orginY1;
+    let textWidth = measureText(item.text,item.textSize||config.fontSize);
+    let startY = orginY3;
+
+    if (lastTextObject && util.isSameXCoordinateArea(lastTextObject.start, {
+        x: orginX3
+      })) {
+      if (orginX3 > 0) {
+        startY = Math.min(orginY3, lastTextObject.start.y);
+      } else if (orginX1 < 0) {
+        startY = Math.max(orginY3, lastTextObject.start.y);
+      } else {
+        if (orginY3 > 0) {
+          startY = Math.max(orginY3, lastTextObject.start.y);
+        } else {
+          startY = Math.min(orginY3, lastTextObject.start.y);
+        }
+      }
+    }
+    if (orginX3 < 0) {
+      orginX3 -= textWidth;
+    }
+
+    let textObject = {
+      lineStart: {
+        x: orginX2,
+        y: orginY2
+      },
+      lineEnd: {
+        x: orginX1,
+        y: orginY1
+      },
+      start: {
+        x: orginX3,
+        y: startY
+      },
+      width: textWidth,
+      height: config.fontSize,
+      text: item.text,
+      color: item.color,
+      textColor: item.textColor,
+      textSize: item.textSize
+    };
+    lastTextObject = avoidCollision(textObject, lastTextObject);
+    textObjectCollection.push(lastTextObject);
+  }
+
+  for (let i = 0; i < textObjectCollection.length; i++) {
+    let item = textObjectCollection[i];
+    let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center);
+    let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center);
+    let textPosition = convertCoordinateOrigin(item.start.x, item.start.y, center);
+    context.setLineWidth(1 * opts.pixelRatio);
+    context.setFontSize(config.fontSize);
+    context.beginPath();
+    context.setStrokeStyle(item.color);
+    context.setFillStyle(item.color);
+    context.moveTo(lineStartPoistion.x, lineStartPoistion.y);
+    let curveStartX = item.start.x < 0 ? textPosition.x + item.width : textPosition.x;
+    let textStartX = item.start.x < 0 ? textPosition.x - 5 : textPosition.x + 5;
+    context.quadraticCurveTo(lineEndPoistion.x, lineEndPoistion.y, curveStartX, textPosition.y);
+    context.moveTo(lineStartPoistion.x, lineStartPoistion.y);
+    context.stroke();
+    context.closePath();
+    context.beginPath();
+    context.moveTo(textPosition.x + item.width, textPosition.y);
+    context.arc(curveStartX, textPosition.y, 2, 0, 2 * Math.PI);
+    context.closePath();
+    context.fill();
+    context.beginPath();
+    context.setFontSize(item.textSize || config.fontSize);
+    context.setFillStyle(item.textColor || '#666666');
+    context.fillText(item.text, textStartX, textPosition.y + 3);
+    context.closePath();
+    context.stroke();
+    context.closePath();
+  }
+}
+
+function drawToolTipSplitLine(offsetX, opts, config, context) {
+  var toolTipOption = opts.extra.tooltip || {};
+  toolTipOption.gridType = toolTipOption.gridType == undefined ? 'solid' : toolTipOption.gridType;
+  toolTipOption.dashLength = toolTipOption.dashLength == undefined ? 4 : toolTipOption.dashLength;
+  var startY = opts.area[0];
+  var endY = opts.height - opts.area[2];
+
+  if (toolTipOption.gridType == 'dash') {
+    context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]);
+  }
+  context.setStrokeStyle(toolTipOption.gridColor || '#cccccc');
+  context.setLineWidth(1 * opts.pixelRatio);
+  context.beginPath();
+  context.moveTo(offsetX, startY);
+  context.lineTo(offsetX, endY);
+  context.stroke();
+  context.setLineDash([]);
+
+  if (toolTipOption.xAxisLabel) {
+    let labelText = opts.categories[opts.tooltip.index];
+    context.setFontSize(config.fontSize);
+    let textWidth = measureText(labelText, config.fontSize);
+
+    let textX = offsetX - 0.5 * textWidth;
+    let textY = endY;
+    context.beginPath();
+    context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity));
+    context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground);
+    context.setLineWidth(1 * opts.pixelRatio);
+    context.rect(textX - config.toolTipPadding, textY, textWidth + 2 * config.toolTipPadding, config.fontSize + 2 * config.toolTipPadding);
+    context.closePath();
+    context.stroke();
+    context.fill();
+
+    context.beginPath();
+    context.setFontSize(config.fontSize);
+    context.setFillStyle(toolTipOption.labelFontColor || config.fontColor);
+    context.fillText(String(labelText), textX, textY + config.toolTipPadding + config.fontSize);
+    context.closePath();
+    context.stroke();
+  }
+}
+
+function drawMarkLine(opts, config, context) {
+  let markLineOption = assign({}, {
+    type: 'solid',
+    dashLength: 4,
+    data: []
+  }, opts.extra.markLine);
+  let startX = opts.area[3];
+  let endX = opts.width - opts.area[1];
+  let points = calMarkLineData(markLineOption.data, opts);
+
+  for (let i = 0; i < points.length; i++) {
+    let item = assign({}, {
+      lineColor: '#DE4A42',
+      showLabel: false,
+      labelFontColor: '#666666',
+      labelBgColor: '#DFE8FF',
+      labelBgOpacity: 0.8,
+      yAxisIndex: 0
+    }, points[i]);
+
+    if (markLineOption.type == 'dash') {
+      context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]);
+    }
+    context.setStrokeStyle(item.lineColor);
+    context.setLineWidth(1 * opts.pixelRatio);
+    context.beginPath();
+    context.moveTo(startX, item.y);
+    context.lineTo(endX, item.y);
+    context.stroke();
+    context.setLineDash([]);
+    if (item.showLabel) {
+      let labelText = opts.yAxis.format ? opts.yAxis.format(Number(item.value)) : item.value;
+      context.setFontSize(config.fontSize);
+      let textWidth = measureText(labelText, config.fontSize);
+      let bgStartX = opts.padding[3] + config.yAxisTitleWidth - config.toolTipPadding;
+      let bgEndX = Math.max(opts.area[3], textWidth + config.toolTipPadding * 2);
+      let bgWidth = bgEndX - bgStartX;
+
+      let textX = bgStartX + (bgWidth - textWidth) / 2;
+      let textY = item.y;
+      context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity));
+      context.setStrokeStyle(item.labelBgColor);
+      context.setLineWidth(1 * opts.pixelRatio);
+      context.beginPath();
+      context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding);
+      context.closePath();
+      context.stroke();
+      context.fill();
+
+      context.beginPath();
+      context.setFontSize(config.fontSize);
+      context.setFillStyle(item.labelFontColor);
+      context.fillText(String(labelText), textX, textY + 0.5 * config.fontSize);
+      context.stroke();
+    }
+  }
+}
+
+function drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) {
+  var toolTipOption = assign({}, {
+    gridType: 'solid',
+    dashLength: 4
+  }, opts.extra.tooltip);
+
+  var startX = opts.area[3];
+  var endX = opts.width - opts.area[1];
+
+  if (toolTipOption.gridType == 'dash') {
+    context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]);
+  }
+  context.setStrokeStyle(toolTipOption.gridColor || '#cccccc');
+  context.setLineWidth(1 * opts.pixelRatio);
+  context.beginPath();
+  context.moveTo(startX, opts.tooltip.offset.y);
+  context.lineTo(endX, opts.tooltip.offset.y);
+  context.stroke();
+  context.setLineDash([]);
+
+  if (toolTipOption.yAxisLabel) {
+    let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing);
+    let widthArr = opts.chartData.yAxisData.yAxisWidth;
+    let tStartLeft=opts.area[3];
+    let tStartRight=opts.width-opts.area[1];
+    for(let i=0;i<labelText.length;i++){
+      context.setFontSize(config.fontSize);
+      let textWidth = measureText(labelText[i], config.fontSize);
+      let bgStartX,bgEndX,bgWidth;
+      if(widthArr[i].position == 'left'){
+        bgStartX = tStartLeft - widthArr[i].width;
+        bgEndX = Math.max(bgStartX, bgStartX + textWidth + config.toolTipPadding * 2);
+      }else{
+        bgStartX = tStartRight;
+        bgEndX = Math.max(bgStartX + widthArr[i].width, bgStartX + textWidth + config.toolTipPadding * 2);
+      }
+      bgWidth = bgEndX - bgStartX;
+      
+      let textX = bgStartX + (bgWidth - textWidth) / 2;
+      let textY = opts.tooltip.offset.y;
+      context.beginPath();
+      context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity));
+      context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground);
+      context.setLineWidth(1 * opts.pixelRatio);
+      context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding);
+      context.closePath();
+      context.stroke();
+      context.fill();
+      
+      context.beginPath();
+      context.setFontSize(config.fontSize);
+      context.setFillStyle(toolTipOption.labelFontColor || config.fontColor);
+      context.fillText(labelText[i], textX, textY + 0.5 * config.fontSize);
+      context.closePath();
+      context.stroke();
+      if(widthArr[i].position == 'left'){
+        tStartLeft -=(widthArr[i].width + opts.yAxis.padding);
+      }else{
+        tStartRight +=widthArr[i].width+ opts.yAxis.padding;
+      }
+    }
+  }
+}
+
+function drawToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
+  var toolTipOption = assign({}, {
+    activeBgColor: '#000000',
+    activeBgOpacity: 0.08
+  }, opts.extra.tooltip);
+  var startY = opts.area[0];
+  var endY = opts.height - opts.area[2];
+  context.beginPath();
+  context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity));
+  context.rect(offsetX - eachSpacing / 2, startY, eachSpacing, endY - startY);
+  context.closePath();
+  context.fill();
+}
+
+function drawToolTip(textList, offset, opts, config, context, eachSpacing, xAxisPoints) {
+  var toolTipOption = assign({}, {
+		showBox:true,
+    bgColor: '#000000',
+    bgOpacity: 0.7,
+    fontColor: '#FFFFFF'
+  }, opts.extra.tooltip);
+  var legendWidth = 4 * opts.pixelRatio;
+  var legendMarginRight = 5 * opts.pixelRatio;
+  var arrowWidth = 8 * opts.pixelRatio;
+  var isOverRightBorder = false;
+  if (opts.type == 'line' || opts.type == 'area' || opts.type == 'candle' || opts.type == 'mix') {
+    drawToolTipSplitLine(opts.tooltip.offset.x, opts, config, context);
+  }
+
+  offset = assign({
+    x: 0,
+    y: 0
+  }, offset);
+  offset.y -= 8 * opts.pixelRatio;
+  var textWidth = textList.map(function(item) {
+    return measureText(item.text, config.fontSize);
+  });
+  var toolTipWidth = legendWidth + legendMarginRight + 4 * config.toolTipPadding + Math.max.apply(null, textWidth);
+  var toolTipHeight = 2 * config.toolTipPadding + textList.length * config.toolTipLineHeight;
+
+	if(toolTipOption.showBox == false){ return }
+  // if beyond the right border
+  if (offset.x - Math.abs(opts._scrollDistance_) + arrowWidth + toolTipWidth > opts.width) {
+    isOverRightBorder = true;
+  }
+  if (toolTipHeight + offset.y > opts.height) {
+    offset.y = opts.height - toolTipHeight;
+  }
+  // draw background rect
+  context.beginPath();
+  context.setFillStyle(hexToRgb(toolTipOption.bgColor || config.toolTipBackground, toolTipOption.bgOpacity || config.toolTipOpacity));
+  if (isOverRightBorder) {
+    context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio);
+    context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio);
+    context.lineTo(offset.x - arrowWidth, offset.y);
+    context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y);
+    context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y + toolTipHeight);
+    context.lineTo(offset.x - arrowWidth, offset.y + toolTipHeight);
+    context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio);
+    context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio);
+  } else {
+    context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio);
+    context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio);
+    context.lineTo(offset.x + arrowWidth, offset.y);
+    context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y);
+    context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y + toolTipHeight);
+    context.lineTo(offset.x + arrowWidth, offset.y + toolTipHeight);
+    context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio);
+    context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio);
+  }
+
+  context.closePath();
+  context.fill();
+
+  // draw legend
+  textList.forEach(function(item, index) {
+    if (item.color !== null) {
+      context.beginPath();
+      context.setFillStyle(item.color);
+      var startX = offset.x + arrowWidth + 2 * config.toolTipPadding;
+      var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index +
+        config.toolTipPadding + 1;
+      if (isOverRightBorder) {
+        startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding;
+      }
+      context.fillRect(startX, startY, legendWidth, config.fontSize);
+      context.closePath();
+    }
+  });
+
+  // draw text list
+
+  textList.forEach(function(item, index) {
+    var startX = offset.x + arrowWidth + 2 * config.toolTipPadding + legendWidth + legendMarginRight;
+    if (isOverRightBorder) {
+      startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding + +legendWidth + legendMarginRight;
+    }
+    var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index +
+      config.toolTipPadding;
+    context.beginPath();
+    context.setFontSize(config.fontSize);
+    context.setFillStyle(toolTipOption.fontColor);
+    context.fillText(item.text, startX, startY + config.fontSize);
+    context.closePath();
+    context.stroke();
+  });
+}
+
+function drawYAxisTitle(title, opts, config, context) {
+  var startX = config.xAxisHeight + (opts.height - config.xAxisHeight - measureText(title)) / 2;
+  context.save();
+  context.beginPath();
+  context.setFontSize(config.fontSize);
+  context.setFillStyle(opts.yAxis.titleFontColor || '#333333');
+  context.translate(0, opts.height);
+  context.rotate(-90 * Math.PI / 180);
+  context.fillText(title, startX, opts.padding[3] + 0.5 * config.fontSize);
+  context.closePath();
+  context.stroke();
+  context.restore();
+}
+
+function drawColumnDataPoints(series, opts, config, context) {
+  let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
+  let columnOption = assign({}, {
+    type: 'group',
+    width: eachSpacing / 2,
+    meter: {
+      border: 4,
+      fillColor: '#FFFFFF'
+    }
+  }, opts.extra.column);
+  
+  let calPoints = [];
+  context.save();
+	
+	let leftNum=-2;
+	let rightNum=xAxisPoints.length+2;
+	
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+		leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2;
+		rightNum=leftNum+opts.xAxis.itemCount+4;
+  }
+  if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+    drawToolTipSplitArea(opts.tooltip.offset.x, opts, config, context, eachSpacing);
+  }
+	
+  series.forEach(function(eachSeries, seriesIndex) {
+    let ranges,minRange,maxRange;
+    ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+    minRange = ranges.pop();
+    maxRange = ranges.shift();
+    
+    var data = eachSeries.data;
+    switch (columnOption.type) {
+      case 'group':
+        var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+        var tooltipPoints = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+        calPoints.push(tooltipPoints);
+        points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts);
+				for(let i=0;i<points.length;i++){
+					let item=points[i];
+          if (item !== null && i>leftNum && i<rightNum) {
+            context.beginPath();
+            context.setStrokeStyle(item.color || eachSeries.color);
+            context.setLineWidth(1)
+            context.setFillStyle(item.color || eachSeries.color);
+            var startX = item.x - item.width / 2;
+            var height = opts.height - item.y - opts.area[2];
+            context.moveTo(startX, item.y);
+            context.lineTo(startX+item.width-2,item.y);
+            context.lineTo(startX+item.width-2,opts.height - opts.area[2]);
+            context.lineTo(startX,opts.height - opts.area[2]);
+            context.lineTo(startX,item.y);
+            context.closePath();
+            context.stroke();
+            context.fill();
+          }
+        };
+        break;
+      case 'stack':
+        // 绘制堆叠数据图
+        var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+        calPoints.push(points);
+        points = fixColumeStackData(points, eachSpacing, series.length, seriesIndex, config, opts, series);
+
+        for(let i=0;i<points.length;i++){
+        	let item=points[i];
+          if (item !== null && i>leftNum && i<rightNum) {
+            context.beginPath();
+            context.setFillStyle(item.color || eachSeries.color);
+            var startX = item.x - item.width / 2 + 1;
+            var height = opts.height - item.y - opts.area[2];
+            var height0 = opts.height - item.y0 - opts.area[2];
+            if (seriesIndex > 0) {
+              height -= height0;
+            }
+            context.moveTo(startX, item.y);
+            context.fillRect(startX, item.y, item.width - 2, height);
+            context.closePath();
+            context.fill();
+          }
+        };
+        break;
+      case 'meter':
+        // 绘制温度计数据图
+        var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+        calPoints.push(points);
+        points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meter.border);
+        if (seriesIndex == 0) {
+          for(let i=0;i<points.length;i++){
+          	let item=points[i];
+            if (item !== null && i>leftNum && i<rightNum) {
+              //画背景颜色
+              context.beginPath();
+              context.setFillStyle(columnOption.meter.fillColor);
+              var startX = item.x - item.width / 2;
+              var height = opts.height - item.y - opts.area[2];
+              context.moveTo(startX, item.y);
+              context.fillRect(startX, item.y, item.width, height);
+              context.closePath();
+              context.fill();
+              //画边框线
+              if (columnOption.meter.border > 0) {
+                context.beginPath();
+                context.setStrokeStyle(eachSeries.color);
+                context.setLineWidth(columnOption.meter.border * opts.pixelRatio);
+                context.moveTo(startX + columnOption.meter.border * 0.5, item.y + height);
+                context.lineTo(startX + columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5);
+                context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5);
+                context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + height);
+                context.stroke();
+              }
+            }
+          };
+        } else {
+          for(let i=0;i<points.length;i++){
+          	let item=points[i];
+            if (item !== null && i>leftNum && i<rightNum) {
+              context.beginPath();
+              context.setFillStyle(item.color || eachSeries.color);
+              var startX = item.x - item.width / 2;
+              var height = opts.height - item.y - opts.area[2];
+              context.moveTo(startX, item.y);
+              context.fillRect(startX, item.y, item.width, height);
+              context.closePath();
+              context.fill();
+            }
+          };
+        }
+        break;
+    }
+  });
+
+  if (opts.dataLabel !== false && process === 1) {
+    series.forEach(function(eachSeries, seriesIndex) {
+      let ranges,minRange,maxRange;
+        ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+        minRange = ranges.pop();
+        maxRange = ranges.shift();
+      var data = eachSeries.data;
+      switch (columnOption.type) {
+        case 'group':
+          var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+          points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts);
+          drawPointText(points, eachSeries, config, context);
+          break;
+        case 'stack':
+          var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+          drawPointText(points, eachSeries, config, context);
+          break;
+        case 'meter':
+          var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+          drawPointText(points, eachSeries, config, context);
+          break;
+      }
+    });
+  }
+
+  context.restore();
+
+  return {
+    xAxisPoints: xAxisPoints,
+    calPoints: calPoints,
+    eachSpacing: eachSpacing
+  };
+}
+
+function drawCandleDataPoints(series, seriesMA, opts, config, context) {
+  var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;
+  var candleOption = assign({}, {
+    color: {},
+    average: {}
+  }, opts.extra.candle);
+  candleOption.color = assign({}, {
+    upLine: '#f04864',
+    upFill: '#f04864',
+    downLine: '#2fc25b',
+    downFill: '#2fc25b'
+  }, candleOption.color);
+  candleOption.average = assign({}, {
+    show: false,
+    name: [],
+    day: [],
+    color: config.colors
+  }, candleOption.average);
+  opts.extra.candle = candleOption;
+
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
+
+  let calPoints = [];
+
+  context.save();
+	
+	let leftNum=-2;
+	let rightNum=xAxisPoints.length+2;
+	let leftSpace=0;
+	let rightSpace=opts.width+eachSpacing;
+	
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+		leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2;
+		rightNum=leftNum+opts.xAxis.itemCount+4;
+		leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3];
+		rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing;
+  }
+
+  //画均线
+  if (candleOption.average.show) {
+    seriesMA.forEach(function(eachSeries, seriesIndex) {
+      let ranges,minRange,maxRange;
+      ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+      minRange = ranges.pop();
+      maxRange = ranges.shift();
+
+      var data = eachSeries.data;
+      var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+      var splitPointList = splitPoints(points);
+			
+			for(let i=0;i<splitPointList.length;i++){
+				let points=splitPointList[i];
+				context.beginPath();
+				context.setStrokeStyle(eachSeries.color);
+				context.setLineWidth(1);
+				if (points.length === 1) {
+					context.moveTo(points[0].x, points[0].y);
+					context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+				} else {
+					context.moveTo(points[0].x, points[0].y);
+					let startPoint=0;
+					for(let j=0;j<points.length;j++){
+						let item=points[j];
+						if(startPoint==0 && item.x > leftSpace){
+							context.moveTo(item.x, item.y);
+							startPoint=1;
+						}
+						if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+							var ctrlPoint = createCurveControlPoints(points, j - 1);
+							context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y);
+						}
+					}
+					context.moveTo(points[0].x, points[0].y);
+				}
+				context.closePath();
+				context.stroke();
+      }
+    });
+  }
+  //画K线
+  series.forEach(function(eachSeries, seriesIndex) {
+    let ranges,minRange,maxRange;
+    ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+    minRange = ranges.pop();
+    maxRange = ranges.shift();
+    var data = eachSeries.data;
+    var points = getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+    calPoints.push(points);
+    var splitPointList = splitPoints(points);
+
+		for(let i=0;i<splitPointList[0].length;i++){
+			if(i>leftNum && i<rightNum){
+				let item=splitPointList[0][i];
+				context.beginPath();
+				//如果上涨
+				if (data[i][1] - data[i][0] > 0) {
+					context.setStrokeStyle(candleOption.color.upLine);
+					context.setFillStyle(candleOption.color.upFill);
+					context.setLineWidth(1 * opts.pixelRatio);
+					context.moveTo(item[3].x, item[3].y); //顶点
+					context.lineTo(item[1].x, item[1].y); //收盘中间点
+					context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点
+					context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点
+					context.lineTo(item[0].x, item[0].y); //开盘中间点
+					context.lineTo(item[2].x, item[2].y); //底点
+					context.lineTo(item[0].x, item[0].y); //开盘中间点
+					context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点
+					context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点
+					context.lineTo(item[1].x, item[1].y); //收盘中间点
+					context.moveTo(item[3].x, item[3].y); //顶点
+				} else {
+					context.setStrokeStyle(candleOption.color.downLine);
+					context.setFillStyle(candleOption.color.downFill);
+					context.setLineWidth(1 * opts.pixelRatio);
+					context.moveTo(item[3].x, item[3].y); //顶点
+					context.lineTo(item[0].x, item[0].y); //开盘中间点
+					context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点
+					context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点
+					context.lineTo(item[1].x, item[1].y); //收盘中间点
+					context.lineTo(item[2].x, item[2].y); //底点
+					context.lineTo(item[1].x, item[1].y); //收盘中间点
+					context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点
+					context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点
+					context.lineTo(item[0].x, item[0].y); //开盘中间点
+					context.moveTo(item[3].x, item[3].y); //顶点
+				}
+				context.closePath();
+				context.fill();
+				context.stroke();
+			}
+    }
+  });
+
+  context.restore();
+
+  return {
+    xAxisPoints: xAxisPoints,
+    calPoints: calPoints,
+    eachSpacing: eachSpacing
+  };
+}
+
+function drawAreaDataPoints(series, opts, config, context) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var areaOption = assign({},{
+    type: 'straight',
+    opacity: 0.2,
+    addLine: false,
+    width: 2,
+		gradient:false
+  },opts.extra.area);
+
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
+
+  let endY = opts.height - opts.area[2];
+  let calPoints = [];
+
+  context.save();
+	let leftSpace=0;
+	let rightSpace=opts.width+eachSpacing;
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+		leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3];
+		rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing;
+  }
+
+  series.forEach(function(eachSeries, seriesIndex) {
+    let ranges,minRange,maxRange;
+    ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+    minRange = ranges.pop();
+    maxRange = ranges.shift();
+    let data = eachSeries.data;
+    let points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+    calPoints.push(points);
+
+    let splitPointList = splitPoints(points);
+    for (let i = 0; i < splitPointList.length; i++) {
+      let points = splitPointList[i];
+      // 绘制区域数
+      context.beginPath();
+      context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity));
+			if(areaOption.gradient){
+				let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height-opts.area[2]);
+				gradient.addColorStop('0', hexToRgb(eachSeries.color, areaOption.opacity));
+				gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1));
+				context.setFillStyle(gradient);
+			}else{
+				context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity));
+			}
+      context.setLineWidth(areaOption.width * opts.pixelRatio);
+      if (points.length > 1) {
+        let firstPoint = points[0];
+        let lastPoint = points[points.length - 1];
+        context.moveTo(firstPoint.x, firstPoint.y);
+				let startPoint=0;
+        if (areaOption.type === 'curve') {
+					for(let j=0;j<points.length;j++){
+						let item=points[j];
+						if(startPoint==0 && item.x > leftSpace){
+							context.moveTo(item.x, item.y);
+							startPoint=1;
+						}
+            if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+              let ctrlPoint = createCurveControlPoints(points, j - 1);
+              context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y);
+            }
+          };
+        } else {
+					for(let j=0;j<points.length;j++){
+						let item=points[j];
+						if(startPoint==0 && item.x > leftSpace){
+							context.moveTo(item.x, item.y);
+							startPoint=1;
+						}
+					  if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+              context.lineTo(item.x, item.y);
+            }
+          };
+        }
+
+        context.lineTo(lastPoint.x, endY);
+        context.lineTo(firstPoint.x, endY);
+        context.lineTo(firstPoint.x, firstPoint.y);
+      } else {
+        let item = points[0];
+        context.moveTo(item.x - eachSpacing / 2, item.y);
+        context.lineTo(item.x + eachSpacing / 2, item.y);
+        context.lineTo(item.x + eachSpacing / 2, endY);
+        context.lineTo(item.x - eachSpacing / 2, endY);
+        context.moveTo(item.x - eachSpacing / 2, item.y);
+      }
+      context.closePath();
+      context.fill();
+
+      //画连线
+      if (areaOption.addLine) {
+				if (eachSeries.lineType == 'dash') {
+					let dashLength = eachSeries.dashLength?eachSeries.dashLength:8;
+					dashLength *= opts.pixelRatio;
+				  context.setLineDash([dashLength, dashLength]);
+				}
+        context.beginPath();
+        context.setStrokeStyle(eachSeries.color);
+        context.setLineWidth(areaOption.width * opts.pixelRatio);
+        if (points.length === 1) {
+          context.moveTo(points[0].x, points[0].y);
+          context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+        } else {
+          context.moveTo(points[0].x, points[0].y);
+					let startPoint=0;
+          if (areaOption.type === 'curve') {
+            for(let j=0;j<points.length;j++){
+            	let item=points[j];
+            	if(startPoint==0 && item.x > leftSpace){
+            		context.moveTo(item.x, item.y);
+            		startPoint=1;
+            	}
+              if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+                let ctrlPoint = createCurveControlPoints(points, j - 1);
+                context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y);
+              }
+            };
+          } else {
+            for(let j=0;j<points.length;j++){
+            	let item=points[j];
+            	if(startPoint==0 && item.x > leftSpace){
+            		context.moveTo(item.x, item.y);
+            		startPoint=1;
+            	}
+              if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+                context.lineTo(item.x, item.y);
+              }
+            };
+          }
+          context.moveTo(points[0].x, points[0].y);
+        }
+        context.stroke();
+				context.setLineDash([]);
+      }
+    }
+
+    //画点
+    if (opts.dataPointShape !== false) {
+      drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
+    }
+
+  });
+
+  if (opts.dataLabel !== false && process === 1) {
+    series.forEach(function(eachSeries, seriesIndex) {
+      let ranges,minRange,maxRange;
+      ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+      minRange = ranges.pop();
+      maxRange = ranges.shift();
+      var data = eachSeries.data;
+      var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+      drawPointText(points, eachSeries, config, context);
+    });
+  }
+
+  context.restore();
+
+  return {
+    xAxisPoints: xAxisPoints,
+    calPoints: calPoints,
+    eachSpacing: eachSpacing
+  };
+}
+
+function drawLineDataPoints(series, opts, config, context) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var lineOption = assign({},{
+		type: 'straight',
+		width: 2
+	},opts.extra.line);
+	lineOption.width *=opts.pixelRatio;
+	
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
+  var calPoints = [];
+
+  context.save();
+	let leftSpace=0;
+	let rightSpace=opts.width+eachSpacing;
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+		leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3];
+		rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing;
+  }
+
+  series.forEach(function(eachSeries, seriesIndex) {
+    let ranges,minRange,maxRange;
+    ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+    minRange = ranges.pop();
+    maxRange = ranges.shift();
+    var data = eachSeries.data;
+    var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+    calPoints.push(points);
+    var splitPointList = splitPoints(points);
+		
+		if (eachSeries.lineType == 'dash') {
+			let dashLength = eachSeries.dashLength?eachSeries.dashLength:8;
+			dashLength *= opts.pixelRatio;
+		  context.setLineDash([dashLength, dashLength]);
+		}
+		context.beginPath();
+		context.setStrokeStyle(eachSeries.color);
+		context.setLineWidth(lineOption.width);
+		
+    splitPointList.forEach(function(points, index) {
+			
+      if (points.length === 1) {
+        context.moveTo(points[0].x, points[0].y);
+        context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+      } else {
+        context.moveTo(points[0].x, points[0].y);
+				let startPoint=0;
+        if (lineOption.type === 'curve') {
+          for(let j=0;j<points.length;j++){
+          	let item=points[j];
+          	if(startPoint==0 && item.x > leftSpace){
+          		context.moveTo(item.x, item.y);
+          		startPoint=1;
+          	}
+            if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+              var ctrlPoint = createCurveControlPoints(points, j - 1);
+              context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y);
+            }
+          };
+        } else {
+          for(let j=0;j<points.length;j++){
+          	let item=points[j];
+          	if(startPoint==0 && item.x > leftSpace){
+          		context.moveTo(item.x, item.y);
+          		startPoint=1;
+          	}
+            if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+              context.lineTo(item.x, item.y);
+            }
+          };
+        }
+        context.moveTo(points[0].x, points[0].y);
+      }
+      
+    });
+		
+		context.stroke();
+		context.setLineDash([]);
+		
+    if (opts.dataPointShape !== false) {
+      drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
+    }
+  });
+
+  if (opts.dataLabel !== false && process === 1) {
+    series.forEach(function(eachSeries, seriesIndex) {
+      let ranges,minRange,maxRange;
+      ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+      minRange = ranges.pop();
+      maxRange = ranges.shift();
+      var data = eachSeries.data;
+      var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+      drawPointText(points, eachSeries, config, context);
+    });
+  }
+
+  context.restore();
+
+  return {
+    xAxisPoints: xAxisPoints,
+    calPoints: calPoints,
+    eachSpacing: eachSpacing
+  };
+}
+
+function drawMixDataPoints(series, opts, config, context) {
+  let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    eachSpacing = xAxisData.eachSpacing;
+
+  let endY = opts.height - opts.area[2];
+  let calPoints = [];
+
+  var columnIndex = 0;
+  var columnLength = 0;
+  series.forEach(function(eachSeries, seriesIndex) {
+    if (eachSeries.type == 'column') {
+      columnLength += 1;
+    }
+  });
+  context.save();
+	let leftNum=-2;
+	let rightNum=xAxisPoints.length+2;
+	let leftSpace=0;
+	let rightSpace=opts.width+eachSpacing;
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+		leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2;
+		rightNum=leftNum+opts.xAxis.itemCount+4;
+		leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3];
+		rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing;
+  }
+
+  series.forEach(function(eachSeries, seriesIndex) {
+    let ranges,minRange,maxRange;
+    
+		ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+		minRange = ranges.pop();
+		maxRange = ranges.shift();
+
+    var data = eachSeries.data;
+    var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+    calPoints.push(points);
+
+    // 绘制柱状数据图
+    if (eachSeries.type == 'column') {
+      points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts);
+      for(let i=0;i<points.length;i++){
+      	let item=points[i];
+        if (item !== null && i>leftNum && i<rightNum) {
+          context.beginPath();
+          context.setStrokeStyle(item.color || eachSeries.color);
+          context.setLineWidth(1)
+          context.setFillStyle(item.color || eachSeries.color);
+          var startX = item.x - item.width / 2;
+          var height = opts.height - item.y - opts.area[2];
+          context.moveTo(startX, item.y);
+          context.moveTo(startX, item.y);
+          context.lineTo(startX+item.width-2,item.y);
+          context.lineTo(startX+item.width-2,opts.height - opts.area[2]);
+          context.lineTo(startX,opts.height - opts.area[2]);
+          context.lineTo(startX,item.y);
+          context.closePath();
+          context.stroke();
+          context.fill();
+          context.closePath();
+          context.fill();
+        }
+      }
+      columnIndex += 1;
+    }
+
+    //绘制区域图数据
+
+    if (eachSeries.type == 'area') {
+      let splitPointList = splitPoints(points);
+      for (let i = 0; i < splitPointList.length; i++) {
+        let points = splitPointList[i];
+        // 绘制区域数据
+        context.beginPath();
+        context.setStrokeStyle(eachSeries.color);
+        context.setFillStyle(hexToRgb(eachSeries.color, 0.2));
+        context.setLineWidth(2 * opts.pixelRatio);
+        if (points.length > 1) {
+          var firstPoint = points[0];
+          let lastPoint = points[points.length - 1];
+          context.moveTo(firstPoint.x, firstPoint.y);
+					let startPoint=0;
+          if (eachSeries.style === 'curve') {
+            for(let j=0;j<points.length;j++){
+            	let item=points[j];
+            	if(startPoint==0 && item.x > leftSpace){
+            		context.moveTo(item.x, item.y);
+            		startPoint=1;
+            	}
+              if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+                var ctrlPoint = createCurveControlPoints(points, j - 1);
+                context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y);
+              }
+            };
+          } else {
+            for(let j=0;j<points.length;j++){
+            	let item=points[j];
+            	if(startPoint==0 && item.x > leftSpace){
+            		context.moveTo(item.x, item.y);
+            		startPoint=1;
+            	}
+              if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+                context.lineTo(item.x, item.y);
+              }
+            };
+          }
+          context.lineTo(lastPoint.x, endY);
+          context.lineTo(firstPoint.x, endY);
+          context.lineTo(firstPoint.x, firstPoint.y);
+        } else {
+          let item = points[0];
+          context.moveTo(item.x - eachSpacing / 2, item.y);
+          context.lineTo(item.x + eachSpacing / 2, item.y);
+          context.lineTo(item.x + eachSpacing / 2, endY);
+          context.lineTo(item.x - eachSpacing / 2, endY);
+          context.moveTo(item.x - eachSpacing / 2, item.y);
+        }
+        context.closePath();
+        context.fill();
+      }
+    }
+
+    // 绘制折线数据图
+    if (eachSeries.type == 'line') {
+      var splitPointList = splitPoints(points);
+      splitPointList.forEach(function(points, index) {
+				if (eachSeries.lineType == 'dash') {
+					let dashLength = eachSeries.dashLength?eachSeries.dashLength:8;
+					dashLength *= opts.pixelRatio;
+				  context.setLineDash([dashLength, dashLength]);
+				}
+        context.beginPath();
+        context.setStrokeStyle(eachSeries.color);
+        context.setLineWidth(2 * opts.pixelRatio);
+        if (points.length === 1) {
+          context.moveTo(points[0].x, points[0].y);
+          context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI);
+        } else {
+          context.moveTo(points[0].x, points[0].y);
+					let startPoint=0;
+          if (eachSeries.style == 'curve') {
+            for(let j=0;j<points.length;j++){
+            	let item=points[j];
+            	if(startPoint==0 && item.x > leftSpace){
+            		context.moveTo(item.x, item.y);
+            		startPoint=1;
+            	}
+              if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+                var ctrlPoint = createCurveControlPoints(points, j - 1);
+                context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y);
+              }
+            }
+          } else {
+            for(let j=0;j<points.length;j++){
+            	let item=points[j];
+            	if(startPoint==0 && item.x > leftSpace){
+            		context.moveTo(item.x, item.y);
+            		startPoint=1;
+            	}
+              if (j > 0 && item.x > leftSpace && item.x < rightSpace) {
+                context.lineTo(item.x, item.y);
+              }
+            }
+          }
+          context.moveTo(points[0].x, points[0].y);
+        }
+        context.stroke();
+				context.setLineDash([]);
+      });
+    }
+
+    // 绘制点数据图
+    if (eachSeries.type == 'point') {
+			eachSeries.addPoint = true;
+    }
+
+    if (eachSeries.addPoint == true && eachSeries.type !== 'column' ) {
+      drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
+    }
+  });
+  if (opts.dataLabel !== false && process === 1) {
+    var columnIndex = 0;
+    series.forEach(function(eachSeries, seriesIndex) {
+      let ranges,minRange,maxRange;
+      
+			ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]);
+			minRange = ranges.pop();
+			maxRange = ranges.shift();
+				
+      var data = eachSeries.data;
+      var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+      if (eachSeries.type !== 'column') {
+        drawPointText(points, eachSeries, config, context);
+      } else {
+        points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts);
+        drawPointText(points, eachSeries, config, context);
+        columnIndex += 1;
+      }
+
+    });
+  }
+
+  context.restore();
+
+  return {
+    xAxisPoints: xAxisPoints,
+    calPoints: calPoints,
+    eachSpacing: eachSpacing,
+  }
+}
+
+function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) {
+  var toolTipOption = opts.extra.tooltip || {};
+  if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'candle' || opts.type == 'mix')) {
+    drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints)
+  }
+  context.save();
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) {
+    context.translate(opts._scrollDistance_, 0);
+  }
+  if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+    drawToolTip(opts.tooltip.textList, opts.tooltip.offset, opts, config, context, eachSpacing, xAxisPoints);
+  }
+  context.restore();
+
+}
+
+function drawXAxis(categories, opts, config, context) {
+
+  let xAxisData = opts.chartData.xAxisData,
+    xAxisPoints = xAxisData.xAxisPoints,
+    startX = xAxisData.startX,
+    endX = xAxisData.endX,
+    eachSpacing = xAxisData.eachSpacing;
+  var boundaryGap='center';
+  if (opts.type == 'line'||opts.type == 'area'){
+    boundaryGap=opts.xAxis.boundaryGap;
+  }
+  var startY = opts.height - opts.area[2];
+  var endY = opts.area[0];
+
+  //绘制滚动条
+  if (opts.enableScroll && opts.xAxis.scrollShow) {
+    var scrollY = opts.height - opts.area[2] + config.xAxisHeight;
+    var scrollScreenWidth = endX - startX;
+    var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1);
+    var scrollWidth = scrollScreenWidth * scrollScreenWidth / scrollTotalWidth;
+    var scrollLeft = 0;
+    if (opts._scrollDistance_) {
+      scrollLeft = -opts._scrollDistance_ * (scrollScreenWidth) / scrollTotalWidth;
+    }
+    context.beginPath();
+    context.setLineCap('round');
+    context.setLineWidth(6 * opts.pixelRatio);
+    context.setStrokeStyle(opts.xAxis.scrollBackgroundColor || "#EFEBEF");
+    context.moveTo(startX, scrollY);
+    context.lineTo(endX, scrollY);
+    context.stroke();
+    context.closePath();
+    context.beginPath();
+    context.setLineCap('round');
+    context.setLineWidth(6 * opts.pixelRatio);
+    context.setStrokeStyle(opts.xAxis.scrollColor || "#A6A6A6");
+    context.moveTo(startX + scrollLeft, scrollY);
+    context.lineTo(startX + scrollLeft + scrollWidth, scrollY);
+    context.stroke();
+    context.closePath();
+    context.setLineCap('butt');
+  }
+
+  context.save();
+
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) {
+    context.translate(opts._scrollDistance_, 0);
+  }
+	
+	//绘制X轴刻度线
+	if (opts.xAxis.calibration === true) {
+		context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc");
+		context.setLineCap('butt');
+		context.setLineWidth(1 * opts.pixelRatio);
+	  xAxisPoints.forEach(function(item, index) {
+	    if (index > 0) {
+	      context.beginPath();
+	      context.moveTo(item - eachSpacing / 2, startY);
+	      context.lineTo(item - eachSpacing / 2, startY + 3 * opts.pixelRatio);
+	      context.closePath();
+	      context.stroke();
+	    }
+	  });
+	}
+	//绘制X轴网格
+  if (opts.xAxis.disableGrid !== true) {
+    context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc");
+    context.setLineCap('butt');
+    context.setLineWidth(1 * opts.pixelRatio);
+    if (opts.xAxis.gridType == 'dash') {
+      context.setLineDash([opts.xAxis.dashLength, opts.xAxis.dashLength]);
+    }
+		opts.xAxis.gridEval = opts.xAxis.gridEval || 1;
+		xAxisPoints.forEach(function(item, index) {
+			if (index % opts.xAxis.gridEval == 0) {
+				context.beginPath();
+				context.moveTo(item, startY);
+				context.lineTo(item, endY);
+				context.stroke();
+			}
+		});
+    context.setLineDash([]);
+  }
+  
+
+  //绘制X轴文案
+  if (opts.xAxis.disabled !== true) {
+    // 对X轴列表做抽稀处理
+    //默认全部显示X轴标签
+    let maxXAxisListLength = categories.length;
+    //如果设置了X轴单屏数量
+    if (opts.xAxis.labelCount) {
+      //如果设置X轴密度
+      if (opts.xAxis.itemCount) {
+        maxXAxisListLength = Math.ceil(categories.length / opts.xAxis.itemCount * opts.xAxis.labelCount);
+      } else {
+        maxXAxisListLength = opts.xAxis.labelCount;
+      }
+      maxXAxisListLength -= 1;
+    }
+
+    let ratio = Math.ceil(categories.length / maxXAxisListLength);
+
+    let newCategories = [];
+    let cgLength = categories.length;
+    for (let i = 0; i < cgLength; i++) {
+      if (i % ratio !== 0) {
+        newCategories.push("");
+      } else {
+        newCategories.push(categories[i]);
+      }
+    }
+    newCategories[cgLength - 1] = categories[cgLength - 1];
+
+    var xAxisFontSize = opts.xAxis.fontSize || config.fontSize;
+    if (config._xAxisTextAngle_ === 0) {
+      newCategories.forEach(function(item, index) {
+        var offset = - measureText(String(item), xAxisFontSize) / 2;
+        if(boundaryGap == 'center'){
+          offset+=eachSpacing / 2;
+        }
+        var scrollHeight=0;
+        if(opts.xAxis.scrollShow){
+          scrollHeight=6*opts.pixelRatio;
+        }
+        context.beginPath();
+        context.setFontSize(xAxisFontSize);
+        context.setFillStyle(opts.xAxis.fontColor || '#666666');
+        context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - scrollHeight - xAxisFontSize) / 2);
+        context.closePath();
+        context.stroke();
+      });
+
+    } else {
+      newCategories.forEach(function(item, index) {
+        context.save();
+        context.beginPath();
+        context.setFontSize(xAxisFontSize);
+        context.setFillStyle(opts.xAxis.fontColor || '#666666');
+        var textWidth = measureText(String(item),xAxisFontSize);
+        var offset = - textWidth;
+        if(boundaryGap == 'center'){
+          offset+=eachSpacing / 2;
+        }
+        var _calRotateTranslate = calRotateTranslate(xAxisPoints[index] + eachSpacing / 2, startY + xAxisFontSize / 2 + 5, opts.height),
+          transX = _calRotateTranslate.transX,
+          transY = _calRotateTranslate.transY;
+
+        context.rotate(-1 * config._xAxisTextAngle_);
+        context.translate(transX, transY);
+        context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + 5);
+        context.closePath();
+        context.stroke();
+        context.restore();
+      });
+    }
+  }
+  context.restore();
+	
+	//绘制X轴轴线
+  if(opts.xAxis.axisLine){
+    context.beginPath();
+    context.setStrokeStyle(opts.xAxis.axisLineColor);
+    context.setLineWidth(1 * opts.pixelRatio);
+    context.moveTo(startX,opts.height-opts.area[2]);
+    context.lineTo(endX,opts.height-opts.area[2]);
+    context.stroke();
+  }
+}
+
+function drawYAxisGrid(categories, opts, config, context) {
+  if (opts.yAxis.disableGrid === true) {
+    return;
+  }
+  let spacingValid = opts.height - opts.area[0] - opts.area[2];
+  let eachSpacing = spacingValid / opts.yAxis.splitNumber;
+  let startX = opts.area[3];
+  let xAxisPoints = opts.chartData.xAxisData.xAxisPoints,
+    xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing;
+  let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1);
+  let endX = startX + TotalWidth;
+
+  let points = [];
+  for (let i = 0; i < opts.yAxis.splitNumber + 1; i++) {
+    points.push(opts.height - opts.area[2] - eachSpacing * i);
+  }
+
+  context.save();
+  if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) {
+    context.translate(opts._scrollDistance_, 0);
+  }
+
+  if (opts.yAxis.gridType == 'dash') {
+    context.setLineDash([opts.yAxis.dashLength, opts.yAxis.dashLength]);
+  }
+  context.setStrokeStyle(opts.yAxis.gridColor);
+  context.setLineWidth(1 * opts.pixelRatio);
+  points.forEach(function(item, index) {
+    context.beginPath();
+    context.moveTo(startX, item);
+    context.lineTo(endX, item);
+    context.stroke();
+  });
+  context.setLineDash([]);
+
+  context.restore();
+}
+
+function drawYAxis(series, opts, config, context) {
+  if (opts.yAxis.disabled === true) {
+    return;
+  }
+  var spacingValid = opts.height - opts.area[0] - opts.area[2];
+  var eachSpacing = spacingValid / opts.yAxis.splitNumber;
+  var startX = opts.area[3];
+  var endX = opts.width - opts.area[1];
+  var endY = opts.height - opts.area[2];
+  var fillEndY = endY + config.xAxisHeight;
+  if (opts.xAxis.scrollShow) {
+    fillEndY -= 3 * opts.pixelRatio;
+  }
+	if (opts.xAxis.rotateLabel){
+		fillEndY = opts.height - opts.area[2]+3;
+	}
+  // set YAxis background
+  context.beginPath();
+  context.setFillStyle(opts.background || '#ffffff');
+  if (opts._scrollDistance_ < 0) {
+    context.fillRect(0, 0, startX, fillEndY);
+  }
+  if(opts.enableScroll == true){
+    context.fillRect(endX, 0, opts.width, fillEndY);
+  }
+  context.closePath();
+  context.stroke();
+
+  var points = [];
+  for (let i = 0; i <= opts.yAxis.splitNumber; i++) {
+    points.push(opts.area[0] + eachSpacing * i);
+  }
+
+  let tStartLeft=opts.area[3];
+  let tStartRight=opts.width-opts.area[1];
+
+  for (let i = 0; i < opts.yAxis.data.length; i++) {
+    let yData = opts.yAxis.data[i];
+    if(yData.disabled !== true){
+      let rangesFormat = opts.chartData.yAxisData.rangesFormat[i];
+      let yAxisFontSize = yData.fontSize || config.fontSize;
+      let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[i];
+      //画Y轴刻度及文案
+      rangesFormat.forEach(function(item, index) {
+        var pos = points[index] ? points[index] : endY;
+        context.beginPath();
+        context.setFontSize(yAxisFontSize);
+        context.setLineWidth(1*opts.pixelRatio);
+        context.setStrokeStyle(yData.axisLineColor||'#cccccc');
+        context.setFillStyle(yData.fontColor|| '#666666');
+        if(yAxisWidth.position=='left'){
+          context.fillText(String(item), tStartLeft - yAxisWidth.width , pos + yAxisFontSize / 2);
+          //画刻度线
+          if(yData.calibration==true){
+            context.moveTo(tStartLeft,pos);
+            context.lineTo(tStartLeft - 3*opts.pixelRatio,pos);
+          }
+        }else{
+          context.fillText(String(item), tStartRight + 4*opts.pixelRatio, pos + yAxisFontSize / 2);
+          //画刻度线
+          if(yData.calibration==true){
+            context.moveTo(tStartRight,pos);
+            context.lineTo(tStartRight + 3*opts.pixelRatio,pos);
+          }
+        }
+        context.closePath();
+        context.stroke();
+      });
+      //画Y轴轴线
+      if (yData.axisLine!==false) {
+        context.beginPath();
+        context.setStrokeStyle(yData.axisLineColor||'#cccccc');
+        context.setLineWidth(1 * opts.pixelRatio);
+        if(yAxisWidth.position=='left'){
+          context.moveTo(tStartLeft,opts.height-opts.area[2]);
+          context.lineTo(tStartLeft,opts.area[0]);
+        }else{
+          context.moveTo(tStartRight,opts.height-opts.area[2]);
+          context.lineTo(tStartRight,opts.area[0]);
+        }
+        context.stroke();
+      }
+			
+      //画Y轴标题
+      if (opts.yAxis.showTitle) {
+				
+        let titleFontSize = yData.titleFontSize || config.fontSize;
+        let title = yData.title;
+        context.beginPath();
+        context.setFontSize(titleFontSize);
+        context.setFillStyle(yData.titleFontColor || '#666666');
+        if(yAxisWidth.position=='left'){
+          context.fillText(title, tStartLeft - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio);
+        }else{
+          context.fillText(title,tStartRight - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio);
+        }
+        context.closePath();
+        context.stroke();
+      }
+      if(yAxisWidth.position=='left'){
+        tStartLeft -=(yAxisWidth.width + opts.yAxis.padding);
+      }else{
+        tStartRight +=yAxisWidth.width+ opts.yAxis.padding;
+      }
+    }
+  }
+}
+
+function drawLegend(series, opts, config, context, chartData) {
+  if (opts.legend.show === false) {
+    return;
+  }
+  let legendData = chartData.legendData;
+  let legendList = legendData.points;
+  let legendArea = legendData.area;
+  let padding = opts.legend.padding;
+  let fontSize = opts.legend.fontSize;
+  let shapeWidth = 15 * opts.pixelRatio;
+  let shapeRight = 5 * opts.pixelRatio;
+  let itemGap = opts.legend.itemGap;
+  let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize);
+
+  //画背景及边框
+  context.beginPath();
+  context.setLineWidth(opts.legend.borderWidth);
+  context.setStrokeStyle(opts.legend.borderColor);
+  context.setFillStyle(opts.legend.backgroundColor);
+  context.moveTo(legendArea.start.x, legendArea.start.y);
+  context.rect(legendArea.start.x, legendArea.start.y, legendArea.width, legendArea.height);
+  context.closePath();
+  context.fill();
+  context.stroke();
+
+  legendList.forEach(function(itemList, listIndex) {
+    let width = 0;
+    let height = 0;
+    width = legendData.widthArr[listIndex];
+    height = legendData.heightArr[listIndex];
+    let startX = 0;
+    let startY = 0;
+    if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+      startX = legendArea.start.x + (legendArea.width - width) / 2;
+      startY = legendArea.start.y + padding + listIndex * lineHeight;
+    } else {
+      if (listIndex == 0) {
+        width = 0;
+      } else {
+        width = legendData.widthArr[listIndex - 1];
+      }
+      startX = legendArea.start.x + padding + width;
+      startY = legendArea.start.y + padding + (legendArea.height - height) / 2;
+    }
+
+    context.setFontSize(config.fontSize);
+    for (let i = 0; i < itemList.length; i++) {
+      let item = itemList[i];
+      item.area = [0, 0, 0, 0];
+      item.area[0] = startX;
+      item.area[1] = startY;
+      item.area[3] = startY + lineHeight;
+      context.beginPath();
+      context.setLineWidth(1 * opts.pixelRatio);
+      context.setStrokeStyle(item.show ? item.color : opts.legend.hiddenColor);
+      context.setFillStyle(item.show ? item.color : opts.legend.hiddenColor);
+      switch (item.legendShape) {
+        case 'line':
+          context.moveTo(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio);
+          context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio, 15 * opts.pixelRatio, 4 * opts.pixelRatio);
+          break;
+        case 'triangle':
+          context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+          context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio);
+          context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio);
+          context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+          break;
+        case 'diamond':
+          context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+          context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight);
+          context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio);
+          context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight);
+          context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+          break;
+        case 'circle':
+          context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight);
+          context.arc(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight, 5 * opts.pixelRatio, 0, 2 * Math.PI);
+          break;
+        case 'rect':
+          context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+          context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio);
+          break;
+        default:
+          context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio);
+          context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio);
+      }
+      context.closePath();
+      context.fill();
+      context.stroke();
+
+      startX += shapeWidth + shapeRight;
+      let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2;
+      context.beginPath();
+      context.setFontSize(fontSize);
+      context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor);
+      context.fillText(item.name, startX, startY + fontTrans);
+      context.closePath();
+      context.stroke();
+      if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+        startX += measureText(item.name, fontSize) + itemGap;
+        item.area[2] = startX;
+      } else {
+        item.area[2] = startX + measureText(item.name, fontSize) + itemGap;;
+        startX -= shapeWidth + shapeRight;
+        startY += lineHeight;
+      }
+    }
+  });
+}
+
+function drawPieDataPoints(series, opts, config, context) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var pieOption = assign({}, {
+    activeOpacity: 0.5,
+    activeRadius: 10 * opts.pixelRatio,
+    offsetAngle: 0,
+    labelWidth: 15 * opts.pixelRatio,
+    ringWidth: 0,
+    border:false,
+    borderWidth:2,
+    borderColor:'#FFFFFF'
+  }, opts.extra.pie);
+  var centerPosition = {
+    x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+    y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
+  };
+  if (config.pieChartLinePadding == 0) {
+    config.pieChartLinePadding = pieOption.activeRadius;
+  }
+
+  var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding);
+
+  series = getPieDataPoints(series, radius, process);
+
+  var activeRadius = pieOption.activeRadius;
+
+  series = series.map(function(eachSeries) {
+    eachSeries._start_ += (pieOption.offsetAngle) * Math.PI / 180;
+    return eachSeries;
+  });
+  series.forEach(function(eachSeries, seriesIndex) {
+    if (opts.tooltip) {
+      if (opts.tooltip.index == seriesIndex) {
+        context.beginPath();
+        context.setFillStyle(hexToRgb(eachSeries.color, opts.extra.pie.activeOpacity || 0.5));
+        context.moveTo(centerPosition.x, centerPosition.y);
+        context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_ + activeRadius, eachSeries._start_,
+          eachSeries._start_ + 2 *
+          eachSeries._proportion_ * Math.PI);
+        context.closePath();
+        context.fill();
+      }
+    }
+    context.beginPath();
+    context.setLineWidth(pieOption.borderWidth * opts.pixelRatio);
+    context.lineJoin = "round";
+    context.setStrokeStyle(pieOption.borderColor);
+    context.setFillStyle(eachSeries.color);
+    context.moveTo(centerPosition.x, centerPosition.y);
+    context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI);
+    context.closePath();
+    context.fill();
+    if (pieOption.border == true) {
+      context.stroke();
+    }
+  });
+
+  if (opts.type === 'ring') {
+    var innerPieWidth = radius * 0.6;
+    if (typeof opts.extra.pie.ringWidth === 'number' && opts.extra.pie.ringWidth > 0) {
+      innerPieWidth = Math.max(0, radius - opts.extra.pie.ringWidth);
+    }
+    context.beginPath();
+    context.setFillStyle(opts.background || '#ffffff');
+    context.moveTo(centerPosition.x, centerPosition.y);
+    context.arc(centerPosition.x, centerPosition.y, innerPieWidth, 0, 2 * Math.PI);
+    context.closePath();
+    context.fill();
+  }
+
+  if (opts.dataLabel !== false && process === 1) {
+    var valid = false;
+    for (var i = 0, len = series.length; i < len; i++) {
+      if (series[i].data > 0) {
+        valid = true;
+        break;
+      }
+    }
+
+    if (valid) {
+      drawPieText(series, opts, config, context, radius, centerPosition);
+    }
+  }
+
+  if (process === 1 && opts.type === 'ring') {
+    drawRingTitle(opts, config, context, centerPosition);
+  }
+
+  return {
+    center: centerPosition,
+    radius: radius,
+    series: series
+  };
+}
+
+function drawRoseDataPoints(series, opts, config, context) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var roseOption = assign({}, {
+    type: 'area',
+    activeOpacity: 0.5,
+    activeRadius: 10 * opts.pixelRatio,
+    offsetAngle: 0,
+    labelWidth: 15 * opts.pixelRatio,
+    border:false,
+    borderWidth:2,
+    borderColor:'#FFFFFF'
+  }, opts.extra.rose);
+  if (config.pieChartLinePadding == 0) {
+    config.pieChartLinePadding = roseOption.activeRadius;
+  }
+  var centerPosition = {
+    x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+    y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
+  };
+   var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding);
+  var minRadius = roseOption.minRadius || radius * 0.5;
+
+  series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process);
+
+  var activeRadius = roseOption.activeRadius;
+
+  series = series.map(function(eachSeries) {
+    eachSeries._start_ += (roseOption.offsetAngle || 0) * Math.PI / 180;
+    return eachSeries;
+  });
+
+  series.forEach(function(eachSeries, seriesIndex) {
+    if (opts.tooltip) {
+      if (opts.tooltip.index == seriesIndex) {
+        context.beginPath();
+        context.setFillStyle(hexToRgb(eachSeries.color, roseOption.activeOpacity || 0.5));
+        context.moveTo(centerPosition.x, centerPosition.y);
+        context.arc(centerPosition.x, centerPosition.y, activeRadius + eachSeries._radius_, eachSeries._start_,
+          eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI);
+        context.closePath();
+        context.fill();
+      }
+    }
+    context.beginPath();
+    context.setLineWidth(roseOption.borderWidth * opts.pixelRatio);
+    context.lineJoin = "round";
+    context.setStrokeStyle(roseOption.borderColor);
+    context.setFillStyle(eachSeries.color);
+    context.moveTo(centerPosition.x, centerPosition.y);
+    context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 *
+      eachSeries._rose_proportion_ * Math.PI);
+    context.closePath();
+    context.fill();
+    if (roseOption.border == true) {
+      context.stroke();
+    }
+  });
+
+  if (opts.dataLabel !== false && process === 1) {
+    var valid = false;
+    for (var i = 0, len = series.length; i < len; i++) {
+      if (series[i].data > 0) {
+        valid = true;
+        break;
+      }
+    }
+
+    if (valid) {
+      drawPieText(series, opts, config, context, radius, centerPosition);
+    }
+  }
+
+  return {
+    center: centerPosition,
+    radius: radius,
+    series: series
+  };
+}
+
+function drawArcbarDataPoints(series, opts, config, context) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var arcbarOption = assign({}, {
+    startAngle: 0.75,
+    endAngle: 0.25,
+    type: 'default',
+    width: 12 * opts.pixelRatio,
+		gap:2 * opts.pixelRatio
+  }, opts.extra.arcbar);
+
+  series = getArcbarDataPoints(series, arcbarOption, process);
+	
+  var centerPosition;
+	if(arcbarOption.center){
+		centerPosition=arcbarOption.center;
+	}else{
+		centerPosition= {
+		  x: opts.width / 2,
+		  y: opts.height / 2
+		};
+	}
+	
+  var radius;
+	if(arcbarOption.radius){
+		radius=arcbarOption.radius;
+	}else{
+		radius = Math.min(centerPosition.x, centerPosition.y);
+		radius -= 5 * opts.pixelRatio;
+		radius -= arcbarOption.width / 2;
+	}
+	
+  for (let i = 0; i < series.length; i++) {
+    let eachSeries = series[i];
+		//背景颜色
+		context.setLineWidth(arcbarOption.width);
+		context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9');
+		context.setLineCap('round');
+		context.beginPath();
+		if (arcbarOption.type == 'default') {
+		  context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, false);
+		} else {
+		  context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, 0, 2 * Math.PI, false);
+		}
+		context.stroke();
+		//进度条
+    context.setLineWidth(arcbarOption.width);
+    context.setStrokeStyle(eachSeries.color);
+    context.setLineCap('round');
+    context.beginPath();
+    context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ * Math.PI, false);
+    context.stroke();
+  }
+
+  drawRingTitle(opts, config, context, centerPosition);
+
+  return {
+    center: centerPosition,
+    radius: radius,
+    series: series
+  };
+}
+
+function drawGaugeDataPoints(categories, series, opts, config, context) {
+  var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;
+  var gaugeOption = assign({}, {
+		type:'default',
+    startAngle: 0.75,
+    endAngle: 0.25,
+    width: 15,
+    splitLine: {
+      fixRadius: 0,
+      splitNumber: 10,
+      width: 15,
+      color: '#FFFFFF',
+      childNumber: 5,
+      childWidth: 5
+    },
+    pointer: {
+      width: 15,
+      color: 'auto'
+    }
+  }, opts.extra.gauge);
+
+  if (gaugeOption.oldAngle == undefined) {
+    gaugeOption.oldAngle = gaugeOption.startAngle;
+  }
+  if (gaugeOption.oldData == undefined) {
+    gaugeOption.oldData = 0;
+  }
+  categories = getGaugeAxisPoints(categories, gaugeOption.startAngle, gaugeOption.endAngle);
+
+  var centerPosition = {
+    x: opts.width / 2,
+    y: opts.height / 2
+  };
+  var radius = Math.min(centerPosition.x, centerPosition.y);
+  radius -= 5 * opts.pixelRatio;
+  radius -= gaugeOption.width / 2;
+  var innerRadius = radius - gaugeOption.width;
+	var totalAngle=0;
+	
+	//判断仪表盘的样式:default百度样式,progress新样式
+	if(gaugeOption.type == 'progress'){
+		
+		//## 第一步画中心圆形背景和进度条背景
+		//中心圆形背景
+		var pieRadius = radius - gaugeOption.width*3;
+		context.beginPath();
+		let gradient = context.createLinearGradient(centerPosition.x, centerPosition.y-pieRadius, centerPosition.x , centerPosition.y+pieRadius);
+		//配置渐变填充(起点:中心点向上减半径;结束点中心点向下加半径)
+		gradient.addColorStop('0', hexToRgb(series[0].color, 0.3));
+		gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1));
+		context.setFillStyle(gradient);
+		context.arc(centerPosition.x, centerPosition.y, pieRadius, 0, 2*Math.PI, false);
+		context.fill();
+		//画进度条背景
+		context.setLineWidth(gaugeOption.width);
+		context.setStrokeStyle(hexToRgb(series[0].color, 0.3));
+		context.setLineCap('round');
+		context.beginPath();
+		context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, gaugeOption.endAngle *Math.PI, false);
+		context.stroke();
+		
+		//## 第二步画刻度线
+		totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+		let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
+		let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber;
+		let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius;
+		let endX = -radius - gaugeOption.width - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width;
+		context.save();
+		context.translate(centerPosition.x, centerPosition.y);
+		context.rotate((gaugeOption.startAngle - 1) * Math.PI);
+		let len = gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1;
+		let proc = series[0].data * process;
+		for (let i = 0; i < len; i++) {
+		  context.beginPath();
+			//刻度线随进度变色
+			if(proc>(i/len)){
+				context.setStrokeStyle(hexToRgb(series[0].color, 1));
+			}else{
+				context.setStrokeStyle(hexToRgb(series[0].color, 0.3));
+			}
+		  context.setLineWidth(3 * opts.pixelRatio);
+		  context.moveTo(startX, 0);
+		  context.lineTo(endX, 0);
+		  context.stroke();
+		  context.rotate(childAngle * Math.PI);
+		}
+		context.restore();
+		
+		//## 第三步画进度条
+		series = getArcbarDataPoints(series, gaugeOption, process);
+		context.setLineWidth(gaugeOption.width);
+		context.setStrokeStyle(series[0].color);
+		context.setLineCap('round');
+		context.beginPath();
+		context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, series[0]._proportion_ *Math.PI, false);
+		context.stroke();
+		
+		//## 第四步画指针
+		let pointerRadius = radius - gaugeOption.width*2.5;
+		context.save();
+		context.translate(centerPosition.x, centerPosition.y);
+		context.rotate((series[0]._proportion_ - 1) * Math.PI);
+		context.beginPath();
+		context.setLineWidth(gaugeOption.width/3);
+		let gradient3 = context.createLinearGradient(0, -pointerRadius*0.6, 0 , pointerRadius*0.6);
+		gradient3.addColorStop('0', hexToRgb('#FFFFFF', 0));
+		gradient3.addColorStop('0.5', hexToRgb(series[0].color, 1));
+		gradient3.addColorStop('1.0', hexToRgb('#FFFFFF', 0));
+		context.setStrokeStyle(gradient3);
+		context.arc(0, 0, pointerRadius , 0.85* Math.PI, 1.15 * Math.PI, false);
+		context.stroke();
+		context.beginPath();
+		context.setLineWidth(1);
+		context.setStrokeStyle(series[0].color);
+		context.setFillStyle(series[0].color);
+		context.moveTo(-pointerRadius-gaugeOption.width/3/2,-4);
+		context.lineTo(-pointerRadius-gaugeOption.width/3/2-4,0);
+		context.lineTo(-pointerRadius-gaugeOption.width/3/2,4);
+		context.lineTo(-pointerRadius-gaugeOption.width/3/2,-4);
+		context.stroke();
+		context.fill();
+		context.restore();
+		
+	//default百度样式
+	}else{
+		//画背景
+		context.setLineWidth(gaugeOption.width);
+		context.setLineCap('butt');
+		for (let i = 0; i < categories.length; i++) {
+		  let eachCategories = categories[i];
+		  context.beginPath();
+		  context.setStrokeStyle(eachCategories.color);
+		  context.arc(centerPosition.x, centerPosition.y, radius, eachCategories._startAngle_ * Math.PI, eachCategories._endAngle_ *Math.PI, false);
+		  context.stroke();
+		}
+		context.save();
+		
+		//画刻度线
+		totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1;
+		let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber;
+		let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber;
+		let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius;
+		let endX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width;
+		let childendX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.childWidth;
+		
+		context.translate(centerPosition.x, centerPosition.y);
+		context.rotate((gaugeOption.startAngle - 1) * Math.PI);
+		
+		for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) {
+		  context.beginPath();
+		  context.setStrokeStyle(gaugeOption.splitLine.color);
+		  context.setLineWidth(2 * opts.pixelRatio);
+		  context.moveTo(startX, 0);
+		  context.lineTo(endX, 0);
+		  context.stroke();
+		  context.rotate(splitAngle * Math.PI);
+		}
+		context.restore();
+		
+		context.save();
+		context.translate(centerPosition.x, centerPosition.y);
+		context.rotate((gaugeOption.startAngle - 1) * Math.PI);
+		
+		for (let i = 0; i < gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; i++) {
+		  context.beginPath();
+		  context.setStrokeStyle(gaugeOption.splitLine.color);
+		  context.setLineWidth(1 * opts.pixelRatio);
+		  context.moveTo(startX, 0);
+		  context.lineTo(childendX, 0);
+		  context.stroke();
+		  context.rotate(childAngle * Math.PI);
+		}
+		context.restore();
+		
+		//画指针
+		series = getGaugeDataPoints(series, categories, gaugeOption, process);
+		
+		for (let i = 0; i < series.length; i++) {
+		  let eachSeries = series[i];
+		  context.save();
+		  context.translate(centerPosition.x, centerPosition.y);
+		  context.rotate((eachSeries._proportion_ - 1) * Math.PI);
+		  context.beginPath();
+		  context.setFillStyle(eachSeries.color);
+		  context.moveTo(gaugeOption.pointer.width, 0);
+		  context.lineTo(0, -gaugeOption.pointer.width / 2);
+		  context.lineTo(-innerRadius, 0);
+		  context.lineTo(0, gaugeOption.pointer.width / 2);
+		  context.lineTo(gaugeOption.pointer.width, 0);
+		  context.closePath();
+		  context.fill();
+		  context.beginPath();
+		  context.setFillStyle('#FFFFFF');
+		  context.arc(0, 0, gaugeOption.pointer.width / 6, 0, 2 * Math.PI, false);
+		  context.fill();
+		  context.restore();
+		}
+		
+		if (opts.dataLabel !== false) {
+		  drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context);
+		}
+	}
+	
+	//画仪表盘标题,副标题
+  drawRingTitle(opts, config, context, centerPosition);
+
+  if (process === 1 && opts.type === 'gauge') {
+    opts.extra.gauge.oldAngle = series[0]._proportion_;
+    opts.extra.gauge.oldData = series[0].data;
+  }
+  return {
+    center: centerPosition,
+    radius: radius,
+    innerRadius: innerRadius,
+    categories: categories,
+    totalAngle: totalAngle
+  };
+}
+
+function drawRadarDataPoints(series, opts, config, context) {
+  var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  var radarOption = assign({},{
+    gridColor: '#cccccc',
+    labelColor: '#666666',
+    opacity: 0.2,
+		gridCount:3
+  },opts.extra.radar);
+  
+  var coordinateAngle = getRadarCoordinateSeries(opts.categories.length);
+  
+  var centerPosition = {
+    x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+    y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2
+  };
+
+  var radius = Math.min(centerPosition.x - (getMaxTextListLength(opts.categories) + config.radarLabelTextMargin),
+    centerPosition.y - config.radarLabelTextMargin);
+  //TODO逻辑不对
+  radius -= opts.padding[1];
+
+  // draw grid
+  context.beginPath();
+  context.setLineWidth(1 * opts.pixelRatio);
+  context.setStrokeStyle(radarOption.gridColor);
+  coordinateAngle.forEach(function(angle) {
+    var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition);
+    context.moveTo(centerPosition.x, centerPosition.y);
+    context.lineTo(pos.x, pos.y);
+  });
+  context.stroke();
+  context.closePath();
+  // draw split line grid
+
+  var _loop = function _loop(i) {
+    var startPos = {};
+    context.beginPath();
+    context.setLineWidth(1 * opts.pixelRatio);
+    context.setStrokeStyle(radarOption.gridColor);
+    coordinateAngle.forEach(function(angle, index) {
+      var pos = convertCoordinateOrigin(radius / radarOption.gridCount * i * Math.cos(angle), radius / radarOption.gridCount * i * Math.sin(angle), centerPosition);
+      if (index === 0) {
+        startPos = pos;
+        context.moveTo(pos.x, pos.y);
+      } else {
+        context.lineTo(pos.x, pos.y);
+      }
+    });
+    context.lineTo(startPos.x, startPos.y);
+    context.stroke();
+    context.closePath();
+  };
+
+  for (var i = 1; i <= radarOption.gridCount; i++) {
+    _loop(i);
+  }
+
+  var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process);
+
+  radarDataPoints.forEach(function(eachSeries, seriesIndex) {
+    // 绘制区域数据
+    context.beginPath();
+    context.setFillStyle(hexToRgb(eachSeries.color, radarOption.opacity));
+    eachSeries.data.forEach(function(item, index) {
+      if (index === 0) {
+        context.moveTo(item.position.x, item.position.y);
+      } else {
+        context.lineTo(item.position.x, item.position.y);
+      }
+    });
+    context.closePath();
+    context.fill();
+
+    if (opts.dataPointShape !== false) {
+      var points = eachSeries.data.map(function(item) {
+        return item.position;
+      });
+      drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
+    }
+  });
+  // draw label text
+  drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context);
+
+  return {
+    center: centerPosition,
+    radius: radius,
+    angleList: coordinateAngle
+  };
+}
+
+function normalInt(min, max, iter) {
+    iter = iter==0?1:iter;
+    var arr = [];
+    for (var i = 0; i < iter; i++) {
+        arr[i] = Math.random();
+    };
+    return  Math.floor(arr.reduce(function(i,j){return i+j})/iter*(max-min))+min;  
+};
+
+function collisionNew(area,points,width,height){
+    var isIn=false;
+    for(let i=0;i<points.length;i++){
+      if(points[i].area){
+        if(area[3]<points[i].area[1]||area[0]>points[i].area[2]||area[1]>points[i].area[3]||area[2]<points[i].area[0]){
+          if(area[0]<0 || area[1]<0 || area[2]>width || area[3]>height){
+            isIn=true;
+            break;
+          }else{
+            isIn=false;
+          }
+        }else{
+          isIn=true;
+          break;
+        }
+      }
+    }
+    return isIn;
+};
+
+function getBoundingBox(data) {
+  var bounds = {}, coords;
+  bounds.xMin = 180;
+  bounds.xMax = 0;
+  bounds.yMin = 90;
+  bounds.yMax = 0
+  for (var i = 0; i < data.length; i++) {
+      var coorda = data[i].geometry.coordinates
+      for (var k = 0; k < coorda.length; k++) {
+          coords = coorda[k];
+          if (coords.length == 1) {
+              coords = coords[0]
+          }
+          for (var j = 0; j < coords.length; j++) {
+              var longitude = coords[j][0];
+              var latitude = coords[j][1];
+              var point = {
+                  x: longitude, 
+                  y: latitude 
+              }
+              bounds.xMin = bounds.xMin < point.x ? bounds.xMin : point.x;
+              bounds.xMax = bounds.xMax > point.x ? bounds.xMax : point.x;
+              bounds.yMin = bounds.yMin < point.y ? bounds.yMin : point.y;
+              bounds.yMax = bounds.yMax > point.y ? bounds.yMax : point.y;
+          }
+      }
+  }
+  return bounds;
+}
+
+function coordinateToPoint(latitude, longitude,bounds,scale,xoffset,yoffset) {
+  return {
+      x: (longitude - bounds.xMin) * scale+xoffset,
+      y: (bounds.yMax - latitude) * scale+yoffset
+  };
+}
+
+function pointToCoordinate(pointY, pointX,bounds,scale,xoffset,yoffset) {
+  return {
+      x: (pointX-xoffset)/scale+bounds.xMin,
+      y: bounds.yMax - (pointY-yoffset)/scale
+  };
+}
+
+function isRayIntersectsSegment(poi,s_poi,e_poi){
+      if (s_poi[1]==e_poi[1]){return false;} 
+      if (s_poi[1]>poi[1] && e_poi[1]>poi[1]){return false;}
+      if (s_poi[1]<poi[1] && e_poi[1]<poi[1]){return false;}
+      if (s_poi[1]==poi[1] && e_poi[1]>poi[1]){return false;}
+      if (e_poi[1]==poi[1] && s_poi[1]>poi[1]){return false;}
+      if (s_poi[0]<poi[0] && e_poi[1]<poi[1]){return false;}
+      let xseg=e_poi[0]-(e_poi[0]-s_poi[0])*(e_poi[1]-poi[1])/(e_poi[1]-s_poi[1]); 
+      if (xseg<poi[0]){
+        return false;
+      }else{
+        return true;
+      }
+} 
+
+function isPoiWithinPoly(poi,poly){
+  let sinsc=0;
+  for (let i=0;i<poly.length;i++){
+    let epoly=poly[i][0];
+    if (poly.length == 1) {
+      epoly = poly[i][0]
+    }
+    for(let j=0;j<epoly.length-1;j++){
+      let s_poi=epoly[j];
+      let e_poi=epoly[j+1];
+      if (isRayIntersectsSegment(poi,s_poi,e_poi)){
+        sinsc+=1;
+      }
+    }
+  }
+  
+  if(sinsc%2==1){
+    return true;
+  }else{
+    return false;
+  }
+}
+
+
+function drawMapDataPoints(series, opts, config, context) {
+  var mapOption=assign({},{
+    border:true,
+    borderWidth:1,
+    borderColor:'#666666',
+    fillOpacity:0.6,
+    activeBorderColor:'#f04864',
+    activeFillColor:'#facc14',
+    activeFillOpacity:1
+  },opts.extra.map);
+  var coords, point;
+  var data = series;
+  var bounds= getBoundingBox(data);
+  var xScale = opts.width / Math.abs(bounds.xMax - bounds.xMin);
+  var yScale = opts.height / Math.abs(bounds.yMax - bounds.yMin);
+  var scale = xScale < yScale ? xScale : yScale;
+  var xoffset=opts.width/2-Math.abs(bounds.xMax - bounds.xMin)/2*scale;
+  var yoffset=opts.height/2-Math.abs(bounds.yMax - bounds.yMin)/2*scale;
+  context.beginPath();
+  context.clearRect(0, 0, opts.width, opts.height);
+  context.setFillStyle(opts.background||'#FFFFFF');
+  context.rect(0,0,opts.width,opts.height);
+  context.fill();
+  for (var i = 0; i < data.length; i++) {
+    context.beginPath();
+    context.setLineWidth(mapOption.borderWidth * opts.pixelRatio);
+    context.setStrokeStyle(mapOption.borderColor);
+    context.setFillStyle(hexToRgb(series[i].color, mapOption.fillOpacity));
+    if (opts.tooltip) {
+      if (opts.tooltip.index == i ) {
+        context.setStrokeStyle(mapOption.activeBorderColor);
+        context.setFillStyle(hexToRgb(mapOption.activeFillColor, mapOption.activeFillOpacity));
+      }
+    }
+    var coorda = data[i].geometry.coordinates
+    for (var k = 0; k < coorda.length; k++) {
+      coords = coorda[k];
+      if (coords.length == 1) {
+        coords = coords[0]
+      }
+      for (var j = 0; j < coords.length; j++) {
+        point = coordinateToPoint(coords[j][1], coords[j][0],bounds,scale,xoffset,yoffset)
+        if (j === 0) {
+          context.beginPath();
+          context.moveTo(point.x, point.y);
+        } else {
+          context.lineTo(point.x, point.y);
+        }
+      }
+      context.fill();
+      if(mapOption.border == true){
+        context.stroke();
+      }
+    }
+    if(opts.dataLabel == true){
+      var centerPoint = data[i].properties.centroid;
+      if(centerPoint){
+        point = coordinateToPoint(centerPoint[1], centerPoint[0],bounds,scale,xoffset,yoffset);
+        let fontSize=data[i].textSize||config.fontSize;
+        let text=data[i].properties.name;
+        context.beginPath();
+        context.setFontSize(fontSize)
+        context.setFillStyle(data[i].textColor||'#666666')
+        context.fillText(text, point.x-measureText(text,fontSize)/2, point.y+fontSize/2);
+        context.closePath();
+        context.stroke();
+      }
+    }
+  }
+  opts.chartData.mapData={
+    bounds:bounds,
+    scale:scale,
+    xoffset:xoffset,
+    yoffset:yoffset
+  }
+  drawToolTipBridge(opts, config, context,1);
+  context.draw();
+}
+
+function getWordCloudPoint(opts,type){
+  let points = opts.series.sort(function(a,b){return parseInt(b.textSize)-parseInt(a.textSize);});
+  switch (type) {
+    case 'normal':
+      for (let i = 0; i < points.length; i++) {
+        let text = points[i].name;
+        let tHeight = points[i].textSize;
+        let tWidth = measureText(text,tHeight);
+        let x,y;
+        let area;
+        let breaknum=0;
+        while(true) {
+            breaknum++;
+            x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2;
+            y = normalInt(-opts.height/2, opts.height/2,5) + tHeight/2;
+            area=[x-5+opts.width/2,y-5-tHeight+opts.height/2,x+tWidth+5+opts.width/2,y+5+opts.height/2];
+            let isCollision = collisionNew(area,points,opts.width,opts.height);
+            if (!isCollision) break;
+            if (breaknum==1000){
+              area=[-100,-100,-100,-100];
+              break;
+            }
+        };
+        points[i].area=area;
+      }
+    break;
+    case 'vertical':
+      function Spin(){
+        //获取均匀随机值,是否旋转,旋转的概率为(1-0.5)
+        if (Math.random()>0.7) {
+            return true;
+        }else {return false};
+      };
+      for (let i = 0; i < points.length; i++) { 
+        let text = points[i].name;
+        let tHeight = points[i].textSize;
+        let tWidth = measureText(text,tHeight);
+        let isSpin = Spin(); 
+        let x,y,area,areav;
+        let breaknum=0;
+        while(true) {
+          breaknum++;
+          let isCollision;
+          if (isSpin) {
+              x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2;
+              y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2;
+              area=[y-5-tWidth+opts.width/2,(-x-5+opts.height/2),y+5+opts.width/2,(-x+tHeight+5+opts.height/2)];
+              areav=[opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)-5,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)-5,opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)+tHeight,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)+tWidth+5];
+              isCollision = collisionNew(areav,points,opts.height,opts.width);
+          }else{
+            x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2;
+            y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2;
+            area=[x-5+opts.width/2,y-5-tHeight+opts.height/2,x+tWidth+5+opts.width/2,y+5+opts.height/2];
+            isCollision = collisionNew(area,points,opts.width,opts.height);
+          } 
+          if (!isCollision) break;
+          if (breaknum==1000){
+            area=[-1000,-1000,-1000,-1000];
+            break;
+          }
+        };
+        if (isSpin) {
+          points[i].area=areav;
+          points[i].areav=area;
+        }else{
+          points[i].area=area;
+        }
+        points[i].rotate=isSpin;
+      };
+    break;
+  }
+  return points;
+}
+
+
+function drawWordCloudDataPoints(series, opts, config, context) {
+  let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  let wordOption = assign({},{
+    type: 'normal',
+    autoColors: true
+  },opts.extra.word);
+  
+  context.beginPath();
+  context.setFillStyle(opts.background||'#FFFFFF');
+  context.rect(0,0,opts.width,opts.height);
+  context.fill();
+  context.save();
+  let points = opts.chartData.wordCloudData;
+  context.translate(opts.width/2,opts.height/2);
+  
+  for(let i=0;i<points.length;i++){
+      context.save();
+      if(points[i].rotate){
+        context.rotate(90 * Math.PI / 180);
+      }
+      let text = points[i].name;
+      let tHeight = points[i].textSize;
+      let tWidth = measureText(text,tHeight);
+      context.beginPath();
+      context.setStrokeStyle(points[i].color);
+      context.setFillStyle(points[i].color);
+      context.setFontSize(tHeight);
+      if(points[i].rotate){
+        if(points[i].areav[0]>0){
+          if (opts.tooltip) {
+            if (opts.tooltip.index == i) {
+              context.strokeText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process);
+              }else{
+                context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process);
+              }
+          }else{
+            context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process);
+          } 
+        }
+      }else{
+        if(points[i].area[0]>0){
+          if (opts.tooltip) {
+            if (opts.tooltip.index == i) {
+              context.strokeText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process);
+            }else{
+              context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process);
+            }
+          }else{
+            context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process);
+          }
+            
+        }
+      }
+      
+      context.stroke();
+      context.restore();
+  }
+  context.restore();
+}
+
+function drawFunnelDataPoints(series, opts, config, context) {
+  let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+  let funnelOption = assign({},{
+    activeWidth:10,
+    activeOpacity:0.3,
+    border:false,
+    borderWidth:2,
+    borderColor:'#FFFFFF',
+    fillOpacity:1,
+    labelAlign:'right'
+  },opts.extra.funnel);
+  let eachSpacing = (opts.height - opts.area[0] - opts.area[2])/series.length;
+  let centerPosition = {
+    x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2,
+    y: opts.height-opts.area[2]
+  };
+  let activeWidth = funnelOption.activeWidth;
+  let radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth, (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth);
+  series = getFunnelDataPoints(series, radius, process);
+  context.save();
+  context.translate(centerPosition.x,centerPosition.y);
+  for(let i=0;i<series.length;i++){
+    if(i==0){
+      if (opts.tooltip) {
+        if (opts.tooltip.index == i) {
+          context.beginPath();
+          context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
+          context.moveTo(-activeWidth, 0);
+          context.lineTo(-series[i].radius-activeWidth, -eachSpacing);
+          context.lineTo(series[i].radius+activeWidth, -eachSpacing);
+          context.lineTo(activeWidth, 0);
+          context.lineTo(-activeWidth, 0);
+          context.closePath();
+          context.fill();
+        }
+      }
+      series[i].funnelArea=[centerPosition.x-series[i].radius,centerPosition.y-eachSpacing,centerPosition.x+series[i].radius,centerPosition.y];
+      context.beginPath();
+      context.setLineWidth(funnelOption.borderWidth * opts.pixelRatio);
+      context.setStrokeStyle(funnelOption.borderColor);
+      context.setFillStyle(hexToRgb(series[i].color, funnelOption.fillOpacity));
+      context.moveTo(0, 0);
+      context.lineTo(-series[i].radius, -eachSpacing);
+      context.lineTo(series[i].radius, -eachSpacing);
+      context.lineTo(0, 0);
+      context.closePath();
+      context.fill();
+      if(funnelOption.border == true){
+        context.stroke();
+      }
+    }else{
+      if (opts.tooltip) {
+        if (opts.tooltip.index == i) {
+          context.beginPath();
+          context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
+          context.moveTo(0, 0);
+          context.lineTo(-series[i-1].radius-activeWidth, 0);
+          context.lineTo(-series[i].radius-activeWidth, -eachSpacing);
+          context.lineTo(series[i].radius+activeWidth, -eachSpacing);
+          context.lineTo(series[i-1].radius+activeWidth, 0);
+          context.lineTo(0, 0);
+          context.closePath();
+          context.fill();
+        }
+      }
+      series[i].funnelArea=[centerPosition.x-series[i].radius,centerPosition.y-eachSpacing*(i+1),centerPosition.x+series[i].radius,centerPosition.y-eachSpacing*i];
+      context.beginPath();
+      context.setLineWidth(funnelOption.borderWidth * opts.pixelRatio);
+      context.setStrokeStyle(funnelOption.borderColor);
+      context.setFillStyle(hexToRgb(series[i].color, funnelOption.fillOpacity));
+      context.moveTo(0, 0);
+      context.lineTo(-series[i-1].radius, 0);
+      context.lineTo(-series[i].radius, -eachSpacing);
+      context.lineTo(series[i].radius, -eachSpacing);
+      context.lineTo(series[i-1].radius, 0);
+      context.lineTo(0, 0);
+      context.closePath();
+      context.fill();
+      if(funnelOption.border == true){
+        context.stroke();
+      }
+    }
+    context.translate(0,-eachSpacing)
+  }
+  context.restore();
+  
+  if (opts.dataLabel !== false && process === 1) {
+    drawFunnelText(series, opts, context, eachSpacing, funnelOption.labelAlign, activeWidth, centerPosition);
+  }
+  
+  return {
+    center: centerPosition,
+    radius: radius,
+    series: series
+  };
+}
+
+function drawFunnelText(series, opts, context, eachSpacing, labelAlign,activeWidth, centerPosition){
+  for(let i=0;i<series.length;i++){
+    let item = series[i];
+    let startX,endX,startY,fontSize;
+    let text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) +'%';
+    if(labelAlign == 'right'){
+      if(i==0){
+        startX=(item.funnelArea[2]+centerPosition.x)/2;
+      }else{
+        startX=(item.funnelArea[2]+series[i-1].funnelArea[2])/2;
+      }
+      endX=startX+activeWidth*2;
+      startY=item.funnelArea[1]+eachSpacing/2;
+      fontSize = item.textSize || opts.fontSize;
+      context.setLineWidth(1 * opts.pixelRatio);
+      context.setStrokeStyle(item.color);
+      context.setFillStyle(item.color);
+      context.beginPath();
+      context.moveTo(startX,startY );
+      context.lineTo(endX,startY);
+      context.stroke();
+      context.closePath();
+      context.beginPath();
+      context.moveTo(endX, startY);
+      context.arc(endX, startY, 2, 0, 2 * Math.PI);
+      context.closePath();
+      context.fill();
+      context.beginPath();
+      context.setFontSize(fontSize);
+      context.setFillStyle(item.textColor || '#666666');
+      context.fillText(text, endX+5, startY + fontSize/2 -2);
+      context.closePath();
+      context.stroke();
+      context.closePath();
+    }else{
+      if(i==0){
+        startX=(item.funnelArea[0]+centerPosition.x)/2;
+      }else{
+        startX=(item.funnelArea[0]+series[i-1].funnelArea[0])/2;
+      }
+      endX=startX-activeWidth*2;
+      startY=item.funnelArea[1]+eachSpacing/2;
+      fontSize = item.textSize || opts.fontSize;
+      context.setLineWidth(1 * opts.pixelRatio);
+      context.setStrokeStyle(item.color);
+      context.setFillStyle(item.color);
+      context.beginPath();
+      context.moveTo(startX,startY );
+      context.lineTo(endX,startY);
+      context.stroke();
+      context.closePath();
+      context.beginPath();
+      context.moveTo(endX, startY);
+      context.arc(endX, startY, 2, 0, 2 * Math.PI);
+      context.closePath();
+      context.fill();
+      context.beginPath();
+      context.setFontSize(fontSize);
+      context.setFillStyle(item.textColor || '#666666');
+      context.fillText(text, endX-5-measureText(text), startY + fontSize/2 -2);
+      context.closePath();
+      context.stroke();
+      context.closePath();
+    }
+    
+  }
+}
+
+
+function drawCanvas(opts, context) {
+  context.draw();
+}
+
+var Timing = {
+  easeIn: function easeIn(pos) {
+    return Math.pow(pos, 3);
+  },
+  easeOut: function easeOut(pos) {
+    return Math.pow(pos - 1, 3) + 1;
+  },
+  easeInOut: function easeInOut(pos) {
+    if ((pos /= 0.5) < 1) {
+      return 0.5 * Math.pow(pos, 3);
+    } else {
+      return 0.5 * (Math.pow(pos - 2, 3) + 2);
+    }
+  },
+  linear: function linear(pos) {
+    return pos;
+  }
+};
+
+function Animation(opts) {
+  this.isStop = false;
+  opts.duration = typeof opts.duration === 'undefined' ? 1000 : opts.duration;
+  opts.timing = opts.timing || 'linear';
+  var delay = 17;
+
+  function createAnimationFrame() {
+    if (typeof setTimeout !== 'undefined') {
+      return function(step, delay) {
+        setTimeout(function() {
+          var timeStamp = +new Date();
+          step(timeStamp);
+        }, delay);
+      };
+    } else if (typeof requestAnimationFrame !== 'undefined') {
+      return requestAnimationFrame;
+    } else {
+      return function(step) {
+        step(null);
+      };
+    }
+  };
+  var animationFrame = createAnimationFrame();
+  var startTimeStamp = null;
+  var _step = function step(timestamp) {
+    if (timestamp === null || this.isStop === true) {
+      opts.onProcess && opts.onProcess(1);
+      opts.onAnimationFinish && opts.onAnimationFinish();
+      return;
+    }
+    if (startTimeStamp === null) {
+      startTimeStamp = timestamp;
+    }
+    if (timestamp - startTimeStamp < opts.duration) {
+      var process = (timestamp - startTimeStamp) / opts.duration;
+      var timingFunction = Timing[opts.timing];
+      process = timingFunction(process);
+
+      opts.onProcess && opts.onProcess(process);
+      animationFrame(_step, delay);
+    } else {
+      opts.onProcess && opts.onProcess(1);
+      opts.onAnimationFinish && opts.onAnimationFinish();
+    }
+  };
+  _step = _step.bind(this);
+  animationFrame(_step, delay);
+}
+
+// stop animation immediately
+// and tigger onAnimationFinish
+Animation.prototype.stop = function() {
+  this.isStop = true;
+};
+
+function drawCharts(type, opts, config, context) {
+  var _this = this;
+  var series = opts.series;
+  var categories = opts.categories;
+  series = fillSeries(series, opts, config);
+  var duration = opts.animation ? opts.duration : 0;
+  _this.animationInstance && _this.animationInstance.stop();
+  var seriesMA = null;
+  if (type == 'candle') {
+    let average = assign({}, opts.extra.candle.average);
+    if (average.show) {
+      seriesMA = calCandleMA(average.day, average.name, average.color, series[0].data);
+      seriesMA = fillSeries(seriesMA, opts, config);
+      opts.seriesMA = seriesMA;
+    } else if (opts.seriesMA) {
+      seriesMA = opts.seriesMA = fillSeries(opts.seriesMA, opts, config);
+    } else {
+      seriesMA = series;
+    }
+  } else {
+    seriesMA = series;
+  }
+
+  /* 过滤掉show=false的series */
+  opts._series_ = series = filterSeries(series);
+
+  //重新计算图表区域
+
+  opts.area = new Array(4);
+  //复位绘图区域
+  for (let j = 0; j < 4; j++) {
+    opts.area[j] = opts.padding[j];
+  }
+
+  //通过计算三大区域:图例、X轴、Y轴的大小,确定绘图区域
+  var _calLegendData = calLegendData(seriesMA, opts, config, opts.chartData),
+    legendHeight = _calLegendData.area.wholeHeight,
+    legendWidth = _calLegendData.area.wholeWidth;
+    
+  switch (opts.legend.position) {
+    case 'top':
+      opts.area[0] += legendHeight;
+      break;
+    case 'bottom':
+      opts.area[2] += legendHeight;
+      break;
+    case 'left':
+      opts.area[3] += legendWidth;
+      break;
+    case 'right':
+      opts.area[1] += legendWidth;
+      break;
+  }
+
+  let _calYAxisData = {},yAxisWidth = 0;
+  if (opts.type === 'line' || opts.type === 'column' || opts.type === 'area' || opts.type === 'mix' || opts.type === 'candle') {
+    _calYAxisData = calYAxisData(series, opts, config);
+    yAxisWidth = _calYAxisData.yAxisWidth;
+    //如果显示Y轴标题
+    if(opts.yAxis.showTitle){
+      let maxTitleHeight=0;
+      for(let i=0;i<opts.yAxis.data.length;i++){
+        maxTitleHeight = Math.max(maxTitleHeight,opts.yAxis.data[i].titleFontSize?opts.yAxis.data[i].titleFontSize:config.fontSize)
+      }
+      opts.area[0] += (maxTitleHeight+6)*opts.pixelRatio;
+    }
+    let rightIndex=0,leftIndex=0;
+    //计算主绘图区域左右位置
+    for(let i=0;i<yAxisWidth.length;i++){
+      if(yAxisWidth[i].position=='left'){
+        if(leftIndex>0){
+          opts.area[3] += yAxisWidth[i].width + opts.yAxis.padding;
+        }else{
+          opts.area[3] += yAxisWidth[i].width;
+        }
+        leftIndex +=1;
+      }else{
+        if(rightIndex>0){
+          opts.area[1] += yAxisWidth[i].width + opts.yAxis.padding;
+        }else{
+          opts.area[1] += yAxisWidth[i].width;
+        }
+        rightIndex +=1;
+      }
+    }
+  }else{
+    config.yAxisWidth = yAxisWidth;
+  }
+  opts.chartData.yAxisData = _calYAxisData;
+
+  if (opts.categories && opts.categories.length) {
+    opts.chartData.xAxisData = getXAxisPoints(opts.categories, opts, config);
+    let _calCategoriesData = calCategoriesData(opts.categories, opts, config, opts.chartData.xAxisData.eachSpacing),
+      xAxisHeight = _calCategoriesData.xAxisHeight,
+      angle = _calCategoriesData.angle;
+    config.xAxisHeight = xAxisHeight;
+    config._xAxisTextAngle_ = angle;
+    opts.area[2] += xAxisHeight;
+    opts.chartData.categoriesData = _calCategoriesData;
+  }else{
+		if (opts.type === 'line' || opts.type === 'area' || opts.type === 'points') {
+			opts.chartData.xAxisData = calXAxisData(series, opts, config);
+			categories=opts.chartData.xAxisData.rangesFormat;
+			let _calCategoriesData = calCategoriesData(categories, opts, config, opts.chartData.xAxisData.eachSpacing),
+			  xAxisHeight = _calCategoriesData.xAxisHeight,
+			  angle = _calCategoriesData.angle;
+			config.xAxisHeight = xAxisHeight;
+			config._xAxisTextAngle_ = angle;
+			opts.area[2] += xAxisHeight;
+			opts.chartData.categoriesData = _calCategoriesData;
+		}else{
+			opts.chartData.xAxisData={
+				xAxisPoints: []
+			};
+		}
+	}
+  //计算右对齐偏移距离
+  if (opts.enableScroll && opts.xAxis.scrollAlign == 'right' && opts._scrollDistance_ === undefined) {
+    let offsetLeft = 0,
+      xAxisPoints = opts.chartData.xAxisData.xAxisPoints,
+      startX = opts.chartData.xAxisData.startX,
+      endX = opts.chartData.xAxisData.endX,
+      eachSpacing = opts.chartData.xAxisData.eachSpacing;
+    let totalWidth = eachSpacing * (xAxisPoints.length - 1);
+    let screenWidth = endX - startX;
+    offsetLeft = screenWidth - totalWidth;
+    _this.scrollOption = {
+      currentOffset: offsetLeft,
+      startTouchX: offsetLeft,
+      distance: 0,
+      lastMoveTime: 0
+    };
+    opts._scrollDistance_ = offsetLeft;
+  }
+
+  if (type === 'pie' || type === 'ring' || type === 'rose') {
+    config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA);
+  }
+
+  switch (type) {
+    case 'word':
+      let wordOption = assign({},{
+        type: 'normal',
+        autoColors: true
+      },opts.extra.word);
+      if(opts.updateData==true || opts.updateData==undefined){
+        opts.chartData.wordCloudData=getWordCloudPoint(opts,wordOption.type);
+      }
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawWordCloudDataPoints(series, opts, config, context,process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+    break;
+    case 'map':
+      context.clearRect(0, 0, opts.width, opts.height);
+      drawMapDataPoints(series, opts, config, context);
+    break;
+    case 'funnel':
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.funnelData = drawFunnelDataPoints(series, opts, config, context, process);
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+    break;
+    case 'line':
+      this.animationInstance = new Animation({
+        timing: 'easeIn',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawYAxisGrid(categories, opts, config, context);
+          drawXAxis(categories, opts, config, context);
+          var _drawLineDataPoints = drawLineDataPoints(series, opts, config, context, process),
+            xAxisPoints = _drawLineDataPoints.xAxisPoints,
+            calPoints = _drawLineDataPoints.calPoints,
+            eachSpacing = _drawLineDataPoints.eachSpacing;
+          opts.chartData.xAxisPoints = xAxisPoints;
+          opts.chartData.calPoints = calPoints;
+          opts.chartData.eachSpacing = eachSpacing;
+          drawYAxis(series, opts, config, context);
+          if (opts.enableMarkLine !== false && process === 1) {
+            drawMarkLine(opts, config, context);
+          }
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints);
+          drawCanvas(opts, context);
+
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'mix':
+      this.animationInstance = new Animation({
+        timing: 'easeIn',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawYAxisGrid(categories, opts, config, context);
+          drawXAxis(categories, opts, config, context);
+          var _drawMixDataPoints = drawMixDataPoints(series, opts, config, context, process),
+            xAxisPoints = _drawMixDataPoints.xAxisPoints,
+            calPoints = _drawMixDataPoints.calPoints,
+            eachSpacing = _drawMixDataPoints.eachSpacing;
+          opts.chartData.xAxisPoints = xAxisPoints;
+          opts.chartData.calPoints = calPoints;
+          opts.chartData.eachSpacing = eachSpacing;
+          drawYAxis(series, opts, config, context);
+          if (opts.enableMarkLine !== false && process === 1) {
+            drawMarkLine(opts, config, context);
+          }
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'column':
+      this.animationInstance = new Animation({
+        timing: 'easeIn',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawYAxisGrid(categories, opts, config, context);
+          drawXAxis(categories, opts, config, context);
+          var _drawColumnDataPoints = drawColumnDataPoints(series, opts, config, context, process),
+            xAxisPoints = _drawColumnDataPoints.xAxisPoints,
+            calPoints = _drawColumnDataPoints.calPoints,
+            eachSpacing = _drawColumnDataPoints.eachSpacing;
+          opts.chartData.xAxisPoints = xAxisPoints;
+          opts.chartData.calPoints = calPoints;
+          opts.chartData.eachSpacing = eachSpacing;
+          drawYAxis(series, opts, config, context);
+          if (opts.enableMarkLine !== false && process === 1) {
+            drawMarkLine(opts, config, context);
+          }
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'area':
+      this.animationInstance = new Animation({
+        timing: 'easeIn',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawYAxisGrid(categories, opts, config, context);
+          drawXAxis(categories, opts, config, context);
+          var _drawAreaDataPoints = drawAreaDataPoints(series, opts, config, context, process),
+            xAxisPoints = _drawAreaDataPoints.xAxisPoints,
+            calPoints = _drawAreaDataPoints.calPoints,
+            eachSpacing = _drawAreaDataPoints.eachSpacing;
+          opts.chartData.xAxisPoints = xAxisPoints;
+          opts.chartData.calPoints = calPoints;
+          opts.chartData.eachSpacing = eachSpacing;
+          drawYAxis(series, opts, config, context);
+          if (opts.enableMarkLine !== false && process === 1) {
+            drawMarkLine(opts, config, context);
+          }
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'ring':
+    case 'pie':
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process);
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'rose':
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.pieData = drawRoseDataPoints(series, opts, config, context, process);
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'radar':
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.radarData = drawRadarDataPoints(series, opts, config, context, process);
+          drawLegend(opts.series, opts, config, context, opts.chartData);
+          drawToolTipBridge(opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'arcbar':
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.arcbarData = drawArcbarDataPoints(series, opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'gauge':
+      this.animationInstance = new Animation({
+        timing: 'easeInOut',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          opts.chartData.gaugeData = drawGaugeDataPoints(categories, series, opts, config, context, process);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+    case 'candle':
+      this.animationInstance = new Animation({
+        timing: 'easeIn',
+        duration: duration,
+        onProcess: function onProcess(process) {
+          context.clearRect(0, 0, opts.width, opts.height);
+          if (opts.rotate) {
+            contextRotate(context, opts);
+          }
+          drawYAxisGrid(categories, opts, config, context);
+          drawXAxis(categories, opts, config, context);
+          var _drawCandleDataPoints = drawCandleDataPoints(series, seriesMA, opts, config, context, process),
+            xAxisPoints = _drawCandleDataPoints.xAxisPoints,
+            calPoints = _drawCandleDataPoints.calPoints,
+            eachSpacing = _drawCandleDataPoints.eachSpacing;
+          opts.chartData.xAxisPoints = xAxisPoints;
+          opts.chartData.calPoints = calPoints;
+          opts.chartData.eachSpacing = eachSpacing;
+          drawYAxis(series, opts, config, context);
+          if (opts.enableMarkLine !== false && process === 1) {
+            drawMarkLine(opts, config, context);
+          }
+          if (seriesMA) {
+            drawLegend(seriesMA, opts, config, context, opts.chartData);
+          } else {
+            drawLegend(opts.series, opts, config, context, opts.chartData);
+          }
+          drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints);
+          drawCanvas(opts, context);
+        },
+        onAnimationFinish: function onAnimationFinish() {
+          _this.event.trigger('renderComplete');
+        }
+      });
+      break;
+  }
+}
+
+// simple event implement
+
+function Event() {
+  this.events = {};
+}
+
+Event.prototype.addEventListener = function(type, listener) {
+  this.events[type] = this.events[type] || [];
+  this.events[type].push(listener);
+};
+
+Event.prototype.trigger = function() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  var type = args[0];
+  var params = args.slice(1);
+  if (!!this.events[type]) {
+    this.events[type].forEach(function(listener) {
+      try {
+        listener.apply(null, params);
+      } catch (e) {
+        console.error(e);
+      }
+    });
+  }
+};
+
+var Charts = function Charts(opts) {
+  opts.pixelRatio = opts.pixelRatio ? opts.pixelRatio : 1;
+  opts.fontSize = opts.fontSize ? opts.fontSize * opts.pixelRatio : 13 * opts.pixelRatio;
+  opts.title = assign({}, opts.title);
+  opts.subtitle = assign({}, opts.subtitle);
+  opts.duration = opts.duration ? opts.duration : 1000;
+  opts.yAxis = assign({}, {
+    data:[],
+    showTitle:false,
+    disabled:false,
+    disableGrid:false,
+    splitNumber:5,
+    gridType: 'solid',
+    dashLength: 4 * opts.pixelRatio,
+    gridColor:'#cccccc',
+    padding:10,
+    fontColor:'#666666'
+  }, opts.yAxis);
+  opts.yAxis.dashLength *= opts.pixelRatio;
+  opts.yAxis.padding *= opts.pixelRatio;
+  opts.xAxis = assign({}, {
+    rotateLabel: false,
+    type: 'calibration',
+    gridType: 'solid',
+    dashLength: 4,
+    scrollAlign: 'left',
+    boundaryGap:'center',
+    axisLine:true,
+    axisLineColor:'#cccccc'
+  }, opts.xAxis);
+  opts.xAxis.dashLength *= opts.pixelRatio;
+  opts.legend = assign({}, {
+    show: true,
+    position: 'bottom',
+    float: 'center',
+    backgroundColor: 'rgba(0,0,0,0)',
+    borderColor: 'rgba(0,0,0,0)',
+    borderWidth: 0,
+    padding: 5,
+    margin: 5,
+    itemGap: 10,
+    fontSize: opts.fontSize,
+    lineHeight: opts.fontSize,
+    fontColor: '#333333',
+    format: {},
+    hiddenColor: '#CECECE'
+  }, opts.legend);
+  opts.legend.borderWidth = opts.legend.borderWidth * opts.pixelRatio;
+  opts.legend.itemGap = opts.legend.itemGap * opts.pixelRatio;
+  opts.legend.padding = opts.legend.padding * opts.pixelRatio;
+  opts.legend.margin = opts.legend.margin * opts.pixelRatio;
+  opts.extra = assign({}, opts.extra);
+  opts.rotate = opts.rotate ? true : false;
+  opts.animation = opts.animation ? true : false;
+	opts.rotate = opts.rotate ? true : false;
+
+  let config$$1 = JSON.parse(JSON.stringify(config));
+  config$$1.colors = opts.colors ? opts.colors : config$$1.colors;
+  config$$1.yAxisTitleWidth = opts.yAxis.disabled !== true && opts.yAxis.title ? config$$1.yAxisTitleWidth : 0;
+  if (opts.type == 'pie' || opts.type == 'ring') {
+    config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio;
+  }
+  if (opts.type == 'rose') {
+    config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio;
+  }
+  config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pixelRatio;
+  config$$1.yAxisSplit = opts.yAxis.splitNumber ? opts.yAxis.splitNumber : config.yAxisSplit;
+
+  //屏幕旋转
+  config$$1.rotate = opts.rotate;
+  if (opts.rotate) {
+    let tempWidth = opts.width;
+    let tempHeight = opts.height;
+    opts.width = tempHeight;
+    opts.height = tempWidth;
+  }
+
+  //适配高分屏
+  opts.padding = opts.padding ? opts.padding : config$$1.padding;
+  for (let i = 0; i < 4; i++) {
+    opts.padding[i] *= opts.pixelRatio;
+  }
+  config$$1.yAxisWidth = config.yAxisWidth * opts.pixelRatio;
+  config$$1.xAxisHeight = config.xAxisHeight * opts.pixelRatio;
+  if (opts.enableScroll && opts.xAxis.scrollShow) {
+    config$$1.xAxisHeight += 6 * opts.pixelRatio;
+  }
+  config$$1.xAxisLineHeight = config.xAxisLineHeight * opts.pixelRatio;
+  config$$1.fontSize = opts.fontSize;
+  config$$1.titleFontSize = config.titleFontSize * opts.pixelRatio;
+  config$$1.subtitleFontSize = config.subtitleFontSize * opts.pixelRatio;
+  config$$1.toolTipPadding = config.toolTipPadding * opts.pixelRatio;
+  config$$1.toolTipLineHeight = config.toolTipLineHeight * opts.pixelRatio;
+  config$$1.columePadding = config.columePadding * opts.pixelRatio;
+  opts.$this = opts.$this ? opts.$this : this;
+  
+  this.context = uni.createCanvasContext(opts.canvasId, opts.$this);
+  /* 兼容原生H5
+  this.context = document.getElementById(opts.canvasId).getContext("2d");
+  this.context.setStrokeStyle = function(e){ return this.strokeStyle=e; }
+  this.context.setLineWidth = function(e){ return this.lineWidth=e; }
+  this.context.setLineCap = function(e){ return this.lineCap=e; }
+  this.context.setFontSize = function(e){ return this.font=e+"px sans-serif"; }
+  this.context.setFillStyle = function(e){ return this.fillStyle=e; }
+  this.context.draw = function(){ }
+  */
+
+  opts.chartData = {};
+  this.event = new Event();
+  this.scrollOption = {
+    currentOffset: 0,
+    startTouchX: 0,
+    distance: 0,
+    lastMoveTime: 0
+  };
+
+  this.opts = opts;
+  this.config = config$$1;
+
+  drawCharts.call(this, opts.type, opts, config$$1, this.context);
+};
+
+Charts.prototype.updateData = function() {
+  let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+  this.opts = assign({}, this.opts, data);
+  this.opts.updateData = true;
+  let scrollPosition = data.scrollPosition || 'current';
+  switch (scrollPosition) {
+    case 'current':
+      this.opts._scrollDistance_ = this.scrollOption.currentOffset;
+      break;
+    case 'left':
+      this.opts._scrollDistance_ = 0;
+      this.scrollOption = {
+        currentOffset: 0,
+        startTouchX: 0,
+        distance: 0,
+        lastMoveTime: 0
+      };
+      break;
+    case 'right':
+      let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config),
+        yAxisWidth = _calYAxisData.yAxisWidth;
+      this.config.yAxisWidth = yAxisWidth;
+      let offsetLeft = 0;
+      let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+        xAxisPoints = _getXAxisPoints0.xAxisPoints,
+        startX = _getXAxisPoints0.startX,
+        endX = _getXAxisPoints0.endX,
+        eachSpacing = _getXAxisPoints0.eachSpacing;
+      let totalWidth = eachSpacing * (xAxisPoints.length - 1);
+      let screenWidth = endX - startX;
+      offsetLeft = screenWidth - totalWidth;
+      this.scrollOption = {
+        currentOffset: offsetLeft,
+        startTouchX: offsetLeft,
+        distance: 0,
+        lastMoveTime: 0
+      };
+      this.opts._scrollDistance_ = offsetLeft;
+      break;
+  }
+  drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+};
+
+Charts.prototype.zoom = function() {
+  var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount;
+  if (this.opts.enableScroll !== true) {
+    console.log('请启用滚动条后使用!')
+    return;
+  }
+  //当前屏幕中间点
+  let centerPoint = Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round(
+    this.opts.xAxis.itemCount / 2);
+  this.opts.animation = false;
+  this.opts.xAxis.itemCount = val.itemCount;
+  //重新计算x轴偏移距离
+  let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config),
+    yAxisWidth = _calYAxisData.yAxisWidth;
+  this.config.yAxisWidth = yAxisWidth;
+  let offsetLeft = 0;
+  let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config),
+    xAxisPoints = _getXAxisPoints0.xAxisPoints,
+    startX = _getXAxisPoints0.startX,
+    endX = _getXAxisPoints0.endX,
+    eachSpacing = _getXAxisPoints0.eachSpacing;
+  let centerLeft = eachSpacing * centerPoint;
+  let screenWidth = endX - startX;
+  let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1);
+  offsetLeft = screenWidth / 2 - centerLeft;
+  if (offsetLeft > 0) {
+    offsetLeft = 0;
+  }
+  if (offsetLeft < MaxLeft) {
+    offsetLeft = MaxLeft;
+  }
+  this.scrollOption = {
+    currentOffset: offsetLeft,
+    startTouchX: offsetLeft,
+    distance: 0,
+    lastMoveTime: 0
+  };
+  this.opts._scrollDistance_ = offsetLeft;
+  drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+};
+
+Charts.prototype.stopAnimation = function() {
+  this.animationInstance && this.animationInstance.stop();
+};
+
+Charts.prototype.addEventListener = function(type, listener) {
+  this.event.addEventListener(type, listener);
+};
+
+Charts.prototype.getCurrentDataIndex = function(e) {
+  var touches = null;
+  if (e.changedTouches) {
+    touches = e.changedTouches[0];
+  } else {
+    touches = e.mp.changedTouches[0];
+  }
+  if (touches) {
+    let _touches$ = getTouches(touches, this.opts, e);
+    if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose') {
+      return findPieChartCurrentIndex({
+        x: _touches$.x,
+        y: _touches$.y
+      }, this.opts.chartData.pieData);
+    } else if (this.opts.type === 'radar') {
+      return findRadarChartCurrentIndex({
+        x: _touches$.x,
+        y: _touches$.y
+      }, this.opts.chartData.radarData, this.opts.categories.length);
+    } else if (this.opts.type === 'funnel') {
+      return findFunnelChartCurrentIndex({
+        x: _touches$.x,
+        y: _touches$.y
+      }, this.opts.chartData.funnelData);
+    } else if (this.opts.type === 'map') {
+      return findMapChartCurrentIndex({
+        x: _touches$.x,
+        y: _touches$.y
+      }, this.opts);
+    }else if (this.opts.type === 'word') {
+      return findWordChartCurrentIndex({
+        x: _touches$.x,
+        y: _touches$.y
+      }, this.opts.chartData.wordCloudData);
+    } else {
+      return findCurrentIndex({
+        x: _touches$.x,
+        y: _touches$.y
+      }, this.opts.chartData.calPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset));
+    }
+  }
+  return -1;
+};
+
+Charts.prototype.getLegendDataIndex = function(e) {
+  var touches = null;
+  if (e.changedTouches) {
+    touches = e.changedTouches[0];
+  } else {
+    touches = e.mp.changedTouches[0];
+  }
+  if (touches) {
+    let _touches$ = getTouches(touches, this.opts, e);
+    return findLegendIndex({
+      x: _touches$.x,
+      y: _touches$.y
+    }, this.opts.chartData.legendData);
+  }
+  return -1;
+};
+
+Charts.prototype.touchLegend = function(e) {
+  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+  var touches = null;
+  if (e.changedTouches) {
+    touches = e.changedTouches[0];
+  } else {
+    touches = e.mp.changedTouches[0];
+  }
+  if (touches) {
+    var _touches$ = getTouches(touches, this.opts, e);
+    var index = this.getLegendDataIndex(e);
+    if (index >= 0) {
+      this.opts.series[index].show = !this.opts.series[index].show;
+      this.opts.animation = option.animation ? true : false;
+			this.opts._scrollDistance_= this.scrollOption.currentOffset;
+      drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+    }
+  }
+
+};
+
+Charts.prototype.showToolTip = function(e) {
+  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+  var touches = null;
+  if (e.changedTouches) {
+    touches = e.changedTouches[0];
+  } else {
+    touches = e.mp.changedTouches[0];
+  }
+  if (!touches) {
+    console.log("touchError");
+  }
+  var _touches$ = getTouches(touches, this.opts, e);
+  var currentOffset = this.scrollOption.currentOffset;
+  var opts = assign({}, this.opts, {
+    _scrollDistance_: currentOffset,
+    animation: false
+  });
+  if (this.opts.type === 'line' || this.opts.type === 'area' || this.opts.type === 'column') {
+    var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ;
+    if (index > -1) {
+      var seriesData = getSeriesDataItem(this.opts.series, index);
+      if (seriesData.length !== 0) {
+        var _getToolTipData = getToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option),
+          textList = _getToolTipData.textList,
+          offset = _getToolTipData.offset;
+        offset.y = _touches$.y;
+        opts.tooltip = {
+          textList: option.textList?option.textList:textList,
+          offset: offset,
+          option: option,
+          index: index
+        };
+      }
+    }
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+  if (this.opts.type === 'mix') {
+    var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ;
+    if (index > -1) {
+      var currentOffset = this.scrollOption.currentOffset;
+      var opts = assign({}, this.opts, {
+        _scrollDistance_: currentOffset,
+        animation: false
+      });
+      var seriesData = getSeriesDataItem(this.opts.series, index);
+      if (seriesData.length !== 0) {
+        var _getMixToolTipData = getMixToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option),
+          textList = _getMixToolTipData.textList,
+          offset = _getMixToolTipData.offset;
+        offset.y = _touches$.y;
+        opts.tooltip = {
+          textList: option.textList?option.textList:textList,
+          offset: offset,
+          option: option,
+          index: index
+        };
+      }
+    }
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+  if (this.opts.type === 'candle') {
+    var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ;
+    if (index > -1) {
+      var currentOffset = this.scrollOption.currentOffset;
+      var opts = assign({}, this.opts, {
+        _scrollDistance_: currentOffset,
+        animation: false
+      });
+      var seriesData = getSeriesDataItem(this.opts.series, index);
+      if (seriesData.length !== 0) {
+        var _getToolTipData = getCandleToolTipData(this.opts.series[0].data, seriesData, this.opts.chartData.calPoints,
+            index, this.opts.categories, this.opts.extra.candle, option),
+          textList = _getToolTipData.textList,
+          offset = _getToolTipData.offset;
+        offset.y = _touches$.y;
+        opts.tooltip = {
+          textList: option.textList?option.textList:textList,
+          offset: offset,
+          option: option,
+          index: index
+        };
+      }
+    }
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+  if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose'||this.opts.type === 'funnel' ) {
+    var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ;
+    if (index > -1) {
+      var currentOffset = this.scrollOption.currentOffset;
+      var opts = assign({}, this.opts, {
+        _scrollDistance_: currentOffset,
+        animation: false
+      });
+      var seriesData = this.opts._series_[index];
+      var textList = [{
+        text: option.format ? option.format(seriesData) : seriesData.name + ': ' + seriesData.data,
+        color: seriesData.color
+      }];
+      var offset = {
+        x: _touches$.x,
+        y: _touches$.y
+      };
+      opts.tooltip = {
+        textList: option.textList?option.textList:textList,
+        offset: offset,
+        option: option,
+        index: index
+      };
+    }
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+  if (this.opts.type === 'map'||this.opts.type === 'word') {
+    var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ;
+    if (index > -1) {
+      var currentOffset = this.scrollOption.currentOffset;
+      var opts = assign({}, this.opts, {
+        _scrollDistance_: currentOffset,
+        animation: false
+      });
+      var seriesData = this.opts._series_[index];
+      var textList = [{
+        text: option.format ? option.format(seriesData) : seriesData.properties.name ,
+        color: seriesData.color
+      }];
+      var offset = {
+        x: _touches$.x,
+        y: _touches$.y
+      };
+      opts.tooltip = {
+        textList: option.textList?option.textList:textList,
+        offset: offset,
+        option: option,
+        index: index
+      };
+    }
+    opts.updateData = false;
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+  if (this.opts.type === 'radar') {
+    var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ;
+    if (index > -1) {
+      var currentOffset = this.scrollOption.currentOffset;
+      var opts = assign({}, this.opts, {
+        _scrollDistance_: currentOffset,
+        animation: false
+      });
+      var seriesData = getSeriesDataItem(this.opts.series, index);
+      if (seriesData.length !== 0) {
+        var textList = seriesData.map(function(item) {
+          return {
+            text: option.format ? option.format(item) : item.name + ': ' + item.data,
+            color: item.color
+          };
+        });
+        var offset = {
+          x: _touches$.x,
+          y: _touches$.y
+        };
+        opts.tooltip = {
+          textList: option.textList?option.textList:textList,
+          offset: offset,
+          option: option,
+          index: index
+        };
+      }
+    }
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+  }
+};
+
+Charts.prototype.translate = function(distance) {
+  this.scrollOption = {
+    currentOffset: distance,
+    startTouchX: distance,
+    distance: 0,
+    lastMoveTime: 0
+  };
+  let opts = assign({}, this.opts, {
+    _scrollDistance_: distance,
+    animation: false
+  });
+  drawCharts.call(this, this.opts.type, opts, this.config, this.context);
+};
+
+Charts.prototype.scrollStart = function(e) {
+  var touches = null;
+  if (e.changedTouches) {
+    touches = e.changedTouches[0];
+  } else {
+    touches = e.mp.changedTouches[0];
+  }
+  var _touches$ = getTouches(touches, this.opts, e);
+  if (touches && this.opts.enableScroll === true) {
+    this.scrollOption.startTouchX = _touches$.x;
+  }
+};
+
+Charts.prototype.scroll = function(e) {
+  if (this.scrollOption.lastMoveTime === 0) {
+    this.scrollOption.lastMoveTime = Date.now();
+  }
+  let Limit = this.opts.extra.touchMoveLimit || 20;
+  let currMoveTime = Date.now();
+  let duration = currMoveTime - this.scrollOption.lastMoveTime;
+  if (duration < Math.floor(1000 / Limit)) return;
+  this.scrollOption.lastMoveTime = currMoveTime;
+  var touches = null;
+  if (e.changedTouches) {
+    touches = e.changedTouches[0];
+  } else {
+    touches = e.mp.changedTouches[0];
+  }
+  if (touches && this.opts.enableScroll === true) {
+    var _touches$ = getTouches(touches, this.opts, e);
+    var _distance;
+    _distance = _touches$.x - this.scrollOption.startTouchX;
+    var currentOffset = this.scrollOption.currentOffset;
+    var validDistance = calValidDistance(this,currentOffset + _distance, this.opts.chartData, this.config, this.opts);
+    this.scrollOption.distance = _distance = validDistance - currentOffset;
+    var opts = assign({}, this.opts, {
+      _scrollDistance_: currentOffset + _distance,
+      animation: false
+    });
+    drawCharts.call(this, opts.type, opts, this.config, this.context);
+    return currentOffset + _distance;
+  }
+};
+
+Charts.prototype.scrollEnd = function(e) {
+  if (this.opts.enableScroll === true) {
+    var _scrollOption = this.scrollOption,
+      currentOffset = _scrollOption.currentOffset,
+      distance = _scrollOption.distance;
+    this.scrollOption.currentOffset = currentOffset + distance;
+    this.scrollOption.distance = 0;
+  }
+};
+if (typeof module === "object" && typeof module.exports === "object") {
+  module.exports = Charts;
+  //export default Charts;//建议使用nodejs的module导出方式,如报错请使用export方式导出
+}

File diff suppressed because it is too large
+ 0 - 0
components/ucharts/ucharts.min.js


+ 546 - 0
components/uni-calendar/calendar.js

@@ -0,0 +1,546 @@
+/**
+* @1900-2100区间内的公历、农历互转
+* @charset UTF-8
+* @github  https://github.com/jjonline/calendar.js
+* @Author  Jea杨(JJonline@JJonline.Cn)
+* @Time    2014-7-21
+* @Time    2016-8-13 Fixed 2033hex、Attribution Annals
+* @Time    2016-9-25 Fixed lunar LeapMonth Param Bug
+* @Time    2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+* @Version 1.0.3
+* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+*/
+/* eslint-disable */
+var calendar = {
+
+  /**
+      * 农历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, 0x05ac0, 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 = calendar.lYearDays(1987) ;//count=387
+      */
+  lYearDays: function (y) {
+    var i; var 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 = calendar.leapMonth(1987) ;//leapMonth=6
+      */
+  leapMonth: function (y) { // 闰字编码 \u95f0
+    return (this.lunarInfo[y - 1900] & 0xf)
+  },
+
+  /**
+      * 返回农历y年闰月的天数 若该年没有闰月则返回0
+      * @param lunar Year
+      * @return Number (0、29、30)
+      * @eg:var leapMonthDay = calendar.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 (-1、29、30)
+      * @eg:var MonthDay = calendar.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 (-1、28、29、30、31)
+      * @eg:var solarMonthDay = calendar.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 = calendar.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 = calendar.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 = calendar.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 = calendar.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(calendar.solar2lunar(1987,11,01));
+      */
+  solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
+    // 年份限定、上限
+    if (y < 1900 || y > 2100) {
+      return -1// undefined转换为数字变为NaN
+    }
+    // 公历传参最下限
+    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; var leap = 0; var temp = 0
+    // 修正ymd参数
+    var y = objDate.getFullYear()
+    var m = objDate.getMonth() + 1
+    var 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()
+    var isToday = false
+    if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+      isToday = true
+    }
+    // 星期几
+    var nWeek = objDate.getDay()
+    var 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)
+
+    // 当月的两个节气
+    // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+    var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
+    var secondNode = this.getTerm(y, (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(calendar.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; var 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)
+  }
+}
+
+export default calendar

+ 152 - 0
components/uni-calendar/uni-calendar-item.vue

@@ -0,0 +1,152 @@
+<template>
+	<view class="uni-calendar-item__weeks-box" :class="{
+		'uni-calendar-item--disable':weeks.disable,
+		'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+		'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
+		'uni-calendar-item--multiple': weeks.multiple
+		}"
+	 @click="choiceDate(weeks)">
+		<view class="uni-calendar-item__weeks-box-item">
+			<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
+			<text class="uni-calendar-item__weeks-box-text" :class="{
+				'uni-calendar-item--isDay-text': weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.date}}</text>
+			<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--multiple': weeks.multiple,
+				}">今天</text>
+			<text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.isDay?'今天': (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
+			<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--extra':weeks.extraInfo.info,
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.extraInfo.info}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			weeks: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			calendar: {
+				type: Object,
+				default: () => {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			lunar: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			choiceDate(weeks) {
+				this.$emit('change', weeks)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-calendar-item__weeks-box {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-calendar-item__weeks-box-text {
+		font-size: $uni-font-size-base;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar-item__weeks-lunar-text {
+		font-size: $uni-font-size-sm;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar-item__weeks-box-item {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 100rpx;
+		height: 100rpx;
+	}
+
+	.uni-calendar-item__weeks-box-circle {
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		width: 8px;
+		height: 8px;
+		border-radius: 8px;
+		background-color: $uni-color-error;
+
+	}
+
+	.uni-calendar-item--disable {
+		background-color: rgba(249, 249, 249, $uni-opacity-disabled);
+		color: $uni-text-color-disable;
+	}
+
+	.uni-calendar-item--isDay-text {
+		color: $uni-color-primary;
+	}
+
+	.uni-calendar-item--isDay {
+		background-color: $uni-color-primary;
+		opacity: 0.8;
+		color: #fff;
+	}
+
+	.uni-calendar-item--extra {
+		color: $uni-color-error;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item--checked {
+		background-color: $uni-color-primary;
+		color: #fff;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item--multiple {
+		background-color: $uni-color-primary;
+		color: #fff;
+		opacity: 0.8;
+	}
+</style>

+ 434 - 0
components/uni-calendar/uni-calendar.vue

@@ -0,0 +1,434 @@
+<template>
+	<view class="uni-calendar" @touchmove.stop.prevent="clean">
+		<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view>
+		<view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
+			<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
+				<view class="uni-calendar__header-btn-box" @click="close">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width">取消</text>
+				</view>
+				<view class="uni-calendar__header-btn-box" @click="confirm">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width">确定</text>
+				</view>
+			</view>
+			<view class="uni-calendar__header">
+				<view class="uni-calendar__header-btn-box" @click="pre">
+					<view class="uni-calendar__header-btn uni-calendar--left"></view>
+				</view>
+				<text class="uni-calendar__header-text">{{ (nowDate.year||'') +'年'+( nowDate.month||'') +'月'}}</text>
+				<view class="uni-calendar__header-btn-box" @click="next">
+					<view class="uni-calendar__header-btn uni-calendar--right"></view>
+				</view>
+				<text class="uni-calendar__backtoday" @click="backtoday">回到今天</text>
+			</view>
+			<view class="uni-calendar__box">
+				<view v-if="showMonth" class="uni-calendar__box-bg">
+					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
+				</view>
+				<view class="uni-calendar__weeks">
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">日</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">一</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">二</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">三</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">四</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">五</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">六</text>
+					</view>
+				</view>
+				<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
+					<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
+						<uni-calendar-item :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></uni-calendar-item>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Calendar from './util.js';
+	import uniCalendarItem from './uni-calendar-item.vue'
+	export default {
+		components: {
+			uniCalendarItem
+		},
+		props: {
+			/**
+			 * 当前日期
+			 */
+			date: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 打点日期
+			 */
+			selected: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			/**
+			 * 是否开启阴历日期
+			 */
+			lunar: {
+				type: Boolean,
+				default: false
+			},
+			/**
+			 * 开始时间
+			 */
+			startDate: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 结束时间
+			 */
+			endDate: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * 范围
+			 */
+			range: {
+				type: Boolean,
+				default: false
+			},
+			/**
+			 * 插入
+			 */
+			insert: {
+				type: Boolean,
+				default: true
+			},
+			/**
+			 * 是否显示月份背景
+			 */
+			showMonth: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				show: false,
+				weeks: [],
+				calendar: {},
+				nowDate: '',
+				aniMaskShow: false
+			}
+		},
+		watch: {
+			selected(newVal) {
+				this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
+				this.weeks = this.cale.weeks
+			}
+		},
+		created() {
+			// 获取日历方法实例
+			this.cale = new Calendar({
+				date: this.date,
+				selected: this.selected,
+				startDate: this.startDate,
+				endDate: this.endDate,
+				range: this.range,
+			})
+			this.init(this.cale.date.fullDate)
+		},
+		methods: {
+			// 取消穿透
+			clean() {},
+			init(date) {
+				this.weeks = this.cale.weeks
+				this.nowDate = this.calendar = this.cale.getInfo(date)
+			},
+			open() {
+				this.show = true
+				this.$nextTick(() => {
+					setTimeout(()=>{
+						this.aniMaskShow = true
+					},50)
+				})
+			},
+			close() {
+				this.aniMaskShow = false
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false
+					}, 300)
+				})
+			},
+			confirm() {
+				this.setEmit('confirm')
+				this.close()
+			},
+			change() {
+				if (!this.insert) return
+				this.setEmit('change')
+			},
+			monthSwitch() {
+				let {
+					year,
+					month
+				} = this.nowDate
+				this.$emit('monthSwitch', {
+					year,
+					month: Number(month)
+				})
+			},
+			setEmit(name) {
+				let {
+					year,
+					month,
+					date,
+					fullDate,
+					lunar,
+					extraInfo
+				} = this.calendar
+				this.$emit(name, {
+					range: this.cale.multipleStatus,
+					year,
+					month,
+					date,
+					fulldate: fullDate,
+					lunar,
+					extraInfo: extraInfo || {}
+				})
+			},
+			choiceDate(weeks) {
+				if (weeks.disable) return
+				this.calendar = weeks
+				// 设置多选
+				this.cale.setMultiple(this.calendar.fullDate)
+				this.weeks = this.cale.weeks
+				this.change()
+			},
+			backtoday() {
+				this.cale.setDate(this.date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.calendar = this.cale.getInfo(this.date)
+				this.change()
+			},
+			pre() {
+				const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
+				this.setDate(preDate)
+				this.monthSwitch()
+
+			},
+			next() {
+				const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
+				this.setDate(nextDate)
+				this.monthSwitch()
+			},
+			setDate(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-calendar {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-calendar__mask {
+		position: fixed;
+		bottom: 0;
+		top: 0;
+		left: 0;
+		right: 0;
+		background-color: $uni-bg-color-mask;
+		transition-property: opacity;
+		transition-duration: 0.3s;
+		opacity: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--mask-show {
+		opacity: 1
+	}
+
+	.uni-calendar--fixed {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		transition-property: transform;
+		transition-duration: 0.3s;
+		transform: translateY(460px);
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--ani-show {
+		transform: translateY(0);
+	}
+
+	.uni-calendar__content {
+		background-color: #fff;
+	}
+
+	.uni-calendar__header {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 50px;
+		border-bottom-color: $uni-border-color;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar--fixed-top {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--fixed-width {
+		width: 50px;
+		// padding: 0 15px;
+	}
+
+	.uni-calendar__backtoday {
+		position: absolute;
+		right: 0;
+		top: 25rpx;
+		padding: 0 5px;
+		padding-left: 10px;
+		height: 25px;
+		line-height: 25px;
+		font-size: 12px;
+		border-top-left-radius: 25px;
+		border-bottom-left-radius: 25px;
+		color: $uni-text-color;
+		background-color: $uni-bg-color-hover;
+	}
+
+	.uni-calendar__header-text {
+		text-align: center;
+		width: 100px;
+		font-size: $uni-font-size-base;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar__header-btn-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 50px;
+		height: 50px;
+	}
+
+	.uni-calendar__header-btn {
+		width: 10px;
+		height: 10px;
+		border-left-color: $uni-text-color-placeholder;
+		border-left-style: solid;
+		border-left-width: 2px;
+		border-top-color: $uni-color-subtitle;
+		border-top-style: solid;
+		border-top-width: 2px;
+	}
+
+	.uni-calendar--left {
+		transform: rotate(-45deg);
+	}
+
+	.uni-calendar--right {
+		transform: rotate(135deg);
+	}
+
+
+	.uni-calendar__weeks {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-calendar__weeks-item {
+		flex: 1;
+	}
+
+	.uni-calendar__weeks-day {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		height: 45px;
+		border-bottom-color: #F5F5F5;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+	.uni-calendar__weeks-day-text {
+		font-size: 14px;
+	}
+
+	.uni-calendar__box {
+		position: relative;
+	}
+
+	.uni-calendar__box-bg {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+
+	.uni-calendar__box-bg-text {
+		font-size: 200px;
+		font-weight: bold;
+		color: $uni-text-color-grey;
+		opacity: 0.1;
+		text-align: center;
+		/* #ifndef APP-NVUE */
+		line-height: 1;
+		/* #endif */
+	}
+</style>

+ 327 - 0
components/uni-calendar/util.js

@@ -0,0 +1,327 @@
+import CALENDAR from './calendar.js'
+
+class Calendar {
+	constructor({
+		date,
+		selected,
+		startDate,
+		endDate,
+		range
+	} = {}) {
+		// 当前日期
+		this.date = this.getDate(date) // 当前初入日期
+		// 打点信息
+		this.selected = selected || [];
+		// 范围开始
+		this.startDate = startDate
+		// 范围结束
+		this.endDate = endDate
+		this.range = range
+		// 多选状态
+		this.multipleStatus = {
+			before: '',
+			after: '',
+			data: []
+		}
+		// 每周日期
+		this.weeks = {}
+
+		this._getWeek(this.date.fullDate)
+	}
+
+	/**
+	 * 获取任意时间
+	 */
+	getDate(date, AddDayCount = 0, str = 'day') {
+		if (!date) {
+			date = new Date()
+		}
+		if (typeof date !== 'object') {
+			date = date.replace(/-/g, '/')
+		}
+		const dd = new Date(date)
+		switch (str) {
+			case 'day':
+				dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
+				break
+			case 'month':
+				if (dd.getDate() === 31) {
+					dd.setDate(dd.getDate() + AddDayCount)
+				} else {
+					dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
+				}
+				break
+			case 'year':
+				dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
+				break
+		}
+		const y = dd.getFullYear()
+		const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
+		const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
+		return {
+			fullDate: y + '-' + m + '-' + d,
+			year: y,
+			month: m,
+			date: d,
+			day: dd.getDay()
+		}
+	}
+
+
+	/**
+	 * 获取上月剩余天数
+	 */
+	_getLastMonthDays(firstDay, full) {
+		let dateArr = []
+		for (let i = firstDay; i > 0; i--) {
+			const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
+			dateArr.push({
+				date: beforeDate,
+				month: full.month - 1,
+				lunar: this.getlunar(full.year, full.month - 1, beforeDate),
+				disable: true
+			})
+		}
+		return dateArr
+	}
+	/**
+	 * 获取本月天数
+	 */
+	_currentMonthDys(dateData, full) {
+		let dateArr = []
+		let fullDate = this.date.fullDate
+		for (let i = 1; i <= dateData; i++) {
+			let isinfo = false
+			let nowDate = full.year + '-' + (full.month < 10 ?
+				full.month : full.month) + '-' + (i < 10 ?
+				'0' + i : i)
+			// 是否今天
+			let isDay = fullDate === nowDate
+			// 获取打点信息
+			let info = this.selected && this.selected.find((item) => {
+				if (this.dateEqual(nowDate, item.date)) {
+					return item
+				}
+			})
+
+			// 日期禁用
+			let disableBefore = true
+			let disableAfter = true
+			if (this.startDate) {
+				let dateCompBefore = this.dateCompare(this.startDate, fullDate)
+				disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
+			}
+
+			if (this.endDate) {
+				let dateCompAfter = this.dateCompare(fullDate, this.endDate)
+				disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
+			}
+
+			let multiples = this.multipleStatus.data
+			let checked = false
+			let multiplesStatus = -1
+			if (this.range) {
+				if (multiples) {
+					multiplesStatus = multiples.findIndex((item) => {
+						return this.dateEqual(item, nowDate)
+					})
+				}
+				if (multiplesStatus !== -1) {
+					checked = true
+				}
+			}
+
+			let data = {
+				fullDate: nowDate,
+				year: full.year,
+				date: i,
+				multiple: this.range ? checked : false,
+				month: full.month,
+				lunar: this.getlunar(full.year, full.month, i),
+				disable: !disableBefore || !disableAfter,
+				isDay
+			}
+			if (info) {
+				data.extraInfo = info
+			}
+
+			dateArr.push(data)
+		}
+		return dateArr
+	}
+	/**
+	 * 获取下月天数
+	 */
+	_getNextMonthDays(surplus, full) {
+		let dateArr = []
+		for (let i = 1; i < surplus + 1; i++) {
+			dateArr.push({
+				date: i,
+				month: Number(full.month) + 1,
+				lunar: this.getlunar(full.year, Number(full.month) + 1, i),
+				disable: true
+			})
+		}
+		return dateArr
+	}
+	/**
+	 * 设置日期
+	 * @param {Object} date
+	 */
+	setDate(date) {
+		this._getWeek(date)
+	}
+	/**
+	 * 获取当前日期详情
+	 * @param {Object} date
+	 */
+	getInfo(date) {
+		if (!date) {
+			date = new Date()
+		}
+		const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
+		return dateInfo
+	}
+
+	/**
+	 * 比较时间大小
+	 */
+	dateCompare(startDate, endDate) {
+		// 计算截止时间
+		startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+		// 计算详细项的截止时间
+		endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+		if (startDate <= endDate) {
+			return true
+		} else {
+			return false
+		}
+	}
+
+	/**
+	 * 比较时间是否相等
+	 */
+	dateEqual(before, after) {
+		// 计算截止时间
+		before = new Date(before.replace('-', '/').replace('-', '/'))
+		// 计算详细项的截止时间
+		after = new Date(after.replace('-', '/').replace('-', '/'))
+		if (before.getTime() - after.getTime() === 0) {
+			return true
+		} else {
+			return false
+		}
+	}
+
+
+	/**
+	 * 获取日期范围内所有日期
+	 * @param {Object} begin
+	 * @param {Object} end
+	 */
+	geDateAll(begin, end) {
+		var arr = []
+		var ab = begin.split('-')
+		var ae = end.split('-')
+		var db = new Date()
+		db.setFullYear(ab[0], ab[1] - 1, ab[2])
+		var de = new Date()
+		de.setFullYear(ae[0], ae[1] - 1, ae[2])
+		var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+		var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+		for (var k = unixDb; k <= unixDe;) {
+			k = k + 24 * 60 * 60 * 1000
+			arr.push(this.getDate(new Date(parseInt(k))).fullDate)
+		}
+		return arr
+	}
+	/**
+	 * 计算阴历日期显示
+	 */
+	getlunar(year, month, date) {
+		return CALENDAR.solar2lunar(year, month, date)
+	}
+	/**
+	 * 设置打点
+	 */
+	setSelectInfo(data, value) {
+		this.selected = value
+		this._getWeek(data)
+	}
+
+	/**
+	 *  获取多选状态
+	 */
+	setMultiple(fullDate) {
+		let {
+			before,
+			after
+		} = this.multipleStatus
+		if (!this.range) return
+		if (before && after) {
+			this.multipleStatus.before = ''
+			this.multipleStatus.after = ''
+			this.multipleStatus.data = []
+			this._getWeek(fullDate)
+		} else {
+			if (!before) {
+				this.multipleStatus.before = fullDate
+			} else {
+				this.multipleStatus.after = fullDate
+				if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+				} else {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+				}
+				this._getWeek(fullDate)
+			}
+		}
+	}
+
+	/**
+	 * 获取每周数据
+	 * @param {Object} dateData
+	 */
+	_getWeek(dateData) {
+		const {
+			fullDate,
+			year,
+			month,
+			date,
+			day
+		} = this.getDate(dateData)
+		let firstDay = new Date(year, month - 1, 1).getDay()
+		let currentDay = new Date(year, month, 0).getDate()
+		let dates = {
+			lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
+			currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
+			nextMonthDays: [], // 下个月开始几天
+			weeks: []
+		}
+		let canlender = []
+		const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
+		dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
+		canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
+		let weeks = {}
+		// 拼接数组  上个月开始几天 + 本月天数+ 下个月开始几天
+		for (let i = 0; i < canlender.length; i++) {
+			if (i % 7 === 0) {
+				weeks[parseInt(i / 7)] = new Array(7)
+			}
+			weeks[parseInt(i / 7)][i % 7] = canlender[i]
+		}
+		this.canlender = canlender
+		this.weeks = weeks
+	}
+
+	//静态方法
+	// static init(date) {
+	// 	if (!this.instance) {
+	// 		this.instance = new Calendar(date);
+	// 	}
+	// 	return this.instance;
+	// }
+}
+
+
+export default Calendar

+ 133 - 0
components/userEvaluation/index.vue

@@ -0,0 +1,133 @@
+<template>
+	<view class="evaluateWtapper">
+		<view class="evaluateItem" v-for="(item, indexw) in reply" :key="indexw">
+			<view class="pic-text acea-row row-middle">
+				<view class="pictrue">
+					<image :src="item.avatar"></image>
+				</view>
+				<view class="acea-row row-middle">
+					<view class="name line1">{{ item.nickname }}</view>
+					<view class="start" :class="'star' + item.star"></view>
+				</view>
+			</view>
+			<view class="time">{{ item.add_time }} {{ item.suk }}</view>
+			<view class="evaluate-infor">{{ item.comment }}</view>
+			<view class="imgList acea-row">
+				<view class="pictrue" v-for="(itemn, indexn) in item.pics" :key="indexn">
+					<image :src="itemn" class="image" @click='getpreviewImage(indexw, indexn)'></image>
+				</view>
+			</view>
+			<view class="reply" v-if="item.merchant_reply_content">
+				<text class="font-color">店小二</text>:{{
+          item.merchant_reply_content
+        }}
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		props: {
+			reply: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data: function() {
+			return {};
+		},
+		methods: {
+			getpreviewImage: function(indexw, indexn) {
+				uni.previewImage({
+					urls: this.reply[indexw].pics,
+					current: this.reply[indexw].pics[indexn]
+				});
+			}
+		}
+	}
+</script>
+<style scoped lang='scss'>
+	.evaluateWtapper .evaluateItem {
+		background-color: #fff;
+		padding-bottom: 25rpx;
+	}
+
+	.evaluateWtapper .evaluateItem~.evaluateItem {
+		border-top: 1rpx solid #f5f5f5;
+	}
+
+	.evaluateWtapper .evaluateItem .pic-text {
+		font-size: 26rpx;
+		color: #282828;
+		height: 95rpx;
+		padding: 0 30rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .pic-text .pictrue {
+		width: 56rpx;
+		height: 56rpx;
+		margin-right: 20rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .pic-text .pictrue image {
+		width: 100%;
+		height: 100%;
+		border-radius: 50%;
+	}
+
+	.evaluateWtapper .evaluateItem .pic-text .name {
+		max-width: 450rpx;
+		margin-right: 15rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .time {
+		font-size: 24rpx;
+		color: #82848f;
+		padding: 0 30rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .evaluate-infor {
+		font-size: 28rpx;
+		color: #282828;
+		margin-top: 19rpx;
+		padding: 0 30rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .imgList {
+		padding: 0 30rpx 0 15rpx;
+		margin-top: 25rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .imgList .pictrue {
+		width: 156rpx;
+		height: 156rpx;
+		margin: 0 0 15rpx 15rpx;
+	}
+
+	.evaluateWtapper .evaluateItem .imgList .pictrue image {
+		width: 100%;
+		height: 100%;
+	}
+
+	.evaluateWtapper .evaluateItem .reply {
+		font-size: 26rpx;
+		color: #454545;
+		background-color: #f7f7f7;
+		border-radius: 5rpx;
+		margin: 20rpx 30rpx 0 30rpx;
+		padding: 30rpx;
+		position: relative;
+	}
+
+	.evaluateWtapper .evaluateItem .reply::before {
+		content: "";
+		width: 0;
+		height: 0;
+		border-left: 20rpx solid transparent;
+		border-right: 20rpx solid transparent;
+		border-bottom: 30rpx solid #f7f7f7;
+		position: absolute;
+		top: -30rpx;
+		left: 40rpx;
+	}
+</style>

File diff suppressed because it is too large
+ 9 - 0
components/vconsole.min.js


+ 12542 - 0
components/wPicker/city-data/area.js

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

+ 1503 - 0
components/wPicker/city-data/city.js

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

+ 139 - 0
components/wPicker/city-data/province.js

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

+ 681 - 0
components/wPicker/w-picker.js

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

+ 1139 - 0
components/wPicker/w-picker.vue

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

+ 19 - 0
config/app.js

@@ -0,0 +1,19 @@
+module.exports = {
+	// 请求域名 格式: https://您的域名
+	// #ifdef MP
+	HTTP_REQUEST_URL:'https://api.lipinwawa.com',
+	// #endif
+	
+	
+	// #ifdef H5
+	HTTP_REQUEST_URL: 'https://api.lipinwawa.com',
+	// #endif
+	HEADER:{
+		'content-type': 'application/json',
+		'secret-key': 'b1bd7a4b8da3e47ce58e73b9e5f656c4'
+	},
+	// 回话密钥名称 请勿修改此配置
+	TOKENNAME: 'Authori-zation',
+	// 缓存时间 0 永久
+	EXPIRE:0,
+};

+ 32 - 0
config/cache.js

@@ -0,0 +1,32 @@
+module.exports = {
+	//token
+	LOGIN_STATUS: 'LOGIN_STATUS_TOKEN',
+	// uid
+	UID:'UID',
+	//�û�
+	USER_INFO: 'USER_INFO',
+	//token�����¼�
+	EXPIRES_TIME: 'EXPIRES_TIME',
+	//�Ƿ���Ȩ
+	WX_AUTH: 'WX_AUTH',
+	//���ں���Ȩcode
+	STATE_KEY: 'wx_authorize_state',
+	//�û�����
+	LOGINTYPE: 'loginType',
+	//���ں���ת����
+	BACK_URL: 'login_back_url',
+	// ����code
+	STATE_R_KEY: 'roution_authorize_state',
+	//��ȨlogoС����
+	LOGO_URL: 'LOGO_URL',
+	//模板缓存
+	SUBSCRIBE_MESSAGE: 'SUBSCRIBE_MESSAGE',
+
+	TIPS_KEY: 'TIPS_KEY',
+
+	SPREAD: 'spread',
+	//缓存经度
+	CACHE_LONGITUDE: 'LONGITUDE',
+	//缓存纬度
+	CACHE_LATITUDE: 'LATITUDE',
+}

+ 8 - 0
config/socket.js

@@ -0,0 +1,8 @@
+module.exports = {
+  // Socket链接 暂不做配置
+  WSS_SERVER_URL:'',
+  // Socket调试模式
+  SERVER_DEBUG:true,
+  // 心跳间隔
+  PINGINTERVAL:3000
+}

+ 911 - 0
libs/CryptoJS.js

@@ -0,0 +1,911 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * CryptoJS core components.
+ */
+var CryptoJS = CryptoJS || (function (Math, undefined) {
+  /**
+   * CryptoJS namespace.
+   */
+  var C = {};
+
+  /**
+   * Library namespace.
+   */
+  var C_lib = C.lib = {};
+
+  /**
+   * Base object for prototypal inheritance.
+   */
+  var Base = C_lib.Base = (function () {
+    function F() { }
+
+    return {
+      /**
+       * Creates a new object that inherits from this object.
+       *
+       * @param {Object} overrides Properties to copy into the new object.
+       *
+       * @return {Object} The new object.
+       *
+       * @static
+       *
+       * @example
+       *
+       *     var MyType = CryptoJS.lib.Base.extend({
+       *         field: 'value',
+       *
+       *         method: function () {
+       *         }
+       *     });
+       */
+      extend: function (overrides) {
+        // Spawn
+        F.prototype = this;
+        var subtype = new F();
+
+        // Augment
+        if (overrides) {
+          subtype.mixIn(overrides);
+        }
+
+        // Create default initializer
+        if (!subtype.hasOwnProperty('init')) {
+          subtype.init = function () {
+            subtype.$super.init.apply(this, arguments);
+          };
+        }
+
+        // Initializer's prototype is the subtype object
+        subtype.init.prototype = subtype;
+
+        // Reference supertype
+        subtype.$super = this;
+
+        return subtype;
+      },
+
+      /**
+       * Extends this object and runs the init method.
+       * Arguments to create() will be passed to init().
+       *
+       * @return {Object} The new object.
+       *
+       * @static
+       *
+       * @example
+       *
+       *     var instance = MyType.create();
+       */
+      create: function () {
+        var instance = this.extend();
+        instance.init.apply(instance, arguments);
+
+        return instance;
+      },
+
+      /**
+       * Initializes a newly created object.
+       * Override this method to add some logic when your objects are created.
+       *
+       * @example
+       *
+       *     var MyType = CryptoJS.lib.Base.extend({
+       *         init: function () {
+       *             // ...
+       *         }
+       *     });
+       */
+      init: function () {
+      },
+
+      /**
+       * Copies properties into this object.
+       *
+       * @param {Object} properties The properties to mix in.
+       *
+       * @example
+       *
+       *     MyType.mixIn({
+       *         field: 'value'
+       *     });
+       */
+      mixIn: function (properties) {
+        for (var propertyName in properties) {
+          if (properties.hasOwnProperty(propertyName)) {
+            this[propertyName] = properties[propertyName];
+          }
+        }
+
+        // IE won't copy toString using the loop above
+        if (properties.hasOwnProperty('toString')) {
+          this.toString = properties.toString;
+        }
+      },
+
+      /**
+       * Creates a copy of this object.
+       *
+       * @return {Object} The clone.
+       *
+       * @example
+       *
+       *     var clone = instance.clone();
+       */
+      clone: function () {
+        return this.init.prototype.extend(this);
+      }
+    };
+  }());
+
+  /**
+   * An array of 32-bit words.
+   *
+   * @property {Array} words The array of 32-bit words.
+   * @property {number} sigBytes The number of significant bytes in this word array.
+   */
+  var WordArray = C_lib.WordArray = Base.extend({
+    /**
+     * Initializes a newly created word array.
+     *
+     * @param {Array} words (Optional) An array of 32-bit words.
+     * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.lib.WordArray.create();
+     *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+     *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+     */
+    init: function (words, sigBytes) {
+      words = this.words = words || [];
+
+      if (sigBytes != undefined) {
+        this.sigBytes = sigBytes;
+      } else {
+        this.sigBytes = words.length * 4;
+      }
+    },
+
+    /**
+     * Converts this word array to a string.
+     *
+     * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+     *
+     * @return {string} The stringified word array.
+     *
+     * @example
+     *
+     *     var string = wordArray + '';
+     *     var string = wordArray.toString();
+     *     var string = wordArray.toString(CryptoJS.enc.Utf8);
+     */
+    toString: function (encoder) {
+      return (encoder || Hex).stringify(this);
+    },
+
+    /**
+     * Concatenates a word array to this word array.
+     *
+     * @param {WordArray} wordArray The word array to append.
+     *
+     * @return {WordArray} This word array.
+     *
+     * @example
+     *
+     *     wordArray1.concat(wordArray2);
+     */
+    concat: function (wordArray) {
+      // Shortcuts
+      var thisWords = this.words;
+      var thatWords = wordArray.words;
+      var thisSigBytes = this.sigBytes;
+      var thatSigBytes = wordArray.sigBytes;
+
+      // Clamp excess bits
+      this.clamp();
+
+      // Concat
+      if (thisSigBytes % 4) {
+        // Copy one byte at a time
+        for (var i = 0; i < thatSigBytes; i++) {
+          var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+          thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+        }
+      } else if (thatWords.length > 0xffff) {
+        // Copy one word at a time
+        for (var i = 0; i < thatSigBytes; i += 4) {
+          thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
+        }
+      } else {
+        // Copy all words at once
+        thisWords.push.apply(thisWords, thatWords);
+      }
+      this.sigBytes += thatSigBytes;
+
+      // Chainable
+      return this;
+    },
+
+    /**
+     * Removes insignificant bits.
+     *
+     * @example
+     *
+     *     wordArray.clamp();
+     */
+    clamp: function () {
+      // Shortcuts
+      var words = this.words;
+      var sigBytes = this.sigBytes;
+
+      // Clamp
+      words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+      words.length = Math.ceil(sigBytes / 4);
+    },
+
+    /**
+     * Creates a copy of this word array.
+     *
+     * @return {WordArray} The clone.
+     *
+     * @example
+     *
+     *     var clone = wordArray.clone();
+     */
+    clone: function () {
+      var clone = Base.clone.call(this);
+      clone.words = this.words.slice(0);
+
+      return clone;
+    },
+
+    /**
+     * Creates a word array filled with random bytes.
+     *
+     * @param {number} nBytes The number of random bytes to generate.
+     *
+     * @return {WordArray} The random word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.lib.WordArray.random(16);
+     */
+    random: function (nBytes) {
+      var words = [];
+      for (var i = 0; i < nBytes; i += 4) {
+        words.push((Math.random() * 0x100000000) | 0);
+      }
+
+      return new WordArray.init(words, nBytes);
+    }
+  });
+
+  /**
+   * Encoder namespace.
+   */
+  var C_enc = C.enc = {};
+
+  /**
+   * Hex encoding strategy.
+   */
+  var Hex = C_enc.Hex = {
+    /**
+     * Converts a word array to a hex string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The hex string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+
+      // Convert
+      var hexChars = [];
+      for (var i = 0; i < sigBytes; i++) {
+        var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+        hexChars.push((bite >>> 4).toString(16));
+        hexChars.push((bite & 0x0f).toString(16));
+      }
+
+      return hexChars.join('');
+    },
+
+    /**
+     * Converts a hex string to a word array.
+     *
+     * @param {string} hexStr The hex string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
+     */
+    parse: function (hexStr) {
+      // Shortcut
+      var hexStrLength = hexStr.length;
+
+      // Convert
+      var words = [];
+      for (var i = 0; i < hexStrLength; i += 2) {
+        words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+      }
+
+      return new WordArray.init(words, hexStrLength / 2);
+    }
+  };
+
+  /**
+   * Latin1 encoding strategy.
+   */
+  var Latin1 = C_enc.Latin1 = {
+    /**
+     * Converts a word array to a Latin1 string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The Latin1 string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      // Shortcuts
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+
+      // Convert
+      var latin1Chars = [];
+      for (var i = 0; i < sigBytes; i++) {
+        var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+        latin1Chars.push(String.fromCharCode(bite));
+      }
+
+      return latin1Chars.join('');
+    },
+
+    /**
+     * Converts a Latin1 string to a word array.
+     *
+     * @param {string} latin1Str The Latin1 string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+     */
+    parse: function (latin1Str) {
+      // Shortcut
+      var latin1StrLength = latin1Str.length;
+
+      // Convert
+      var words = [];
+      for (var i = 0; i < latin1StrLength; i++) {
+        words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+      }
+
+      return new WordArray.init(words, latin1StrLength);
+    }
+  };
+
+  /**
+   * UTF-8 encoding strategy.
+   */
+  var Utf8 = C_enc.Utf8 = {
+    /**
+     * Converts a word array to a UTF-8 string.
+     *
+     * @param {WordArray} wordArray The word array.
+     *
+     * @return {string} The UTF-8 string.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+     */
+    stringify: function (wordArray) {
+      try {
+        return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+      } catch (e) {
+        throw new Error('Malformed UTF-8 data');
+      }
+    },
+
+    /**
+     * Converts a UTF-8 string to a word array.
+     *
+     * @param {string} utf8Str The UTF-8 string.
+     *
+     * @return {WordArray} The word array.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+     */
+    parse: function (utf8Str) {
+      return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+    }
+  };
+
+  var u8array = C_enc.u8array = {
+    stringify: function (wordArray) {
+      var words = wordArray.words;
+      var sigBytes = wordArray.sigBytes;
+      var u8 = new Uint8Array(sigBytes);
+      for (var i = 0; i < sigBytes; i++) {
+        var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+        u8[i] = byte;
+      }
+      return u8;
+    },
+    parse: function (u8arr) {
+      var len = u8arr.length;
+      var words = [];
+      for (var i = 0; i < len; i++) {
+        words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8);
+      }
+      return CryptoJS.lib.WordArray.create(words, len);
+    }
+  };
+
+  /**
+   * Abstract buffered block algorithm template.
+   *
+   * The property blockSize must be implemented in a concrete subtype.
+   *
+   * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+   */
+  var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+    /**
+     * Resets this block algorithm's data buffer to its initial state.
+     *
+     * @example
+     *
+     *     bufferedBlockAlgorithm.reset();
+     */
+    reset: function () {
+      // Initial values
+      this._data = new WordArray.init();
+      this._nDataBytes = 0;
+    },
+
+    /**
+     * Adds new data to this block algorithm's buffer.
+     *
+     * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+     *
+     * @example
+     *
+     *     bufferedBlockAlgorithm._append('data');
+     *     bufferedBlockAlgorithm._append(wordArray);
+     */
+    _append: function (data) {
+      // Convert string to WordArray, else assume WordArray already
+      if (typeof data == 'string') {
+        data = Utf8.parse(data);
+      }
+
+      // Append
+      this._data.concat(data);
+      this._nDataBytes += data.sigBytes;
+    },
+
+    /**
+     * Processes available data blocks.
+     *
+     * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+     *
+     * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+     *
+     * @return {WordArray} The processed data.
+     *
+     * @example
+     *
+     *     var processedData = bufferedBlockAlgorithm._process();
+     *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
+     */
+    _process: function (doFlush) {
+      // Shortcuts
+      var data = this._data;
+      var dataWords = data.words;
+      var dataSigBytes = data.sigBytes;
+      var blockSize = this.blockSize;
+      var blockSizeBytes = blockSize * 4;
+
+      // Count blocks ready
+      var nBlocksReady = dataSigBytes / blockSizeBytes;
+      if (doFlush) {
+        // Round up to include partial blocks
+        nBlocksReady = Math.ceil(nBlocksReady);
+      } else {
+        // Round down to include only full blocks,
+        // less the number of blocks that must remain in the buffer
+        nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+      }
+
+      // Count words ready
+      var nWordsReady = nBlocksReady * blockSize;
+
+      // Count bytes ready
+      var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+      // Process blocks
+      if (nWordsReady) {
+        for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+          // Perform concrete-algorithm logic
+          this._doProcessBlock(dataWords, offset);
+        }
+
+        // Remove processed words
+        var processedWords = dataWords.splice(0, nWordsReady);
+        data.sigBytes -= nBytesReady;
+      }
+
+      // Return processed words
+      return new WordArray.init(processedWords, nBytesReady);
+    },
+
+    /**
+     * Creates a copy of this object.
+     *
+     * @return {Object} The clone.
+     *
+     * @example
+     *
+     *     var clone = bufferedBlockAlgorithm.clone();
+     */
+    clone: function () {
+      var clone = Base.clone.call(this);
+      clone._data = this._data.clone();
+
+      return clone;
+    },
+
+    _minBufferSize: 0
+  });
+
+  /**
+   * Abstract hasher template.
+   *
+   * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+   */
+  var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+    /**
+     * Configuration options.
+     */
+    cfg: Base.extend(),
+
+    /**
+     * Initializes a newly created hasher.
+     *
+     * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+     *
+     * @example
+     *
+     *     var hasher = CryptoJS.algo.SHA256.create();
+     */
+    init: function (cfg) {
+      // Apply config defaults
+      this.cfg = this.cfg.extend(cfg);
+
+      // Set initial values
+      this.reset();
+    },
+
+    /**
+     * Resets this hasher to its initial state.
+     *
+     * @example
+     *
+     *     hasher.reset();
+     */
+    reset: function () {
+      // Reset data buffer
+      BufferedBlockAlgorithm.reset.call(this);
+
+      // Perform concrete-hasher logic
+      this._doReset();
+    },
+
+    /**
+     * Updates this hasher with a message.
+     *
+     * @param {WordArray|string} messageUpdate The message to append.
+     *
+     * @return {Hasher} This hasher.
+     *
+     * @example
+     *
+     *     hasher.update('message');
+     *     hasher.update(wordArray);
+     */
+    update: function (messageUpdate) {
+      // Append
+      this._append(messageUpdate);
+
+      // Update the hash
+      this._process();
+
+      // Chainable
+      return this;
+    },
+
+    /**
+     * Finalizes the hash computation.
+     * Note that the finalize operation is effectively a destructive, read-once operation.
+     *
+     * @param {WordArray|string} messageUpdate (Optional) A final message update.
+     *
+     * @return {WordArray} The hash.
+     *
+     * @example
+     *
+     *     var hash = hasher.finalize();
+     *     var hash = hasher.finalize('message');
+     *     var hash = hasher.finalize(wordArray);
+     */
+    finalize: function (messageUpdate) {
+      // Final message update
+      if (messageUpdate) {
+        this._append(messageUpdate);
+      }
+
+      // Perform concrete-hasher logic
+      var hash = this._doFinalize();
+
+      return hash;
+    },
+
+    blockSize: 512 / 32,
+
+    /**
+     * Creates a shortcut function to a hasher's object interface.
+     *
+     * @param {Hasher} hasher The hasher to create a helper for.
+     *
+     * @return {Function} The shortcut function.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+     */
+    _createHelper: function (hasher) {
+      return function (message, cfg) {
+        return new hasher.init(cfg).finalize(message);
+      };
+    },
+
+    /**
+     * Creates a shortcut function to the HMAC's object interface.
+     *
+     * @param {Hasher} hasher The hasher to use in this HMAC helper.
+     *
+     * @return {Function} The shortcut function.
+     *
+     * @static
+     *
+     * @example
+     *
+     *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+     */
+    _createHmacHelper: function (hasher) {
+      return function (message, key) {
+        return new C_algo.HMAC.init(hasher, key).finalize(message);
+      };
+    }
+  });
+
+  /**
+   * Algorithm namespace.
+   */
+  var C_algo = C.algo = {};
+
+  return C;
+}(Math));
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS = CryptoJS || function (u, p) {
+  var d = {}, l = d.lib = {}, s = function () { }, t = l.Base = { extend: function (a) { s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function () { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } },
+    r = l.WordArray = t.extend({
+      init: function (a, c) { a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function (a) { return (a || v).stringify(this) }, concat: function (a) { var c = this.words, e = a.words, j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++)c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4)c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function () {
+        var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 <<
+          32 - 8 * (c % 4); a.length = u.ceil(c / 4)
+      }, clone: function () { var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var c = [], e = 0; e < a; e += 4)c.push(4294967296 * u.random() | 0); return new r.init(c, a) }
+    }), w = d.enc = {}, v = w.Hex = {
+      stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) { var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function (a) {
+        for (var c = a.length, e = [], j = 0; j < c; j += 2)e[j >>> 3] |= parseInt(a.substr(j,
+          2), 16) << 24 - 4 * (j % 8); return new r.init(e, c / 2)
+      }
+    }, b = w.Latin1 = { stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++)e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function (a) { for (var c = a.length, e = [], j = 0; j < c; j++)e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new r.init(e, c) } }, x = w.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } },
+    q = l.BufferedBlockAlgorithm = t.extend({
+      reset: function () { this._data = new r.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var c = this._data, e = c.words, j = c.sigBytes, k = this.blockSize, b = j / (4 * k), b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * k; j = u.min(4 * a, j); if (a) { for (var q = 0; q < a; q += k)this._doProcessBlock(e, q); q = e.splice(0, a); c.sigBytes -= j } return new r.init(q, j) }, clone: function () {
+        var a = t.clone.call(this);
+        a._data = this._data.clone(); return a
+      }, _minBufferSize: 0
+    }); l.Hasher = q.extend({
+    cfg: t.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { q.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (b, e) { return (new a.init(e)).finalize(b) } }, _createHmacHelper: function (a) {
+      return function (b, e) {
+        return (new n.HMAC.init(a,
+          e)).finalize(b)
+      }
+    }
+  }); var n = d.algo = {}; return d
+}(Math);
+(function () {
+  var u = CryptoJS, p = u.lib.WordArray; u.enc.Base64 = {
+    stringify: function (d) { var l = d.words, p = d.sigBytes, t = this._map; d.clamp(); d = []; for (var r = 0; r < p; r += 3)for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r + 1 >>> 2] >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l[r + 2 >>> 2] >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++)d.push(t.charAt(w >>> 6 * (3 - v) & 63)); if (l = t.charAt(64)) for (; d.length % 4;)d.push(l); return d.join("") }, parse: function (d) {
+      var l = d.length, s = this._map, t = s.charAt(64); t && (t = d.indexOf(t), -1 != t && (l = t)); for (var t = [], r = 0, w = 0; w <
+      l; w++)if (w % 4) { var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4), b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4); t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4); r++ } return p.create(t, r)
+    }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
+  }
+})();
+(function (u) {
+  function p(b, n, a, c, e, j, k) { b = b + (n & a | ~n & c) + e + k; return (b << j | b >>> 32 - j) + n } function d(b, n, a, c, e, j, k) { b = b + (n & c | a & ~c) + e + k; return (b << j | b >>> 32 - j) + n } function l(b, n, a, c, e, j, k) { b = b + (n ^ a ^ c) + e + k; return (b << j | b >>> 32 - j) + n } function s(b, n, a, c, e, j, k) { b = b + (a ^ (n | ~c)) + e + k; return (b << j | b >>> 32 - j) + n } for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++)b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0; r = r.MD5 = v.extend({
+    _doReset: function () { this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878]) },
+    _doProcessBlock: function (q, n) {
+      for (var a = 0; 16 > a; a++) { var c = n + a, e = q[c]; q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360 } var a = this._hash.words, c = q[n + 0], e = q[n + 1], j = q[n + 2], k = q[n + 3], z = q[n + 4], r = q[n + 5], t = q[n + 6], w = q[n + 7], v = q[n + 8], A = q[n + 9], B = q[n + 10], C = q[n + 11], u = q[n + 12], D = q[n + 13], E = q[n + 14], x = q[n + 15], f = a[0], m = a[1], g = a[2], h = a[3], f = p(f, m, g, h, c, 7, b[0]), h = p(h, f, m, g, e, 12, b[1]), g = p(g, h, f, m, j, 17, b[2]), m = p(m, g, h, f, k, 22, b[3]), f = p(f, m, g, h, z, 7, b[4]), h = p(h, f, m, g, r, 12, b[5]), g = p(g, h, f, m, t, 17, b[6]), m = p(m, g, h, f, w, 22, b[7]),
+        f = p(f, m, g, h, v, 7, b[8]), h = p(h, f, m, g, A, 12, b[9]), g = p(g, h, f, m, B, 17, b[10]), m = p(m, g, h, f, C, 22, b[11]), f = p(f, m, g, h, u, 7, b[12]), h = p(h, f, m, g, D, 12, b[13]), g = p(g, h, f, m, E, 17, b[14]), m = p(m, g, h, f, x, 22, b[15]), f = d(f, m, g, h, e, 5, b[16]), h = d(h, f, m, g, t, 9, b[17]), g = d(g, h, f, m, C, 14, b[18]), m = d(m, g, h, f, c, 20, b[19]), f = d(f, m, g, h, r, 5, b[20]), h = d(h, f, m, g, B, 9, b[21]), g = d(g, h, f, m, x, 14, b[22]), m = d(m, g, h, f, z, 20, b[23]), f = d(f, m, g, h, A, 5, b[24]), h = d(h, f, m, g, E, 9, b[25]), g = d(g, h, f, m, k, 14, b[26]), m = d(m, g, h, f, v, 20, b[27]), f = d(f, m, g, h, D, 5, b[28]), h = d(h, f,
+          m, g, j, 9, b[29]), g = d(g, h, f, m, w, 14, b[30]), m = d(m, g, h, f, u, 20, b[31]), f = l(f, m, g, h, r, 4, b[32]), h = l(h, f, m, g, v, 11, b[33]), g = l(g, h, f, m, C, 16, b[34]), m = l(m, g, h, f, E, 23, b[35]), f = l(f, m, g, h, e, 4, b[36]), h = l(h, f, m, g, z, 11, b[37]), g = l(g, h, f, m, w, 16, b[38]), m = l(m, g, h, f, B, 23, b[39]), f = l(f, m, g, h, D, 4, b[40]), h = l(h, f, m, g, c, 11, b[41]), g = l(g, h, f, m, k, 16, b[42]), m = l(m, g, h, f, t, 23, b[43]), f = l(f, m, g, h, A, 4, b[44]), h = l(h, f, m, g, u, 11, b[45]), g = l(g, h, f, m, x, 16, b[46]), m = l(m, g, h, f, j, 23, b[47]), f = s(f, m, g, h, c, 6, b[48]), h = s(h, f, m, g, w, 10, b[49]), g = s(g, h, f, m,
+          E, 15, b[50]), m = s(m, g, h, f, r, 21, b[51]), f = s(f, m, g, h, u, 6, b[52]), h = s(h, f, m, g, k, 10, b[53]), g = s(g, h, f, m, B, 15, b[54]), m = s(m, g, h, f, e, 21, b[55]), f = s(f, m, g, h, v, 6, b[56]), h = s(h, f, m, g, x, 10, b[57]), g = s(g, h, f, m, t, 15, b[58]), m = s(m, g, h, f, D, 21, b[59]), f = s(f, m, g, h, z, 6, b[60]), h = s(h, f, m, g, C, 10, b[61]), g = s(g, h, f, m, j, 15, b[62]), m = s(m, g, h, f, A, 21, b[63]); a[0] = a[0] + f | 0; a[1] = a[1] + m | 0; a[2] = a[2] + g | 0; a[3] = a[3] + h | 0
+    }, _doFinalize: function () {
+      var b = this._data, n = b.words, a = 8 * this._nDataBytes, c = 8 * b.sigBytes; n[c >>> 5] |= 128 << 24 - c % 32; var e = u.floor(a /
+        4294967296); n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360; n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360; b.sigBytes = 4 * (n.length + 1); this._process(); b = this._hash; n = b.words; for (a = 0; 4 > a; a++)c = n[a], n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360; return b
+    }, clone: function () { var b = v.clone.call(this); b._hash = this._hash.clone(); return b }
+  }); t.MD5 = v._createHelper(r); t.HmacMD5 = v._createHmacHelper(r)
+})(Math);
+(function () {
+  var u = CryptoJS, p = u.lib, d = p.Base, l = p.WordArray, p = u.algo, s = p.EvpKDF = d.extend({ cfg: d.extend({ keySize: 4, hasher: p.MD5, iterations: 1 }), init: function (d) { this.cfg = this.cfg.extend(d) }, compute: function (d, r) { for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q;) { n && s.update(n); var n = s.update(d).finalize(r); s.reset(); for (var a = 1; a < p; a++)n = s.finalize(n), s.reset(); b.concat(n) } b.sigBytes = 4 * q; return b } }); u.EvpKDF = function (d, l, p) {
+    return s.create(p).compute(d,
+      l)
+  }
+})();
+CryptoJS.lib.Cipher || function (u) {
+  var p = CryptoJS, d = p.lib, l = d.Base, s = d.WordArray, t = d.BufferedBlockAlgorithm, r = p.enc.Base64, w = p.algo.EvpKDF, v = d.Cipher = t.extend({
+    cfg: l.extend(), createEncryptor: function (e, a) { return this.create(this._ENC_XFORM_MODE, e, a) }, createDecryptor: function (e, a) { return this.create(this._DEC_XFORM_MODE, e, a) }, init: function (e, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = e; this._key = a; this.reset() }, reset: function () { t.reset.call(this); this._doReset() }, process: function (e) { this._append(e); return this._process() },
+    finalize: function (e) { e && this._append(e); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function (e) { return { encrypt: function (b, k, d) { return ("string" == typeof k ? c : a).encrypt(e, b, k, d) }, decrypt: function (b, k, d) { return ("string" == typeof k ? c : a).decrypt(e, b, k, d) } } }
+  }); d.StreamCipher = v.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var b = p.mode = {}, x = function (e, a, b) {
+    var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var d = 0; d < b; d++)e[a + d] ^=
+      c[d]
+  }, q = (d.BlockCipherMode = l.extend({ createEncryptor: function (e, a) { return this.Encryptor.create(e, a) }, createDecryptor: function (e, a) { return this.Decryptor.create(e, a) }, init: function (e, a) { this._cipher = e; this._iv = a } })).extend(); q.Encryptor = q.extend({ processBlock: function (e, a) { var b = this._cipher, c = b.blockSize; x.call(this, e, a, c); b.encryptBlock(e, a); this._prevBlock = e.slice(a, a + c) } }); q.Decryptor = q.extend({
+    processBlock: function (e, a) {
+      var b = this._cipher, c = b.blockSize, d = e.slice(a, a + c); b.decryptBlock(e, a); x.call(this,
+        e, a, c); this._prevBlock = d
+    }
+  }); b = b.CBC = q; q = (p.pad = {}).Pkcs7 = { pad: function (a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4)l.push(d); c = s.create(l, c); a.concat(c) }, unpad: function (a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({
+    cfg: v.cfg.extend({ mode: b, padding: q }), reset: function () {
+      v.reset.call(this); var a = this.cfg, b = a.iv, a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor; else c = a.createDecryptor, this._minBufferSize = 1; this._mode = c.call(a,
+        this, b && b.words)
+    }, _doProcessBlock: function (a, b) { this._mode.processBlock(a, b) }, _doFinalize: function () { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var b = this._process(!0) } else b = this._process(!0), a.unpad(b); return b }, blockSize: 4
+  }); var n = d.CipherParams = l.extend({ init: function (a) { this.mixIn(a) }, toString: function (a) { return (a || this.formatter).stringify(this) } }), b = (p.format = {}).OpenSSL = {
+    stringify: function (a) {
+      var b = a.ciphertext; a = a.salt; return (a ? s.create([1398893684,
+        1701076831]).concat(a).concat(b) : b).toString(r)
+    }, parse: function (a) { a = r.parse(a); var b = a.words; if (1398893684 == b[0] && 1701076831 == b[1]) { var c = s.create(b.slice(2, 4)); b.splice(0, 4); a.sigBytes -= 16 } return n.create({ ciphertext: a, salt: c }) }
+  }, a = d.SerializableCipher = l.extend({
+    cfg: l.extend({ format: b }), encrypt: function (a, b, c, d) { d = this.cfg.extend(d); var l = a.createEncryptor(c, d); b = l.finalize(b); l = l.cfg; return n.create({ ciphertext: b, key: c, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) },
+    decrypt: function (a, b, c, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); return a.createDecryptor(c, d).finalize(b.ciphertext) }, _parse: function (a, b) { return "string" == typeof a ? b.parse(a, this) : a }
+  }), p = (p.kdf = {}).OpenSSL = { execute: function (a, b, c, d) { d || (d = s.random(8)); a = w.create({ keySize: b + c }).compute(a, d); c = s.create(a.words.slice(b), 4 * c); a.sigBytes = 4 * b; return n.create({ key: a, iv: c, salt: d }) } }, c = d.PasswordBasedCipher = a.extend({
+    cfg: a.cfg.extend({ kdf: p }), encrypt: function (b, c, d, l) {
+      l = this.cfg.extend(l); d = l.kdf.execute(d,
+        b.keySize, b.ivSize); l.iv = d.iv; b = a.encrypt.call(this, b, c, d.key, l); b.mixIn(d); return b
+    }, decrypt: function (b, c, d, l) { l = this.cfg.extend(l); c = this._parse(c, l.format); d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt); l.iv = d.iv; return a.decrypt.call(this, b, c, d.key, l) }
+  })
+}();
+(function () {
+  for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++)a[c] = 128 > c ? c << 1 : c << 1 ^ 283; for (var e = 0, j = 0, c = 0; 256 > c; c++) { var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4, k = k >>> 8 ^ k & 255 ^ 99; l[e] = k; s[k] = e; var z = a[e], F = a[z], G = a[F], y = 257 * a[k] ^ 16843008 * k; t[e] = y << 24 | y >>> 8; r[e] = y << 16 | y >>> 16; w[e] = y << 8 | y >>> 24; v[e] = y; y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e; b[k] = y << 24 | y >>> 8; x[k] = y << 16 | y >>> 16; q[k] = y << 8 | y >>> 24; n[k] = y; e ? (e = z ^ a[a[a[G ^ z]]], j ^= a[a[j]]) : e = j = 1 } var H = [0, 1, 2, 4, 8,
+    16, 32, 64, 128, 27, 54], d = d.AES = p.extend({
+    _doReset: function () {
+      for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++)if (j < d) e[j] = c[j]; else { var k = e[j - 1]; j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24, k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255], k ^= H[j / d | 0] << 24); e[j] = e[j - d] ^ k } c = this._invKeySchedule = []; for (d = 0; d < a; d++)j = a - d, k = d % 4 ? e[j] : e[j - 4], c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>>
+      8 & 255]] ^ n[l[k & 255]]
+    }, encryptBlock: function (a, b) { this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l) }, decryptBlock: function (a, c) { var d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d; this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s); d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d }, _doCryptBlock: function (a, b, c, d, e, j, l, f) {
+      for (var m = this._nRounds, g = a[b] ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++)var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++], s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++], t =
+        d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++], n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++], g = q, h = s, k = t; q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++]; s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++]; t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++]; n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++]; a[b] = q; a[b + 1] = s; a[b + 2] = t; a[b + 3] = n
+    }, keySize: 8
+  }); u.AES = p._createHelper(d)
+})();
+
+
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+  var h = CryptoJS, j = h.lib.WordArray; h.enc.Base64 = {
+    stringify: function (b) { var e = b.words, f = b.sigBytes, c = this._map; b.clamp(); b = []; for (var a = 0; a < f; a += 3)for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++)b.push(c.charAt(d >>> 6 * (3 - g) & 63)); if (e = c.charAt(64)) for (; b.length % 4;)b.push(e); return b.join("") }, parse: function (b) {
+      var e = b.length, f = this._map, c = f.charAt(64); c && (c = b.indexOf(c), -1 != c && (e = c)); for (var c = [], a = 0, d = 0; d <
+      e; d++)if (d % 4) { var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4); c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4); a++ } return j.create(c, a)
+    }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
+  }
+})();
+
+
+class AES {
+
+  constructor(secret_key){
+    this.secret_key = CryptoJS.MD5(secret_key).toString();
+  }
+
+  encrypt(data){
+    var key = CryptoJS.enc.Latin1.parse(this.secret_key);
+    var encrypted = CryptoJS.AES.encrypt(data, key, {
+      iv: key,
+      mode: CryptoJS.mode.CBC,
+      padding: CryptoJS.pad.Pkcs7
+    });
+    var strAr = CryptoJS.enc.u8array.stringify(encrypted.ciphertext);
+    var u8Ar  = CryptoJS.enc.u8array.parse(strAr);
+    var str = u8Ar.toString(CryptoJS.enc.Base64);
+  //  var strAr = this.stringToUint8Array(str);
+    return str;
+  }
+
+  /*
+   * CryptoJS AES 解密
+   */
+  decrypt(data) {
+    // 解密key
+    var key = CryptoJS.enc.Latin1.parse(this.secret_key);
+    var decrypted = CryptoJS.AES.decrypt(data, key, {
+      iv: key,
+      mode: CryptoJS.mode.CBC,
+      padding: CryptoJS.pad.Pkcs7
+    });
+    var message = decrypted.toString(CryptoJS.enc.Utf8);
+    return (message);
+  }
+
+  /**
+   * 数据toUint8Array
+   * @param {type} str
+   * @returns {Uint8Array}
+   */
+  stringToUint8Array (str) {
+    var arr = [];
+    for (var i = 0, j = str.length; i < j; ++i) {
+      arr.push(str.charCodeAt(i));
+    }
+    var tmpUint8Array = new Uint8Array(arr);
+    return tmpUint8Array;
+  }
+
+}
+
+export default {
+  CryptoJS  : CryptoJS,
+  AES       : AES
+}

+ 62 - 0
libs/chat.js

@@ -0,0 +1,62 @@
+import $store from "@/store";
+import { VUE_APP_WS_URL } from "@/utils/index.js";
+
+const Socket = function() {
+  this.ws = new WebSocket(wss(VUE_APP_WS_URL));
+  this.ws.onopen = this.onOpen.bind(this);
+  this.ws.onerror = this.onError.bind(this);
+  this.ws.onmessage = this.onMessage.bind(this);
+  this.ws.onclose = this.onClose.bind(this);
+};
+
+function wss(wsSocketUrl) {
+    let ishttps = document.location.protocol == 'https:';
+    if (ishttps) {
+        return wsSocketUrl.replace('ws:', 'wss:');
+    } else {
+        return wsSocketUrl.replace('wss:', 'ws:');
+    }
+}
+
+Socket.prototype = {
+  vm(vm) {
+    this.vm = vm;
+  },
+  close() {
+    clearInterval(this.timer);
+    this.ws.close();
+  },
+  onOpen: function() {
+    console.log("ws open");
+    this.init();
+    this.send({
+      type: "login",
+      data: $store.state.app.token
+    });
+    this.vm.$emit("socket_open");
+  },
+  init: function() {
+    var that = this;
+    this.timer = setInterval(function() {
+      that.send({ type: "ping" });
+    }, 10000);
+  },
+  send: function(data) {
+    return this.ws.send(JSON.stringify(data));
+  },
+  onMessage: function(res) {
+    const { type, data = {} } = JSON.parse(res.data);
+    this.vm.$emit(type, data);
+  },
+  onClose: function() {
+    clearInterval(this.timer);
+  },
+  onError: function(e) {
+    console.log(e);
+    this.vm.$emit("socket_error", e);
+  }
+};
+
+Socket.prototype.constructor = Socket;
+
+export default Socket;

+ 78 - 0
libs/login.js

@@ -0,0 +1,78 @@
+import store from "../store";
+import Cache from '../utils/cache';
+// #ifdef H5 || APP-PLUS
+import { isWeixin } from "../utils";
+import auth from './wechat';
+// #endif
+
+import { LOGIN_STATUS, USER_INFO, EXPIRES_TIME, STATE_R_KEY} from './../config/cache';
+
+function prePage(){
+	let pages = getCurrentPages();
+	let prePage = pages[pages.length - 2];
+	// #ifdef H5
+	return prePage;
+	// #endif
+	return prePage.$vm;
+}
+
+export function toLogin(push, pathLogin) {
+	store.commit("LOGOUT");
+	let path = prePage();
+	if(path){
+		path = path.router;
+		if(path == undefined){
+			path = location.pathname;
+		}
+	}  
+		// #ifdef H5
+	else{
+		path = location.pathname;
+	} 
+		// #endif
+		
+	if(!pathLogin)
+		pathLogin = '/page/users/login/index'
+	Cache.set('login_back_url',path);
+	// #ifdef H5 || APP-PLUS
+	if (isWeixin()) {
+		auth.oAuth();
+	} else {
+		if (path !== pathLogin) {
+		 push ? uni.navigateTo({
+		 	url:'/pages/users/login/index'
+		 }) : uni.reLaunch({
+		 	url: '/pages/users/login/index'
+		 });
+		}
+	}
+	// #endif
+	
+	// #ifdef MP 
+	
+	
+	// #endif
+}
+
+
+export function checkLogin()
+{
+	let token = Cache.get(LOGIN_STATUS);
+	let expiresTime = Cache.get(EXPIRES_TIME);
+	let newTime = Math.round(new Date() / 1000);
+	if (expiresTime < newTime || !token){
+		Cache.clear(LOGIN_STATUS);
+		Cache.clear(EXPIRES_TIME);
+		Cache.clear(USER_INFO);
+		Cache.clear(STATE_R_KEY);
+		return false;
+	}else{
+		store.commit('UPDATE_LOGIN',token);
+		let userInfo = Cache.get(USER_INFO,true);
+		if(userInfo){
+			store.commit('UPDATE_USERINFO',userInfo);
+		}
+		return true;
+	}
+
+}

+ 19 - 0
libs/order.js

@@ -0,0 +1,19 @@
+export function goShopDetail(item,uid) {
+	return new Promise(resolve => {
+		if (item.activity && item.activity.type === "1") {
+			uni.navigateTo({
+				url: `/pages/activity/goods_seckill_details/index?id=${item.activity.id}&time=${item.activity.time}&status=1`
+			})
+		} else if (item.activity && item.activity.type === "2") {
+			uni.navigateTo({
+				url: `/pages/activity/goods_bargain_details/index?id=${item.activity.id}&bargain=${uid}`
+			})
+		} else if (item.activity && item.activity.type === "3") {
+			uni.navigateTo({
+				url: `/pages/activity/goods_combination_details/index?id=${item.activity.id}`
+			})
+		} else {
+			resolve(item);
+		}
+	});
+}

+ 141 - 0
libs/routine.js

@@ -0,0 +1,141 @@
+import store from '../store';
+import { checkLogin } from './login';
+import { login } from '../api/public';
+import Cache from '../utils/cache';
+import { STATE_R_KEY, USER_INFO, EXPIRES_TIME, LOGIN_STATUS} from './../config/cache';
+
+class Routine 
+{
+	
+	constructor() 
+	{
+	    this.scopeUserInfo = 'scope.userInfo';
+	}
+	
+	async getUserCode(){
+		let isAuth = await this.isAuth(), code = '' ;
+		if(isAuth)
+			code = await this.getCode();
+		return code;
+	}
+	
+	/**
+	 * 获取用户信息
+	 */
+	getUserInfo(){
+		let  that = this , code = this.getUserCode();
+		return new Promise( (resolve,reject) => {
+			uni.getUserInfo({
+				lang: 'zh_CN',
+				success(user) {
+					if(code) user.code = code;
+					resolve({userInfo:user,islogin:false});
+				},
+				fail(res){
+					reject(res);
+				}
+			})
+		})
+	}
+	
+	/**
+	 * 获取用户信息
+	 */
+	authorize()
+	{
+		let that = this;
+		return new Promise((resolve,reject)=>{
+			if(checkLogin())
+				return resolve({
+					userInfo:Cache.get(USER_INFO,true),
+					islogin:true,
+				});
+			uni.authorize({
+			    scope: that.scopeUserInfo,
+			    success() {
+					resolve({islogin:false});
+			    },
+				fail(res){
+					reject(res);
+				}
+			})
+		})
+	}
+	
+	async getCode(){
+		let provider = await this.getProvider();
+		return new Promise((resolve,reject)=>{
+			if(Cache.has(STATE_R_KEY)){
+				return resolve(Cache.get(STATE_R_KEY));
+			}
+			uni.login({
+				provider:provider,
+				success(res) {
+					if (res.code) Cache.set(STATE_R_KEY, res.code ,10800);
+					return resolve(res.code);
+				},
+				fail(){
+					return reject(null);
+				}
+			})
+		})
+	}
+	
+	/**
+	 * 获取服务供应商
+	 */
+	getProvider()
+	{
+		return new Promise((resolve,reject)=>{
+			uni.getProvider({
+				service:'oauth',
+				success(res) {
+					resolve(res.provider);
+				},
+				fail() {
+					resolve(false);
+				}
+			});
+		});
+	}
+	
+	/**
+	 * 是否授权
+	 */
+	isAuth(){
+		let that = this;
+		return new Promise((resolve,reject)=>{
+			uni.getSetting({
+				success(res) {
+					if (!res.authSetting[that.scopeUserInfo]) {
+						resolve(true)
+					} else {
+						resolve(true);
+					}
+				},
+				fail(){
+					 resolve(false);
+				}
+			});
+		});
+	}
+	
+	authUserInfo(data)
+	{
+		return new Promise((resolve, reject)=>{
+			login(data).then(res=>{
+				let time = res.data.expires_time - Cache.time();
+				store.commit('UPDATE_USERINFO', res.data.userInfo);
+				store.commit('LOGIN', {token:res.data.token, time:time});
+				store.commit('SETUID', res.data.userInfo.uid);
+				Cache.set(EXPIRES_TIME,res.data.expires_time,time);
+				Cache.set(USER_INFO,res.data.userInfo,time);
+				return resolve(res);
+			}).catch(res=>{
+				return reject(res);
+			})
+		})
+	}
+}
+
+export default new Routine();

+ 252 - 0
libs/wechat.js

@@ -0,0 +1,252 @@
+// #ifdef H5
+import WechatJSSDK from "@/plugin/jweixin-module/index.js";
+
+
+import {
+	getWechatConfig,
+	wechatAuth
+} from "@/api/public";
+import {
+	WX_AUTH,
+	STATE_KEY,
+	LOGINTYPE,
+	BACK_URL
+} from '@/config/cache';
+import {
+	parseQuery
+} from '@/utils';
+import store from '@/store';
+import Cache from '@/utils/cache';
+
+class AuthWechat {
+
+	constructor() {
+		//微信实例化对象
+		this.instance = WechatJSSDK;
+		//是否实例化
+		this.status = false;
+
+		this.initConfig = {};
+
+	}
+	
+	isAndroid(){
+		let u = navigator.userAgent;
+		return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
+	}
+
+	/**
+	 * 初始化wechat(分享配置)
+	 */
+	wechat() {
+		return new Promise((resolve, reject) => {
+			// if (this.status && !this.isAndroid()) return resolve(this.instance);
+			getWechatConfig()
+				.then(res => {
+					this.instance.config(res.data);
+					this.initConfig = res.data;
+					this.status = true;
+					this.instance.ready(() => {
+						resolve(this.instance);
+					})
+				}).catch(err => {
+					console.log(err);
+					this.status = false;
+					reject(err);
+				});
+		});
+	}
+
+	/**
+	 * 验证是否初始化
+	 */
+	verifyInstance() {
+		let that = this;
+		return new Promise((resolve, reject) => {
+			if (that.instance === null && !that.status) {
+				that.wechat().then(res => {
+					resolve(that.instance);
+				}).catch(() => {
+					return reject();
+				})
+			} else {
+				return resolve(that.instance);
+			}
+		})
+	}
+	// 微信公众号的共享地址
+	openAddress() {
+		return new Promise((resolve, reject) => {
+			this.wechat().then(wx => {
+				this.toPromise(wx.openAddress).then(res => {
+					resolve(res);
+				}).catch(err => {
+					reject(err);
+				});
+			}).catch(err => {
+				reject(err);
+			})
+		});
+	}
+
+	/**
+	 * 微信支付
+	 * @param {Object} config
+	 */
+	pay(config) {
+		return new Promise((resolve, reject) => {
+			this.wechat().then((wx) => {
+				this.toPromise(wx.chooseWXPay, config).then(res => {
+					resolve(res);
+				}).catch(res => {
+					reject(res);
+				});
+			}).catch(res => {
+				reject(res);
+			});
+		});
+	}
+
+	toPromise(fn, config = {}) {
+		return new Promise((resolve, reject) => {
+			fn({
+				...config,
+				success(res) {
+					resolve(res);
+				},
+				fail(err) {
+					reject(err);
+				},
+				complete(err) {
+					reject(err);
+				},
+				cancel(err) {
+					reject(err);
+				}
+			});
+		});
+	}
+
+	/**
+	 * 自动去授权
+	 */
+	oAuth() {
+		if (uni.getStorageSync(WX_AUTH) && store.state.app.token) return;
+		const {
+			code
+		} = parseQuery();
+		if (!code) return this.toAuth();
+	}
+
+	clearAuthStatus() {
+
+	}
+
+	/**
+	 * 授权登陆获取token
+	 * @param {Object} code
+	 */
+	auth(code) {
+		return new Promise((resolve, reject) => {
+			let loginType = Cache.get(LOGINTYPE);
+			wechatAuth(code, parseInt(Cache.get("spread")), loginType)
+				.then(({
+					data
+				}) => {
+					let expires_time = data.expires_time.substring(0, 19);
+					expires_time = expires_time.replace(/-/g, '/');
+					expires_time = new Date(expires_time).getTime();
+					let newTime = Math.round(new Date() / 1000);
+					store.commit("LOGIN", {
+						token: data.token,
+						time: expires_time - newTime
+					});
+					Cache.set(WX_AUTH, code);
+					Cache.clear(STATE_KEY);
+					loginType && Cache.clear(LOGINTYPE);
+					resolve();
+				})
+				.catch(reject);
+		});
+	}
+
+	/**
+	 * 获取跳转授权后的地址
+	 * @param {Object} appId
+	 */
+	getAuthUrl(appId) {
+		const redirect_uri = encodeURIComponent(
+			`${location.origin}/pages/auth/index?back_url=` +
+			encodeURIComponent(
+				encodeURIComponent(
+					uni.getStorageSync(BACK_URL) ?
+					uni.getStorageSync(BACK_URL) :
+					location.pathname + location.search
+				)
+			)
+		);
+		uni.removeStorageSync(BACK_URL);
+		const state = encodeURIComponent(
+			("" + Math.random()).split(".")[1] + "authorizestate"
+		);
+		uni.setStorageSync(STATE_KEY, state);
+		return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=${state}#wechat_redirect`;
+	}
+
+	/**
+	 * 跳转自动登陆
+	 */
+	toAuth() {
+		let that = this;
+		this.wechat().then(wx => {
+			location.href = this.getAuthUrl(that.initConfig.appId);
+		})
+	}
+
+	/**
+	 * 绑定事件
+	 * @param {Object} name 事件名
+	 * @param {Object} config 参数
+	 */
+	wechatEvevt(name, config) {
+		let that = this;
+		return new Promise((resolve, reject) => {
+			let configDefault = {
+				fail(res) {
+					console.log(res,11111);
+					if (that.instance) return reject({
+						is_ready: true,
+						wx: that.instance
+					});
+					that.verifyInstance().then(wx => {
+						return reject({
+							is_ready: true,
+							wx: wx
+						});
+					})
+				},
+				success(res) {
+					return resolve(res,2222);
+				}
+			};
+			Object.assign(configDefault, config);
+			that.wechat().then(wx => {
+				if (typeof name === 'object') {
+					name.forEach(item => {
+						wx[item] && wx[item](configDefault)
+					})
+				} else {
+					wx[name] && wx[name](configDefault)
+				}
+			})
+		});
+	}
+
+	isWeixin() {
+		return navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1;
+	}
+
+}
+
+export default new AuthWechat();
+// #endif

+ 58 - 0
main.js

@@ -0,0 +1,58 @@
+import Vue from 'vue'
+import App from './App'
+import store from './store'
+import Cache from './utils/cache'
+import util from 'utils/util'
+
+Vue.prototype.$util = util;
+Vue.prototype.$Cache = Cache;
+Vue.prototype.$eventHub = new Vue();
+Vue.config.productionTip = false
+
+// #ifdef H5
+import { parseQuery } from "./utils";
+import Auth from './libs/wechat';
+import { SPREAD } from './config/cache';
+Vue.prototype.$wechat = Auth;
+let cookieName = "VCONSOLE",
+	query = parseQuery(),
+	urlSpread = query["spread"],
+	vconsole = query[cookieName.toLowerCase()],
+	md5Crmeb = "b14d1e9baeced9bb7525ab19ee35f2d2", //CRMEB MD5 加密开启vconsole模式
+	md5UnCrmeb = "3dca2162c4e101b7656793a1af20295c"; //UN_CREMB MD5 加密关闭vconsole模式
+
+if (urlSpread !== undefined) {
+	var spread = Cache.get(SPREAD);
+	urlSpread = parseInt(urlSpread);
+	if (!Number.isNaN(urlSpread) && spread !== urlSpread) {
+		Cache.set("spread", urlSpread || 0);
+	} else if (spread === 0 || typeof spread !== "number") {
+		Cache.set("spread", urlSpread || 0);
+	}
+}
+
+if (vconsole !== undefined) {
+  if (vconsole === md5UnCrmeb && Cache.has(cookieName))
+	  Cache.clear(cookieName);
+} else vconsole = Cache.get(cookieName);
+
+import VConsole from './components/vconsole.min.js'
+
+if (vconsole !== undefined && vconsole === md5Crmeb) {
+	Cache.set(cookieName, md5Crmeb, 3600);
+	let vConsole = new VConsole();
+}
+
+Auth.isWeixin() && Auth.oAuth();
+
+// #endif
+
+App.mpType = 'app'
+
+
+const app = new Vue({
+    ...App,
+	store,
+	Cache
+})
+app.$mount();

+ 100 - 0
manifest.json

@@ -0,0 +1,100 @@
+{
+    "name" : "crmeb",
+    "appid" : "__UNI__06E0263",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx6ca9ac1a01f617a1",
+        "setting" : {
+            "urlCheck" : false,
+            "minified" : true,
+            "postcss" : true,
+            "es6" : true
+        },
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "你的位置信息将用于和门店的距离长度"
+            }
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "h5" : {
+        "devServer" : {
+            "https" : false
+        },
+        "router" : {
+            "mode" : "history",
+            "base" : "h5"
+        },
+        "domain" : "lipinwawa.com",
+        "sdkConfigs" : {
+            "maps" : {
+                "qqmap" : {
+                    "key" : "SMJBZ-WCHK4-ZPZUA-DSIXI-XDDVQ-XWFX7"
+                }
+            }
+        },
+        "title" : "巴巴礼品网"
+    }
+}

+ 27 - 0
mixins/SendVerifyCode.js

@@ -0,0 +1,27 @@
+export default {
+  data() {
+    return {
+      disabled: false,
+      text: "获取验证码"
+    };
+  },
+  methods: {
+    sendCode() {
+      if (this.disabled) return;
+      this.disabled = true;
+      let n = 120;
+      this.text = "剩余 " + n + "s";
+      const run = setInterval(() => {
+        n = n - 1;
+        if (n < 0) {
+          clearInterval(run);
+        }
+        this.text = "剩余 " + n + "s";
+        if (this.text < "剩余 " + 0 + "s") {
+          this.disabled = false;
+          this.text = "重新获取";
+        }
+      }, 1000);
+    }
+  }
+};

+ 447 - 0
package-lock.json

@@ -0,0 +1,447 @@
+{
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "requires": {
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.2"
+      }
+    },
+    "babel-core": {
+      "version": "6.26.3",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "babel-generator": "^6.26.0",
+        "babel-helpers": "^6.24.1",
+        "babel-messages": "^6.23.0",
+        "babel-register": "^6.26.0",
+        "babel-runtime": "^6.26.0",
+        "babel-template": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "convert-source-map": "^1.5.1",
+        "debug": "^2.6.9",
+        "json5": "^0.5.1",
+        "lodash": "^4.17.4",
+        "minimatch": "^3.0.4",
+        "path-is-absolute": "^1.0.1",
+        "private": "^0.1.8",
+        "slash": "^1.0.0",
+        "source-map": "^0.5.7"
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "requires": {
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "detect-indent": "^4.0.0",
+        "jsesc": "^1.3.0",
+        "lodash": "^4.17.4",
+        "source-map": "^0.5.7",
+        "trim-right": "^1.0.1"
+      }
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+      "requires": {
+        "babel-core": "^6.26.0",
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "home-or-tmp": "^2.0.0",
+        "lodash": "^4.17.4",
+        "mkdirp": "^0.5.1",
+        "source-map-support": "^0.4.15"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "debug": "^2.6.8",
+        "globals": "^9.18.0",
+        "invariant": "^2.2.2",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.4",
+        "to-fast-properties": "^1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "requires": {
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "core-image-xhr": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-image-xhr/-/core-image-xhr-1.0.3.tgz",
+      "integrity": "sha1-khHXtcQSGa9atpuThMoqR9VytHY="
+    },
+    "core-js": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+      "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+    },
+    "daycaca": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/daycaca/-/daycaca-1.0.11.tgz",
+      "integrity": "sha512-2SJTpnpmxUGVWbFPTRhaZLvisCD7bYjvuFpLAhjfAAvtnBb26dAqIqaZ9Jq8yvSlugpEGY+v/YXHXGP3paVV9A=="
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "dom7": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.3.tgz",
+      "integrity": "sha512-QTxHHDox+M6ZFz1zHPAHZKI3JOHY5iY4i9BK2uctlggxKQwRhO3q3HHFq1BKsT25Bm/ySSj70K6Wk/G4bs9rMQ==",
+      "requires": {
+        "ssr-window": "^1.0.1"
+      }
+    },
+    "emoji-awesome": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/emoji-awesome/-/emoji-awesome-0.0.2.tgz",
+      "integrity": "sha512-ggortYTr4+f4Jqp/R3vV9FAec+wRkIyRM458LUrv81mKQSKIJW9+xDlbqHsUpMeNKCLG45RsbbCyprrOoGZ6UQ=="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.1"
+      }
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "is-finite": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+    },
+    "lodash": {
+      "version": "4.17.15",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+      "requires": {
+        "source-map": "^0.5.6"
+      }
+    },
+    "ssr-window": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-1.0.1.tgz",
+      "integrity": "sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg=="
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+    },
+    "swiper": {
+      "version": "5.3.8",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-5.3.8.tgz",
+      "integrity": "sha512-bCxrayTgzC2bZBRuFwAx7T4exWeHqMADBpcuTQ7PNCOIIzJRPqNh4ySIvW06LEEU3Q0KncaNre4hrn+jXcWivQ==",
+      "requires": {
+        "dom7": "^2.1.3",
+        "ssr-window": "^1.0.1"
+      }
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+    },
+    "vue": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz",
+      "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ=="
+    },
+    "vue-awesome-swiper": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/vue-awesome-swiper/-/vue-awesome-swiper-4.1.1.tgz",
+      "integrity": "sha512-50um10t6N+lJaORkpwSi1wWuMmBI1sgFc9Znsi5oUykw2cO5DzLaBHcO2JNX21R+Ue4TGoIJDhhxjBHtkFrTEQ=="
+    },
+    "vue-core-image-upload": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/vue-core-image-upload/-/vue-core-image-upload-2.4.11.tgz",
+      "integrity": "sha512-He0OcNqUaL2yHQebFwk4IxLr1Q8m1S7u8zTUek7pMaOUHW76MXOOn6sHoJMruURNvsv3SyeqFEt4N7JQBnMviA==",
+      "requires": {
+        "babel-core": "^6.26.0",
+        "core-image-xhr": "^1.0.3",
+        "daycaca": "^1.0.6",
+        "vue": "^2.5.13"
+      }
+    }
+  }
+}

+ 99 - 0
pages.json

@@ -0,0 +1,99 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "首页",
+				"navigationStyle": "custom",
+				"app-plus": {
+					"scrollIndicator": false //禁用原生导航栏
+				}
+			}
+		},
+		{
+			"path": "pages/product/index",
+			"style": {
+				"navigationBarTitleText": "商品"
+			}
+		},
+		{
+			"path": "pages/product/detail",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/news/index",
+			"style": {
+				"navigationBarTitleText": "消息详情"
+			}
+		},
+		{
+			"path": "pages/users/login/index",
+			"style": {
+				"navigationBarTitleText": "登录"
+			}
+		},
+		{
+			"path": "pages/users/register/index",
+			"style": {
+				"navigationBarTitleText": "注册"
+			}
+		},
+		{
+			"path": "pages/my/index",
+			"style": {
+				"navigationBarTitleText": "我的"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "巴巴礼品",
+		"navigationBarBackgroundColor": "#fff",
+		"backgroundColor": "#F8F8F8",
+		"titleNView": false
+	},
+	"tabBar": {
+		"color": "#282828",
+		"selectedColor": "#ff5c00",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		  "list": [
+		      {
+		        "pagePath": "pages/index/index",
+		        "iconPath": "static/images/1-001.png",
+		        "selectedIconPath": "static/images/1-002.png",
+		        "text": "首页"
+		      },
+		      {
+		        "pagePath": "pages/product/index",
+		        "iconPath": "static/images/2-001.png",
+		        "selectedIconPath": "static/images/2-002.png",
+		        "text": "商品"
+		      },
+			  {
+			    "pagePath": "pages/news/index",
+			    "iconPath": "static/images/3-001.png",
+			    "selectedIconPath": "static/images/3-002.png",
+			    "text": "订单"
+			  },
+		      {
+		        "pagePath": "pages/my/index",
+		        "iconPath": "static/images/4-001.png",
+		        "selectedIconPath": "static/images/4-002.png",
+		        "text": "我的"
+		      }
+		    ]
+	},
+	"condition" : { //模式配置,仅开发期间生效
+		"current": 0, //当前激活的模式(list 的索引项)
+		"list": [
+			{
+				"name": "", //模式名称
+				"path": "", //启动页面,必选
+				"query": "" //启动参数,在页面的onLoad函数里面得到
+			}
+		]
+	}
+}

+ 299 - 0
pages/index/index.vue

@@ -0,0 +1,299 @@
+<template>
+	<view>
+		<view class="notice">
+			<text class='iconfont icon-gonggao'></text>
+			<swiper :indicator-dots="indicatorDots" autoplay="true" interval="2500" duration="500" vertical="true" circular="true">
+				<block v-for="(item,index) in notice" :key='index'>
+					<swiper-item>
+						<navigator class='news' hover-class='none' :url="'/pages/news/index?id='+item.id">{{item.title}}</navigator>
+					</swiper-item>
+				</block>
+			</swiper>
+		</view>
+		
+		<view class="content">
+			<view class="banner">
+				<swiper indicator-dots="true" autoplay="true" circular="true" interval="2500" indicator-color="rgba(255,255,255,0.6)" indicator-active-color="#fff">
+					<block v-for="(item,index) in banner" :key="index">
+						<swiper-item>
+							<navigator :url='item.url' class='slide-navigator acea-row row-between-wrapper' hover-class='none'>
+								<image :src="item.img" class="slide-image"></image>
+							</navigator>
+						</swiper-item>
+					</block>
+				</swiper>
+			</view>
+			
+			<view class="icon">
+				<view><text class='iconfont icon-jiangchengben'></text>降成本</view>
+				<view><text class='iconfont icon-qukucun'></text>去库存</view>
+				<view><text class='iconfont icon-genggaoxiao'></text>更高效</view>
+				<view><text class='iconfont icon-xuanze1'></text>多选择</view>
+			</view>
+			
+			<view class="nav">
+				<view><image src="../../static/images/nav1.png"></image><view>开启分站</view></view>
+				<view><image src="../../static/images/nav2.png"></image><view>邀请好友</view></view>
+				<view><image src="../../static/images/nav3.png"></image><view>品质保证</view></view>
+				<view><image src="../../static/images/nav4.png"></image><view>降低成本</view></view>
+			</view>
+			
+			<view class="product">
+				<view class="title">
+					<text>排行榜</text>
+					<navigator class="more" url="/pages/product/index" open-type='switchTab' hover-class='none'>更多 <text class="iconfont icon-jiantou"></text></navigator>
+				</view>
+				<view class="list">
+					<scroll-view scroll-x="true" style="white-space: nowrap; display: flex" show-scrollbar="false">
+						<navigator class="item" v-for="(item,index) in sort_product" :key="index" :url="'/pages/product/detail?id='+item.id" hover-class='none'>
+							<image :src="item.img" mode=""></image>
+							<view class="name">{{item.title}}</view>
+							<view class="price">¥{{item.price}}</view>
+						</navigator>
+					</scroll-view>
+				</view>
+			</view>
+			
+			<view class="product">
+				<view class="title">
+					<text>新品上新</text>
+					<navigator class="more" url="/pages/product/index" open-type='switchTab' hover-class='none'>更多 <text class="iconfont icon-jiantou"></text></navigator>
+				</view>
+				<view class="list">
+					<scroll-view scroll-x="true" style="white-space: nowrap; display: flex" show-scrollbar="false">
+						<navigator class="item" v-for="(item,index) in new_product" :key="index" :url="'/pages/product/detail?id='+item.id" hover-class='none'>
+							<image :src="item.img" mode=""></image>
+							<view class="name">{{item.title}}</view>
+							<view class="price">¥{{item.price}}</view>
+						</navigator>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+		
+		<view class="hotSale"><text>热销单品</text>品质保证 一件代发</view>
+		<view class="productList">
+			<navigator class="item" v-for="(item,index) in hot_product" :key="index" :url="'/pages/product/detail?id='+item.id" hover-class='none'>
+				<image :src="item.img" class="image"></image>
+				<view class="info">
+					<view class="title">{{item.title}}</view>
+					<view class="text"><text class="price">¥{{item.price}}</text><text>{{item.wget}}kg/件</text></view>
+					<view class="express">快递:
+						<image src="../../static/images/express1.png" class="icon"></image>
+						<image src="../../static/images/express2.png" class="icon"></image>
+						<image src="../../static/images/express3.png" class="icon"></image>
+					</view>
+				</view>
+			</navigator>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getNotice,
+		getIndexData
+	} from '@/api/api.js';
+	export default {	
+		data() {
+			return{
+				spid: '',
+				indicatorDots: false,
+				notice: [],
+				banner: [],
+				sort_product: [],
+				new_product: [],
+				hot_product: []
+			}
+		},
+		onLoad(options) {
+			if (options.spid) {
+				this.spid = options.spid;
+			}
+			this.getNotice();
+			this.getIndexConfig();
+		},	
+		methods: {
+			// 公告
+			getNotice: function() {
+				getNotice().then(res => {
+					this.notice = res.data;
+				})
+			},
+			// 首页数据
+			getIndexConfig: function() {
+				getIndexData().then(res => {
+					this.banner = res.data.banner;
+					this.sort_product = res.data.sort_product;
+					this.new_product = res.data.new_product;
+					this.hot_product = res.data.hot_product;
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.notice{
+		background: #fff;
+		height: 90rpx;
+		display: flex;
+		padding: 20rpx 0;
+		text{
+			line-height: 50rpx;
+			border-right: 2rpx solid #ddd;
+			padding: 0 20rpx;
+		}
+		swiper{			
+			width: 650rpx;
+			height: 50rpx;
+			line-height: 50rpx;
+			overflow: hidden;
+			margin-left: 10rpx;
+			.news{
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;				
+			}
+		}
+	}
+	.content{
+		padding: 0 20rpx;
+	}
+	.banner{
+		margin-top: 20rpx;
+		.slide-image{
+			width:710rpx;
+			height:300rpx;
+			border-radius: 14rpx;
+		}
+	}
+	.icon{
+		color:#ff5c00;
+		display: flex;
+		justify-content:space-between;
+		margin-top: 20rpx;
+		text{
+			margin-right: 10rpx;
+		}
+	}
+	.nav{
+		display: flex;
+		justify-content:space-around;
+		padding-top:30rpx;
+		color:#333;
+		image{
+			width:110rpx;
+			height:110rpx;
+		}
+	}	
+	.product {
+		padding: 23rpx 20rpx;
+		margin-top:20rpx;
+		border-radius: 15rpx;
+		background-color: #fff;
+		overflow: hidden;
+		box-shadow: 0px 0px 16px 3px rgba(0, 0, 0, 0.04);	
+		.title {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;	
+			text {
+				font-size: 32rpx;
+				font-weight: bold;
+			}	
+			.more {
+				font-size: 26rpx;
+				color: #999;	
+				.iconfont {
+					margin-left: 6rpx;
+					font-size: 25rpx;
+				}
+			}
+		}
+		.list{
+			width: 100%;
+			margin-top: 27rpx;
+			.item{
+				display: inline-block;
+				width: 150rpx;
+				margin-right: 20rpx;
+				font-size: 24rpx;
+				image{
+					width:150rpx;
+					height:150rpx;
+				}
+				.name{
+					white-space: nowrap;
+					overflow: hidden;
+					text-overflow: ellipsis;
+				}
+				.price{
+					text-align: center;
+					color:#ff5c00;
+					margin-top: 8rpx;
+				}
+			}
+		}
+	}
+	.hotSale{
+		margin: 20rpx 0;
+		padding: 30rpx 20rpx;
+		color:#666;
+		background: #fff;
+		text{
+			color:#000;
+			font-size: 32rpx;
+			font-weight: bold;
+			border-right: 2rpx solid #ddd;
+			padding-right: 15rpx;
+			margin-right: 15rpx;
+		}
+	}
+	.productList {
+		display: flex;
+		justify-content:space-evenly;
+		flex-wrap:wrap;
+		.item{
+			background: #fff;
+			width:350rpx;
+			margin-bottom: 20rpx;
+			border-radius: 16rpx;
+			.image{
+				width:350rpx;
+				height:350rpx;
+				border-radius: 16rpx 16rpx 0 0;
+			}
+			.info{
+				padding: 15rpx;
+				.title{
+					white-space: nowrap;
+					overflow: hidden;
+					text-overflow: ellipsis;
+				}
+				.text{
+					display: flex;
+					align-items: center;
+					justify-content:space-between;
+					color:#666;
+					font-size: 24rpx;
+					margin: 10rpx 0;
+					.price{
+						color:#ff5c00;
+						font-size: 32rpx;
+					}
+				}
+				.express{
+					display: flex;
+					align-items: center;
+					.icon{
+						width:40rpx;
+						height:40rpx;
+						margin-right: 10rpx;
+						margin-top: -2rpx;
+					}
+				}
+			}			
+		}
+	}
+</style>

+ 42 - 0
pages/my/index.vue

@@ -0,0 +1,42 @@
+<template>
+	<view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		mapGetters
+	} from "vuex";
+	import {
+		toLogin
+	} from '@/libs/login.js';
+	export default {
+		data() {
+			return {
+				userInfo: {}
+			}
+		},
+		computed: mapGetters(['isLogin']),
+		onLoad() {
+		    if (this.isLogin) {
+		    	this.getUserInfo();
+		    }else{
+				toLogin();
+			}
+		},
+		methods: {
+			getUserInfo: function() {
+				let that = this;
+				getUserInfo().then(res => {
+					that.userInfo = res.data;
+					that.$store.commit("SETUID", res.data.uid);
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+</style>

+ 75 - 0
pages/news/index.vue

@@ -0,0 +1,75 @@
+<template>
+	<view class="news" :style="{ 'height': setHeight + 'px' }">
+		<view class="title">{{news.title}}</view>
+		<view class="time">{{news.time | formatDate}}</view>
+		<rich-text :nodes="news.content"></rich-text>
+	</view>
+</template>
+
+<script>
+	import {
+		newsDetail
+	} from '@/api/api.js';
+	export default {
+		data() {
+			return {
+				id: 0,
+				news: {},
+				setHeight: 0
+			}
+		},
+		//时间戳的处理
+		filters: {
+			formatDate: function(value) {
+				var date = new Date();
+				var month = date.getMonth() + 1;
+				var hours = date.getHours();
+				if (hours < 10)
+					hours = "0" + hours;
+				var minutes = date.getMinutes();
+				if (minutes < 10)
+					minutes = "0" + minutes;
+				var time = date.getFullYear() + "-" + month + "-" + date.getDate() +
+					" " + hours + ":" + minutes;
+				return time;
+			}	 
+		},
+		mounted() {
+		    let that = this
+		    uni.getSystemInfo({
+				success: function (res) {
+					that.setHeight = res.windowHeight
+				}
+		    })
+		},
+		onLoad(options) {
+			this.id = options.id;
+			this.getNewsDetail();
+		},
+		methods: {
+			getNewsDetail: function() {
+				let that = this;
+				newsDetail({id:that.id}).then(res => {
+					that.news = res.data;
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.news{
+		background: #fff;
+		padding: 30rpx;
+		color:#333;
+	}
+	.title{
+		font-size: 32rpx;
+		margin-bottom: 10rpx;
+		font-weight: bolder;
+	}
+	.time{
+		color:#999;
+		margin-bottom: 20rpx;
+	}
+</style>

+ 57 - 0
pages/not_defined/index.vue

@@ -0,0 +1,57 @@
+<template>
+  <view class="not-defined">
+    <img src="@/static/img/404.png" />
+
+    <view class="content">
+      <h3 class="title">页面未找到</h3>
+      <span
+        >抱歉!您访问的页面不存在,请返回上一级或点击下方按钮返回首页...</span
+      >
+    </view>
+
+    <view class="btn" @click="$Route.replace({ path: '/' })">
+      返回首页
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "NotDefined",
+  mounted() {
+  	console.log(this.$Route)
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.not-defined img {
+  width: 100%;
+  margin-top: 18%;
+}
+
+.content {
+  padding: 0 1rem;
+  text-align: center;
+  color: #44405e;
+  font-size: 15px;
+}
+
+.title {
+  margin-bottom: 0.6rem;
+  color: #302c48;
+  font-size: 20px;
+}
+
+.btn {
+  color: #fff;
+  background-color: #ef4c4c;
+  font-size: 16px;
+  padding: 0.16rem;
+  border-radius: 25px;
+  text-align: center;
+  width: 2.4rem;
+  margin: 0 auto;
+  margin-top: 1rem;
+}
+</style>

+ 182 - 0
pages/product/detail.vue

@@ -0,0 +1,182 @@
+<template>
+	<view class='product-con'>
+		<swiper indicator-dots="true" autoplay="false" circular="true" interval="2500" indicator-color="rgba(255,255,255,0.6)" indicator-active-color="#fff" class="swiper">
+			<block v-for="(item,index) in product.img" :key="index">
+				<swiper-item>
+					<image :src="item" class="slide-image"></image>
+				</swiper-item>
+			</block>
+		</swiper>
+		<view class="info">
+			<view class="title">{{product.title}}</view>
+			<view class="price">¥<text>{{product.price}}</text><span>{{product.wget}}kg/件</span></view>
+		</view>
+		<view class="warehouse">
+			<view class="line">仓库
+				<view class="express">
+					<block v-for="(item,index) in product.warehouse" :key="index">
+						<text>{{item}}</text>
+					</block>
+				</view>
+			</view>
+			<view class="line">库存<view>{{product.count}}件</view></view>
+		</view>
+		<!-- 热卖推荐 -->
+		<view class="recommend">
+			<view class="title acea-row row-center-wrapper">
+				<image src="../../static/images/ling.png"></image>
+				<view class="titleTxt">热卖推荐</view>
+				<image src="../../static/images/ling.png"></image>
+			</view>
+			<view class="list">
+				<view class="item" v-for="(item,index) in recommend" :key="index" @click="goDetail(item)">
+					<image :src="item.img"></image>
+					<view class="name line1">{{item.title}}</view>
+					<view class="price">¥{{item.price}}</view>
+				</view>
+			</view>
+		</view>
+		<view class='product-intro'>
+			<view class='title'>商品详情</view>
+			<rich-text :nodes="product.desc" class="conter"></rich-text>
+		</view>
+		<view class="buy">立即购买</view>
+	</view>
+</template>
+
+<script>
+	import {
+		recommend,
+		productDetail
+	} from '@/api/api.js';
+	export default {
+		data() {
+			return {
+				id: 0,
+				product: {},
+				recommend: []
+			}
+		},
+		onLoad(options) {
+			this.id = options.id;
+			this.getProductDetail();
+			this.getRecommend();
+		},
+		methods: {
+			getProductDetail: function() {
+				let that = this;
+				productDetail({id:that.id}).then(res => {
+					that.product = res.data;
+				})
+			},
+			getRecommend: function() {
+				let that = this;
+				recommend().then(res => {
+					that.recommend = res.data;
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.swiper{
+		height:750rpx;
+		.slide-image{
+			width:100%;
+			height:750rpx;
+		}
+	}
+	.info{
+		padding: 25rpx;
+		background: #fff;
+		.title{
+			font-size: 32rpx;
+			margin-bottom: 20rpx;
+		}
+		.price{
+			color:#f5222d;
+			text{
+				font-size: 52rpx;
+				font-weight: 600;
+			}
+			span{
+				color:#333;
+				margin-left: 30rpx;
+			}
+		}
+	}
+	.warehouse{
+		margin-top: 20rpx;
+		background: #fff;
+		.line{
+			display: flex;
+			padding: 0 25rpx;
+			line-height: 96rpx;
+			view{
+				margin-left: 30rpx;
+				flex-grow:1;
+			}
+			.express{
+				font-size: 24rpx;
+				color:#ff5c00;
+				border-bottom: 1px solid #ebedf0;
+				text{
+					border: 1rpx solid #ff5c00;
+					border-radius: 5rpx;
+					padding: 10rpx;
+					margin-right: 15rpx;
+				}
+			}
+		}
+	}
+	.recommend{
+		background-color: #fff;
+		margin-top: 20rpx;
+		.title{
+			height:98rpx;
+			image{
+				width:30rpx;
+				height:30rpx;
+			}
+			.titleTxt{
+				margin: 0 20rpx;
+				font-size: 30rpx;
+				background-image: linear-gradient(to right, #f57a37 0%, #f21b07 100%);
+				-webkit-background-clip: text;
+				-webkit-text-fill-color: transparent;
+			}
+		}
+		.list{
+			display: flex;
+			flex-wrap: wrap;
+			padding-left: 25rpx;
+			.item{
+				width:216rpx;
+				margin-right: 25rpx;
+				margin-bottom: 25rpx;
+				image{
+					width:216rpx;
+					height:216rpx;
+					border-radius: 6rpx;
+				}
+				.price{
+					color: #e32721;
+				}
+			}
+		}
+	}
+	.product-intro{
+		margin-bottom: 120rpx;
+	}
+	.buy{
+		background: #ff5c00;
+		color:#fff;
+		position: fixed;
+		bottom: 0;
+		width:100%;
+		line-height: 100rpx;
+		text-align: center;
+		font-size: 32rpx;
+	}
+</style>

+ 230 - 0
pages/product/index.vue

@@ -0,0 +1,230 @@
+<template>
+	<view>
+		<view class='header acea-row row-center-wrapper'>
+			<scroll-view scroll-x="true" show-scrollbar="false" class="sort">
+				<view v-for="(item,index) in sort" :key="index" :class='index==tab?"on":""' @click='change(index,item.type)'>
+					{{item.name}}
+				</view>
+			</scroll-view>
+		</view>
+		<view class='aside'>
+			<view class='item acea-row row-center-wrapper' :class='index==navActive?"on":""' v-for="(item,index) in warehouse"
+			 :key="index" @click='tap(index,item.id)'><text>{{item.name}}</text></view>
+		</view>
+		<view class='conter'>			
+			<scroll-view scroll-y="true" show-scrollbar="false">
+				<view class="list">
+					<block v-for="(item , index) in productList" :key="index">
+						<navigator class="product" :url="'/pages/product/detail?id='+item.id" hover-class='none'>
+							<image :src="item.img"></image>
+							<view class="info">									
+								<view>{{item.title}}</view>
+								<view class="price">¥{{item.price}}</view>
+								<view class="text">
+									<view>{{item.wget}}kg/件</view>
+									<view>库存{{item.count}}</view>
+								</view>
+							</view>					
+						</navigator>
+					</block>					
+					<view class='loadingicon acea-row row-center-wrapper' v-if='productList.length > 0'>
+						<text class='loading iconfont icon-jiazai' :hidden='loading==false'></text>{{loadTitle}}
+					</view>
+				</view>				
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getWarehouse,
+		productList
+	} from '@/api/api.js';
+	export default {
+		data() {
+			return {
+				sort: [
+					{
+						'name': '综合排序',
+						'type': 'all'
+					},
+					{
+						'name': '价格',
+						'type': 'price'
+					},
+					{
+						'name': '重量',
+						'type': 'wget'
+					}
+				],
+				warehouse: [
+					{
+						'name': '全部',
+						'id': 0
+					}
+				],
+				productList: [],
+				tab: 0,				
+				navActive: 0,
+				height: 0,
+				where: {
+					type: 'all',
+					warehouse: 0,
+					page: 1,
+					limit: 20
+				},
+				loadend: false,
+				loading: false,
+				loadTitle: '加载更多'
+			}
+		},
+		mounted() {
+		    let that = this
+		    uni.getSystemInfo({
+				success: function (res) {
+					that.height = (res.windowHeight) * (750 / res.windowWidth) - 80;
+				}
+		    })
+		},
+		onLoad() {
+			this.getWarehouse();
+			this.getProductList();
+		},
+		methods: {
+			change: function(index, type) {
+				let that = this;
+				that.tab = index;
+				that.$set(that.where, 'type', type)
+				that.$set(that.where, 'page', 1);
+				that.$set(that, 'productList', []);
+				that.loadend = false;
+				that.getProductList();
+			},
+			tap: function(index, id) {
+				let that = this;
+				that.navActive = index;
+				that.$set(that.where, 'warehouse', id)
+				that.$set(that.where, 'page', 1);
+				that.$set(that, 'productList', []);
+				that.loadend = false;
+				that.getProductList();
+			},
+			getWarehouse: function() {
+				let that = this;
+				getWarehouse().then(res => {
+					that.warehouse = that.warehouse.concat(res.data);
+				})
+			},
+			getProductList: function() {
+				let that = this;
+				if (that.loadend) return;
+				if (that.loading) return;
+				that.loading = true;
+				that.loadTitle = '';
+				productList(that.where).then(res => {
+					let list = res.data.list;
+					let productList = that.productList.concat(list);
+					let loadend = list.length < that.where.limit;
+					that.loadend = loadend;
+					that.loading = false;
+					that.loadTitle = loadend ? '已全部加载' : '加载更多';
+					that.$set(that, 'productList', productList);
+					that.$set(that.where, 'page', that.where.page + 1);
+				}).catch(err => {
+					that.loading = false;
+					that.loadTitle = '加载更多';
+				});
+			},
+			onReachBottom() {
+				this.getProductList();
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.header {
+		width: 570rpx;
+		height: 80rpx;
+		background-color: #fff;
+		position: fixed;
+		left: 180rpx;
+		right: 0;
+		top: 0;
+		z-index: 9;
+		border-bottom: 1rpx solid #f5f5f5;
+	}
+	.sort view{
+		display: inline-block;
+		width:33.3%;
+		text-align: center;
+	}
+	.sort view.on{color: #ff5c00;}
+
+	.aside {
+		position: fixed;
+		width: 180rpx;
+		left: 0;
+		bottom: 0;
+		top:0;
+		background-color: #f7f7f7;
+		overflow-y: auto;
+		overflow-x: hidden;
+	}
+
+	.aside .item {
+		width: 100%;
+		font-size: 26rpx;
+		color: #424242;
+		padding: 30rpx 10rpx;
+	}
+
+	.aside .item.on {
+		background-color: #fff;
+		border-left: 4rpx solid #ff5c00;
+		width: 100%;
+		text-align: center;
+		color: #ff5c00;
+		font-weight: bold;
+	}
+
+	.conter {
+		margin: 80rpx 0 0 180rpx;
+		padding: 0 20rpx;
+		background-color: #fff;
+	}
+	
+	.conter .list .product{
+		display: flex;
+		padding: 20rpx 0;
+		border-top: 1rpx solid #f5f5f5;
+	}
+	.conter .list .product:nth-of-type(1){
+		border-top: none;
+	}
+	
+	.conter .list .product image{
+		width:160rpx;
+		height:160rpx;
+	}
+	
+	.conter .list .product .info{
+		padding-left: 20rpx;
+	}
+	
+	.price{
+		color: #f5222d;
+		font-size: 32rpx;
+		font-weight: bold;
+		margin-top: 40rpx;
+	}
+	
+	.text{
+		width:350rpx;
+		display: flex;
+		justify-content:space-between;
+		font-size: 24rpx;
+		color:#666;
+	}
+</style>

+ 154 - 0
pages/users/login/index.vue

@@ -0,0 +1,154 @@
+<template>
+	<view class="login" :style="{ 'height': setHeight + 'px' }">
+		<view class="logo">
+			<image src="../../../static/images/logo.png"></image>
+			<view>登录巴巴礼品网</view>
+		</view>
+		<div class="form">
+			<form @submit.prevent="submit">
+				<div class="item">
+					<div class="acea-row row-middle">
+						<image src="../../../static/images/phone_1.png"></image>
+						<input type="text" placeholder="请输入绑定的手机号" placeholder-class="placeholder" v-model="userName" required />
+					</div>
+				</div>
+				<div class="item">
+					<div class="acea-row row-middle">
+						<image src="../../../static/images/code_2.png"></image>
+						<input type="password" placeholder="请输入登录密码" placeholder-class="placeholder" v-model="password" required />
+					</div>
+				</div>
+			</form>
+			<view class="goto">
+				<navigator hover-class="none" url="/pages/users/retrievePassword/index">
+					忘记密码?
+				</navigator>
+				<navigator class="zhuce" hover-class="none" url="/pages/users/register/index">
+					注册账号
+				</navigator>
+			</view>
+			<view class="btn" @click="submit">登录</view>
+			<navigator class="return" hover-class="none" url="/pages/index/index" open-type='switchTab'>继续浏览<text class="iconfont icon-jiantou"></text></navigator>
+		</div>
+	</view>
+</template>
+
+<script>
+	import {
+		loginApi
+	} from '@/api/api.js';
+	const BACK_URL = "login_back_url";
+	export default {
+		data() {
+			return {
+				setHeight: 0,
+				userName: '',
+				password: ''
+			}
+		},
+		mounted() {
+		    let that = this
+		    uni.getSystemInfo({
+				success: function (res) {
+					that.setHeight = res.windowHeight
+				}
+		    })
+		},
+		methods: {
+			async submit() {
+				let that = this;
+				if (!that.userName) return that.$util.Tips({
+					title: '请填写账号'
+				});
+				if (!/^[\w\d]{5,16}$/i.test(that.userName)) return that.$util.Tips({
+					title: '请输入正确的账号'
+				});
+				if (!that.password) return that.$util.Tips({
+					title: '请填写密码'
+				});
+				loginApi({
+					check: true,
+					userName: that.userName,
+					password: that.password
+				}).then(res => {
+					that.$store.commit("LOGIN", {
+						'token': res.data.token,
+						'time': 30
+					});
+					that.$store.commit("UPDATE_USERINFO", res.data.user_info);
+					const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+					that.$Cache.clear(BACK_URL);
+				}).catch(err => {
+					that.$util.Tips({
+						title: err
+					});
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.login{
+		padding-top: 200rpx;
+		background: #fff;
+	}
+	.logo{
+		text-align: center;
+		image{
+			width:140rpx;
+			height:140rpx;
+		}
+		view{
+			font-size: 32rpx;
+			font-weight: 700;
+			letter-spacing: 10rpx;
+			color:#262626;
+		}
+	}
+	.form{
+		padding: 40rpx;
+		.item {
+		    border-bottom: 1rpx solid #ededed;
+		    padding: 45rpx 0 20rpx 0;
+			image{
+				width:40rpx;
+				height:40rpx;
+				margin-right: 20rpx;
+			}
+			input{
+				flex-grow: 1;
+			}
+			.placeholder{
+				color:#ccc;
+			}
+		}
+		.goto{
+			display: flex;
+			justify-content: space-between;	
+			margin-top: 45rpx;
+			color:#666;
+			.zhuce{
+				color:#ff5c00;
+			}
+		}
+		.btn{
+			font-size: 35rpx;
+			color: #fff;
+			height: 86rpx;
+			border-radius: 40rpx;
+			background: linear-gradient(90deg,#f35447 0,#ff8e3c);
+			text-align: center;
+			line-height: 86rpx;
+			margin-top: 70rpx;
+		}
+		.return{
+			color:#666;
+			text-align: right;
+			margin-top: 30rpx;
+			.iconfont{
+				font-size: 23rpx;
+			}
+		}
+	}
+</style>

+ 320 - 0
pages/users/login/index111.vue

@@ -0,0 +1,320 @@
+<template>
+	<view class="register">
+		<view class="shading">
+			<view class="pictrue acea-row row-center-wrapper">
+				<image :src="logoUrl" v-if="logoUrl"></image>
+				<image src="/static/images/logo2.png" v-else></image>
+			</view>
+		</view>
+		<view class="whiteBg" v-if="formItem === 1">
+			<view class="title acea-row row-center-wrapper">
+				<view class="item" :class="current === index ? 'on' : ''" v-for="(item, index) in navList" @click="navTap(index)"
+				 :key="index">
+					{{ item }}
+				</view>
+			</view>
+			<view class="list" :hidden="current !== 0">
+				<form @submit.prevent="submit">
+					<view class="item">
+						<view class="acea-row row-middle">
+							<image src="/static/images/phone_1.png"></image>
+							<input type="text" placeholder="输入手机号码" v-model="account" placeholder-class="placeholder" class="input" />
+						</view>
+					</view>
+					<view class="item">
+						<view class="acea-row row-middle">
+							<image src="/static/images/code_2.png"></image>
+							<input type="password" placeholder="填写登录密码" v-model="password" placeholder-class="placeholder" class="input" />
+						</view>
+					</view>
+				</form>
+				<navigator url="/pages/retrieve_password/index" class="forgetPwd">
+					<text class="iconfont icon-wenti"></text>忘记密码
+				</navigator>
+			</view>
+			<view class="list" :hidden="current !== 1">
+				<view class="item">
+					<view class="acea-row row-middle">
+						<image src="/static/images/phone_1.png"></image>
+						<input type="text" placeholder="输入手机号码" placeholder-class="placeholder" class="input" v-model="account" />
+					</view>
+				</view>
+				<view class="item">
+					<view class="align-left acea-row row-middle">
+						<image src="/static/images/code_2.png"></image>
+						<input type="text" placeholder="填写验证码" class="codeIput" v-model="captcha" placeholder-class="placeholder" />
+						<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
+							{{ text }}
+						</button>
+					</view>
+				</view>
+			</view>
+			<view class="logon" @click="loginMobile" :hidden="current !== 1">登录</view>
+			<view class="logon" @click="submit" :hidden="current === 1">登录</view>
+			<view class="tip">
+				没有账号?
+				<text @click="formItem = 2" class="font-color">立即注册</text>
+			</view>
+		</view>
+		<view class="whiteBg" v-else>
+			<view class="title">注册账号</view>
+			<view class="list">
+				<view class="item">
+					<view class="acea-row row-middle">
+						<image src="/static/images/phone_1.png"></image>
+						<input type="text" placeholder="输入手机号码" placeholder-class="placeholder" class="input" v-model="account" />
+					</view>
+				</view>
+				<view class="item">
+					<view class="align-left acea-row row-middle">
+						<image src="/static/images/code_2.png"></image>
+						<input type="text" placeholder="填写验证码" class="codeIput" v-model="captcha" placeholder-class="placeholder" />
+						<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
+							{{ text }}
+						</button>
+					</view>
+				</view>
+				<view class="item">
+					<view class="acea-row row-middle">
+						<image src="/static/images/code_1.png"></image>
+						<input type="password" placeholder="填写您的登录密码" placeholder-class="placeholder" class="input" v-model="password" />
+					</view>
+				</view>
+			</view>
+			<view class="logon" @click="register">注册</view>
+			<view class="tip">
+				已有账号?
+				<text @click="formItem = 1" class="font-color">立即登录</text>
+			</view>
+		</view>
+		<view class="bottom"></view>
+	</view>
+</template>
+<script>
+	import sendVerifyCode from "@/mixins/SendVerifyCode";
+	import {
+		loginH5,
+		loginMobile,
+		registerVerify,
+		register,
+		getCodeApi,
+		getUserInfo
+	} from '@/api/user.js';
+	import {
+		getLogo
+	} from "@/api/public";
+	import dayjs from "dayjs";
+	import {
+		BACK_URL
+	} from '@/config/cache';
+	export default {
+		mixins: [sendVerifyCode],
+		data() {
+			return {
+				navList: ["账号登录", "快速登录"],
+				current: 1,
+				account: "",
+				password: "",
+				captcha: "",
+				formItem: 1,
+				type: "login",
+				logoUrl: "",
+				keyCode: "",
+			}
+		},
+		onLoad() {
+			this.getLogoImage();
+			this.getCode();
+		},
+		methods: {
+			// 获取keyCode
+			getCode() {
+				let that = this
+				getCodeApi()
+					.then(res => {
+						this.keyCode = res.data.key;
+					})
+					.catch(res => {
+						that.$util.Tips({title: res});
+					});
+			},
+			getLogoImage() {
+				let that = this;
+				getLogo(2).then(res => {
+					that.logoUrl = res.data.logo_url;
+				});
+			},
+			loginMobile() {
+				let that = this;
+				if (!that.account) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				if (!that.captcha) return that.$util.Tips({
+					title: '请填写验证码'
+				});
+				if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
+					title: '请输入正确的验证码'
+				});
+				loginMobile({
+						phone: that.account,
+						captcha: that.captcha,
+						spread: that.$Cache.get("spread")
+					})
+					.then(res => {
+						let data = res.data;
+						let newTime = Math.round(new Date() / 1000);
+						that.$store.commit("LOGIN", {
+							'token': data.token,
+							'time': dayjs(data.expires_time) - newTime
+						});
+						const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+						that.$Cache.clear(BACK_URL);
+						getUserInfo().then(res=>{
+							that.$store.commit("SETUID", res.data.uid);
+							if (backUrl === '/pages/index/index' || backUrl === '/pages/order_addcart/order_addcart' || backUrl ===
+								'/pages/user/index' || backUrl === '/pages/goods_cate/goods_cate') {
+							
+								uni.switchTab({
+									url: backUrl
+								});
+							
+							} else {
+								uni.redirectTo({
+									url: backUrl
+								});
+							}
+						})
+						
+						
+						
+					})
+					.catch(res => {
+						that.$util.Tips({
+							title: res
+						});
+					});
+			},
+			register() {
+				let that = this;
+				if (!that.account) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				if (!that.captcha) return that.$util.Tips({
+					title: '请填写验证码'
+				});
+				if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
+					title: '请输入正确的验证码'
+				});
+				if (!that.password) return that.$util.Tips({
+					title: '请填写密码'
+				});
+				if (!/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/i.test(that.password)) return that.$util.Tips({
+					title: '您输入的密码过于简单'
+				});
+				register({
+						account: that.account,
+						captcha: that.captcha,
+						password: that.password,
+						spread: that.$Cache.get("spread")
+					})
+					.then(res => {
+						that.$util.Tips({
+							title: res.msg
+						});
+						that.formItem = 1;
+					})
+					.catch(res => {
+						that.$util.Tips({
+							title: res.msg
+						});
+					});
+			},
+			async code() {
+				let that = this;
+				if (!that.account) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				if (that.formItem == 2) that.type = "register";
+				await registerVerify({
+						phone: that.account,
+						type: that.type,
+						key:that.keyCode,
+						code:that.captcha
+					})
+					.then(res => {
+						that.$util.Tips({
+							title: res.msg
+						});
+						that.sendCode();
+					})
+					.catch(res => {
+						that.$util.Tips({
+							title: res
+						});
+					});
+			},
+			navTap: function(index) {
+				this.current = index;
+			},
+			submit() {
+				let that = this;
+				if (!that.account) return that.$util.Tips({
+					title: '请填写账号'
+				});
+				if (!/^[\w\d]{5,16}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的账号'
+				});
+				if (!that.password) return that.$util.Tips({
+					title: '请填写密码'
+				});
+				// if (!/^[0-9A-Za-z]{6,16}$/i.test(that.password)) return that.$util.Tips({
+				// 	title: '请输入正确的密码'
+				// });
+				loginH5({
+						account: that.account,
+						password: that.password
+					})
+					.then(({data}) => {
+						let newTime = Math.round(new Date() / 1000);
+						that.$store.commit("LOGIN", {
+							'token': data.token,
+							'time': dayjs(data.expires_time) - newTime
+						});
+						const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+						that.$Cache.clear(BACK_URL);
+						getUserInfo().then(res=>{
+							that.$store.commit("SETUID", res.data.uid);
+							if (backUrl === '/pages/index/index' || backUrl === '/pages/order_addcart/order_addcart' || backUrl ===
+								'/pages/user/index' || backUrl === '/pages/goods_cate/goods_cate') {
+								uni.switchTab({
+									url: backUrl
+								});
+							} else {
+								uni.redirectTo({
+									url: backUrl
+								});
+							}
+						})
+					})
+					.catch(e => {
+						that.$util.Tips({
+							title: e
+						});
+					});
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 330 - 0
pages/users/register/index.vue

@@ -0,0 +1,330 @@
+<template>
+	<view class="reg" :style="{ 'height': setHeight + 'px' }">
+		<view class="title">欢迎注册巴巴礼品网</view>
+		<div class="form" v-if="step === 1">
+			<form @submit="submit1" report-submit='true'>
+				<view class="verify">
+					<view class="list">
+						<view class="item">
+							<input type='number' placeholder='填写手机号码' placeholder-class='placeholder' v-model="phone"></input>
+						</view>
+						<view class="item acea-row row-between-wrapper">
+							<input type='number' placeholder='填写验证码' placeholder-class='placeholder' class="codeIput" v-model="yzm"></input>
+							<button class="code font-color" :class="disabled === true ? 'on' : ''" :disabled='disabled' @click="code">
+								{{ text }}
+							</button>
+						</view>
+					</view>
+					<button form-type="submit" class="confirmBnt">立即注册</button>
+				</view>
+			</form>
+			<view class="login">已有账号,<navigator hover-class="none" url="/pages/users/login/index">立即登录?</navigator></view>
+		</div>
+		<div class="form2" v-else>
+			<view class='avatar acea-row row-center-wrapper row-column' @click='uploadpic'>
+				<view v-if='avatar ==""'>
+					<text class='iconfont icon-icon25201'></text>
+					<view>上传图片</view>
+				</view>
+				<view v-else>
+					<image :src="avatar"></image>
+				</view>
+			</view>
+			<div class="item">
+				<div class="acea-row row-middle">
+					<input type="text" placeholder="请输入用户昵称" placeholder-class="placeholder" v-model="nickname" required />
+				</div>
+			</div>
+			<div class="item">
+				<div class="acea-row row-middle">
+					<input type="password" placeholder="请输入密码" placeholder-class="placeholder" v-model="password" required />
+				</div>
+			</div>
+			<div class="item">
+				<div class="acea-row row-middle">
+					<input type="password" placeholder="再次确认密码" placeholder-class="placeholder" v-model="qrPassword" required />
+				</div>
+			</div>
+			<div class="item">
+				<div class="acea-row row-middle">
+					<input type="text" placeholder="请输入您的微信号" placeholder-class="placeholder" v-model="weixin_name" required />
+				</div>
+			</div>
+			<button class="btn" @click="submit2">完成注册</button>
+			<button class="back" @click="back">返回</button>
+			<view class="login">已有账号,<navigator hover-class="none" url="/pages/users/login/index">立即登录?</navigator></view>
+		</div>
+	</view>
+</template>
+
+<script>
+	import {
+		registerVerify,
+		ApiReg1,
+		ApiReg2
+	} from '@/api/api.js';
+	import CryptoJS from "@/libs/CryptoJS";
+	import sendVerifyCode from "@/mixins/SendVerifyCode";
+	const BACK_URL = "login_back_url";
+	export default {
+		mixins: [sendVerifyCode],
+		data() {
+			return {
+				setHeight: 0,
+				phone:'',
+				yzm:'',
+				step:1,
+				token: '',
+				avatar: '',
+				nickname: '',
+				password: '',
+				qrPassword: '',
+				weixin_name: ''
+			}
+		},
+		mounted() {
+		    let that = this
+		    uni.getSystemInfo({
+				success: function (res) {
+					that.setHeight = res.windowHeight
+				}
+		    })
+		},
+		methods: {
+			async code() {
+				let that = this;
+				if (!that.phone) return that.$util.Tips({
+					title: '请填写手机号码!'
+				});
+				if (!(/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.phone))) return that.$util.Tips({
+					title: '请输入正确的手机号码!'
+				});
+				var secret_key = "b1bd7a4b8da3e47ce58e73b9e5f656c4";
+				var AES = new CryptoJS.AES(secret_key);
+				await registerVerify({
+			        mobile: that.phone,
+			        token: AES.encrypt(that.phone),
+			        time: new Date().getTime()
+			    }).then(res => {
+					that.$util.Tips({
+						title: res.msg
+					});
+					that.sendCode();
+				}).catch(err => {
+					return that.$util.Tips({
+						title: err
+					});
+				});
+			},
+			async submit1() {
+				let that = this;
+				if (!that.phone) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!(/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.phone))) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				if (!that.yzm) return that.$util.Tips({
+					title: '请填写验证码'
+				});
+				if (!/^[\w\d]+$/i.test(that.yzm)) return that.$util.Tips({
+					title: '请输入正确的验证码'
+				});
+				ApiReg1({
+					mobile: that.phone,
+					yzm: that.yzm
+				}).then(res => {
+					that.token = res.data.token;
+					that.step = 2;
+				}).catch(res => {
+					that.$util.Tips({
+						title: res
+					});
+				});
+			},
+			uploadpic: function () {
+				let that = this;
+				that.$util.uploadImageOne('upload/index', function (res) {
+					that.avatar = res.data.img;
+				});				
+			},
+			submit2 () {
+				let that = this;
+				if (!that.nickname) return that.$util.Tips({
+					title: '请输入用户昵称'
+				});
+				if (!that.password) return that.$util.Tips({
+					title: '请输入密码'
+				});
+				if (that.password.length < 6) return that.$util.Tips({
+					title: '密码不能少于6位'
+				});
+				if (!that.qrPassword) return that.$util.Tips({
+					title: '请输入确认密码'
+				});
+				if (that.qrPassword !== that.password) return that.$util.Tips({
+					title: '二次密码不相等'
+				});
+			    ApiReg2({
+					token: that.token,
+			    	avatar: that.avatar,
+			    	nickname: that.nickname,
+			    	password: that.password,
+			    	qrPassword: that.qrPassword,
+			    	weixin_name: that.weixin_name
+			    }).then(res => {
+			    	that.$store.commit("LOGIN", {
+			    		'token': res.data.token,
+						'time': 30
+			    	});
+					that.$store.commit("UPDATE_USERINFO", res.data.user_info);
+			    	const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+			    	that.$Cache.clear(BACK_URL);
+			    }).catch(err => {
+			    	that.$util.Tips({
+			    		title: err
+			    	});
+			    });
+			},
+			back(){
+				this.step = 1;
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.reg{
+		background: #fff;
+	}
+	.title{
+		font-size: 42rpx;
+		text-align: center;
+		padding-top: 60rpx;
+	}
+	.verify .phone {
+		font-size: 32rpx;
+		font-weight: bold;
+		text-align: center;
+		margin-top: 55rpx;
+	}
+	
+	.verify .list {
+		width: 580rpx;
+		margin: 53rpx auto 0 auto;
+	}
+	
+	.verify .list .item {
+		width: 100%;
+		height: 110rpx;
+		border-bottom: 2rpx solid #f0f0f0;
+	}
+	
+	.verify .list .item input {
+		width: 100%;
+		height: 100%;
+		font-size: 32rpx;
+	}
+	
+	.verify .list .item .placeholder {
+		color: #b9b9bc;
+	}
+	
+	.verify .list .item input.codeIput {
+		width: 340rpx;
+	}
+	
+	.verify .list .item .code {
+		font-size: 32rpx;
+		background-color: #fff;
+	}
+	
+	.verify .list .item .code.on {
+		color: #b9b9bc !important;
+	}
+	
+	.verify .confirmBnt {
+		font-size: 32rpx;
+		width: 580rpx;
+		height: 90rpx;
+		border-radius: 45rpx;
+		color: #fff;
+		margin: 92rpx auto 0 auto;
+		text-align: center;
+		line-height: 90rpx;
+		background: #ff5c00;
+	}
+	.form .login{
+		display: flex;
+		justify-content: center;
+		margin-top: 30rpx;
+		navigator{
+			color:#ff5c00;
+		}
+	}
+	.form2{
+		padding: 40rpx;
+		.avatar{
+			width:140rpx;
+			height:140rpx;
+			font-size:22rpx;
+			color:#bbb;
+			border:1rpx dashed #ddd;
+			margin: 20rpx auto;
+			text-align: center;
+			.iconfont{
+				font-size: 50rpx;
+			}
+			image{
+				width:140rpx;
+				height:140rpx;
+			}
+		}
+		.item {
+		    border-bottom: 1rpx solid #ededed;
+		    padding: 45rpx 0 20rpx 0;
+			image{
+				width:40rpx;
+				height:40rpx;
+				margin-right: 20rpx;
+			}
+			input{
+				flex-grow: 1;
+				font-size: 28rpx;
+			}
+			.placeholder{
+				color:#ccc;
+			}
+		}
+		.btn {
+			font-size: 32rpx;
+			width: 580rpx;
+			height: 85rpx;
+			border-radius: 45rpx;
+			color: #fff;
+			margin: 80rpx auto 0 auto;
+			text-align: center;
+			line-height: 85rpx;
+			background: #ff5c00;
+		}
+		.back{
+			font-size: 32rpx;
+			width: 580rpx;
+			height: 85rpx;
+			border-radius: 45rpx;
+			margin: 20rpx auto 0 auto;
+			text-align: center;
+			line-height: 85rpx;
+			border: 1rpx solid #dcdee2;
+			color:#515a6e;
+		}
+		.login{
+			display: flex;
+			justify-content: center;
+			margin-top: 30rpx;
+			navigator{
+				color:#ff5c00;
+			}
+		}
+	}
+</style>

File diff suppressed because it is too large
+ 10 - 0
plugin/animate/animate.min.css


+ 973 - 0
plugin/clipboard/clipboard.js

@@ -0,0 +1,973 @@
+/*!
+ * clipboard.js v2.0.6
+ * https://clipboardjs.com/
+ * 
+ * Licensed MIT © Zeno Rocha
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else if(typeof exports === 'object')
+		exports["ClipboardJS"] = factory();
+	else
+		root["ClipboardJS"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 6);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+function select(element) {
+    var selectedText;
+
+    if (element.nodeName === 'SELECT') {
+        element.focus();
+
+        selectedText = element.value;
+    }
+    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
+        var isReadOnly = element.hasAttribute('readonly');
+
+        if (!isReadOnly) {
+            element.setAttribute('readonly', '');
+        }
+
+        element.select();
+        element.setSelectionRange(0, element.value.length);
+
+        if (!isReadOnly) {
+            element.removeAttribute('readonly');
+        }
+
+        selectedText = element.value;
+    }
+    else {
+        if (element.hasAttribute('contenteditable')) {
+            element.focus();
+        }
+
+        var selection = window.getSelection();
+        var range = document.createRange();
+
+        range.selectNodeContents(element);
+        selection.removeAllRanges();
+        selection.addRange(range);
+
+        selectedText = selection.toString();
+    }
+
+    return selectedText;
+}
+
+module.exports = select;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+function E () {
+  // Keep this empty so it's easier to inherit from
+  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
+}
+
+E.prototype = {
+  on: function (name, callback, ctx) {
+    var e = this.e || (this.e = {});
+
+    (e[name] || (e[name] = [])).push({
+      fn: callback,
+      ctx: ctx
+    });
+
+    return this;
+  },
+
+  once: function (name, callback, ctx) {
+    var self = this;
+    function listener () {
+      self.off(name, listener);
+      callback.apply(ctx, arguments);
+    };
+
+    listener._ = callback
+    return this.on(name, listener, ctx);
+  },
+
+  emit: function (name) {
+    var data = [].slice.call(arguments, 1);
+    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
+    var i = 0;
+    var len = evtArr.length;
+
+    for (i; i < len; i++) {
+      evtArr[i].fn.apply(evtArr[i].ctx, data);
+    }
+
+    return this;
+  },
+
+  off: function (name, callback) {
+    var e = this.e || (this.e = {});
+    var evts = e[name];
+    var liveEvents = [];
+
+    if (evts && callback) {
+      for (var i = 0, len = evts.length; i < len; i++) {
+        if (evts[i].fn !== callback && evts[i].fn._ !== callback)
+          liveEvents.push(evts[i]);
+      }
+    }
+
+    // Remove event from queue to prevent memory leak
+    // Suggested by https://github.com/lazd
+    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
+
+    (liveEvents.length)
+      ? e[name] = liveEvents
+      : delete e[name];
+
+    return this;
+  }
+};
+
+module.exports = E;
+module.exports.TinyEmitter = E;
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var is = __webpack_require__(3);
+var delegate = __webpack_require__(4);
+
+/**
+ * Validates all params and calls the right
+ * listener function based on its target type.
+ *
+ * @param {String|HTMLElement|HTMLCollection|NodeList} target
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listen(target, type, callback) {
+    if (!target && !type && !callback) {
+        throw new Error('Missing required arguments');
+    }
+
+    if (!is.string(type)) {
+        throw new TypeError('Second argument must be a String');
+    }
+
+    if (!is.fn(callback)) {
+        throw new TypeError('Third argument must be a Function');
+    }
+
+    if (is.node(target)) {
+        return listenNode(target, type, callback);
+    }
+    else if (is.nodeList(target)) {
+        return listenNodeList(target, type, callback);
+    }
+    else if (is.string(target)) {
+        return listenSelector(target, type, callback);
+    }
+    else {
+        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
+    }
+}
+
+/**
+ * Adds an event listener to a HTML element
+ * and returns a remove listener function.
+ *
+ * @param {HTMLElement} node
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNode(node, type, callback) {
+    node.addEventListener(type, callback);
+
+    return {
+        destroy: function() {
+            node.removeEventListener(type, callback);
+        }
+    }
+}
+
+/**
+ * Add an event listener to a list of HTML elements
+ * and returns a remove listener function.
+ *
+ * @param {NodeList|HTMLCollection} nodeList
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenNodeList(nodeList, type, callback) {
+    Array.prototype.forEach.call(nodeList, function(node) {
+        node.addEventListener(type, callback);
+    });
+
+    return {
+        destroy: function() {
+            Array.prototype.forEach.call(nodeList, function(node) {
+                node.removeEventListener(type, callback);
+            });
+        }
+    }
+}
+
+/**
+ * Add an event listener to a selector
+ * and returns a remove listener function.
+ *
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Object}
+ */
+function listenSelector(selector, type, callback) {
+    return delegate(document.body, selector, type, callback);
+}
+
+module.exports = listen;
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+/**
+ * Check if argument is a HTML element.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.node = function(value) {
+    return value !== undefined
+        && value instanceof HTMLElement
+        && value.nodeType === 1;
+};
+
+/**
+ * Check if argument is a list of HTML elements.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.nodeList = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return value !== undefined
+        && (type === '[object NodeList]' || type === '[object HTMLCollection]')
+        && ('length' in value)
+        && (value.length === 0 || exports.node(value[0]));
+};
+
+/**
+ * Check if argument is a string.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.string = function(value) {
+    return typeof value === 'string'
+        || value instanceof String;
+};
+
+/**
+ * Check if argument is a function.
+ *
+ * @param {Object} value
+ * @return {Boolean}
+ */
+exports.fn = function(value) {
+    var type = Object.prototype.toString.call(value);
+
+    return type === '[object Function]';
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var closest = __webpack_require__(5);
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function _delegate(element, selector, type, callback, useCapture) {
+    var listenerFn = listener.apply(this, arguments);
+
+    element.addEventListener(type, listenerFn, useCapture);
+
+    return {
+        destroy: function() {
+            element.removeEventListener(type, listenerFn, useCapture);
+        }
+    }
+}
+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element|String|Array} [elements]
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @param {Boolean} useCapture
+ * @return {Object}
+ */
+function delegate(elements, selector, type, callback, useCapture) {
+    // Handle the regular Element usage
+    if (typeof elements.addEventListener === 'function') {
+        return _delegate.apply(null, arguments);
+    }
+
+    // Handle Element-less usage, it defaults to global delegation
+    if (typeof type === 'function') {
+        // Use `document` as the first parameter, then apply arguments
+        // This is a short way to .unshift `arguments` without running into deoptimizations
+        return _delegate.bind(null, document).apply(null, arguments);
+    }
+
+    // Handle Selector-based usage
+    if (typeof elements === 'string') {
+        elements = document.querySelectorAll(elements);
+    }
+
+    // Handle Array-like based usage
+    return Array.prototype.map.call(elements, function (element) {
+        return _delegate(element, selector, type, callback, useCapture);
+    });
+}
+
+/**
+ * Finds closest match and invokes callback.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @param {String} type
+ * @param {Function} callback
+ * @return {Function}
+ */
+function listener(element, selector, type, callback) {
+    return function(e) {
+        e.delegateTarget = closest(e.target, selector);
+
+        if (e.delegateTarget) {
+            callback.call(element, e);
+        }
+    }
+}
+
+module.exports = delegate;
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports) {
+
+var DOCUMENT_NODE_TYPE = 9;
+
+/**
+ * A polyfill for Element.matches()
+ */
+if (typeof Element !== 'undefined' && !Element.prototype.matches) {
+    var proto = Element.prototype;
+
+    proto.matches = proto.matchesSelector ||
+                    proto.mozMatchesSelector ||
+                    proto.msMatchesSelector ||
+                    proto.oMatchesSelector ||
+                    proto.webkitMatchesSelector;
+}
+
+/**
+ * Finds the closest parent that matches a selector.
+ *
+ * @param {Element} element
+ * @param {String} selector
+ * @return {Function}
+ */
+function closest (element, selector) {
+    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
+        if (typeof element.matches === 'function' &&
+            element.matches(selector)) {
+          return element;
+        }
+        element = element.parentNode;
+    }
+}
+
+module.exports = closest;
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: ./node_modules/select/src/select.js
+var src_select = __webpack_require__(0);
+var select_default = /*#__PURE__*/__webpack_require__.n(src_select);
+
+// CONCATENATED MODULE: ./src/clipboard-action.js
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+
+
+/**
+ * Inner class which performs selection from either `text` or `target`
+ * properties and then executes copy or cut operations.
+ */
+
+var clipboard_action_ClipboardAction = function () {
+    /**
+     * @param {Object} options
+     */
+    function ClipboardAction(options) {
+        _classCallCheck(this, ClipboardAction);
+
+        this.resolveOptions(options);
+        this.initSelection();
+    }
+
+    /**
+     * Defines base properties passed from constructor.
+     * @param {Object} options
+     */
+
+
+    _createClass(ClipboardAction, [{
+        key: 'resolveOptions',
+        value: function resolveOptions() {
+            var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+            this.action = options.action;
+            this.container = options.container;
+            this.emitter = options.emitter;
+            this.target = options.target;
+            this.text = options.text;
+            this.trigger = options.trigger;
+
+            this.selectedText = '';
+        }
+
+        /**
+         * Decides which selection strategy is going to be applied based
+         * on the existence of `text` and `target` properties.
+         */
+
+    }, {
+        key: 'initSelection',
+        value: function initSelection() {
+            if (this.text) {
+                this.selectFake();
+            } else if (this.target) {
+                this.selectTarget();
+            }
+        }
+
+        /**
+         * Creates a fake textarea element, sets its value from `text` property,
+         * and makes a selection on it.
+         */
+
+    }, {
+        key: 'selectFake',
+        value: function selectFake() {
+            var _this = this;
+
+            var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
+
+            this.removeFake();
+
+            this.fakeHandlerCallback = function () {
+                return _this.removeFake();
+            };
+            this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;
+
+            this.fakeElem = document.createElement('textarea');
+            // Prevent zooming on iOS
+            this.fakeElem.style.fontSize = '12pt';
+            // Reset box model
+            this.fakeElem.style.border = '0';
+            this.fakeElem.style.padding = '0';
+            this.fakeElem.style.margin = '0';
+            // Move element out of screen horizontally
+            this.fakeElem.style.position = 'absolute';
+            this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
+            // Move element to the same position vertically
+            var yPosition = window.pageYOffset || document.documentElement.scrollTop;
+            this.fakeElem.style.top = yPosition + 'px';
+
+            this.fakeElem.setAttribute('readonly', '');
+            this.fakeElem.value = this.text;
+
+            this.container.appendChild(this.fakeElem);
+
+            this.selectedText = select_default()(this.fakeElem);
+            this.copyText();
+        }
+
+        /**
+         * Only removes the fake element after another click event, that way
+         * a user can hit `Ctrl+C` to copy because selection still exists.
+         */
+
+    }, {
+        key: 'removeFake',
+        value: function removeFake() {
+            if (this.fakeHandler) {
+                this.container.removeEventListener('click', this.fakeHandlerCallback);
+                this.fakeHandler = null;
+                this.fakeHandlerCallback = null;
+            }
+
+            if (this.fakeElem) {
+                this.container.removeChild(this.fakeElem);
+                this.fakeElem = null;
+            }
+        }
+
+        /**
+         * Selects the content from element passed on `target` property.
+         */
+
+    }, {
+        key: 'selectTarget',
+        value: function selectTarget() {
+            this.selectedText = select_default()(this.target);
+            this.copyText();
+        }
+
+        /**
+         * Executes the copy operation based on the current selection.
+         */
+
+    }, {
+        key: 'copyText',
+        value: function copyText() {
+            var succeeded = void 0;
+
+            try {
+                succeeded = document.execCommand(this.action);
+            } catch (err) {
+                succeeded = false;
+            }
+
+            this.handleResult(succeeded);
+        }
+
+        /**
+         * Fires an event based on the copy operation result.
+         * @param {Boolean} succeeded
+         */
+
+    }, {
+        key: 'handleResult',
+        value: function handleResult(succeeded) {
+            this.emitter.emit(succeeded ? 'success' : 'error', {
+                action: this.action,
+                text: this.selectedText,
+                trigger: this.trigger,
+                clearSelection: this.clearSelection.bind(this)
+            });
+        }
+
+        /**
+         * Moves focus away from `target` and back to the trigger, removes current selection.
+         */
+
+    }, {
+        key: 'clearSelection',
+        value: function clearSelection() {
+            if (this.trigger) {
+                this.trigger.focus();
+            }
+            document.activeElement.blur();
+            window.getSelection().removeAllRanges();
+        }
+
+        /**
+         * Sets the `action` to be performed which can be either 'copy' or 'cut'.
+         * @param {String} action
+         */
+
+    }, {
+        key: 'destroy',
+
+
+        /**
+         * Destroy lifecycle.
+         */
+        value: function destroy() {
+            this.removeFake();
+        }
+    }, {
+        key: 'action',
+        set: function set() {
+            var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
+
+            this._action = action;
+
+            if (this._action !== 'copy' && this._action !== 'cut') {
+                throw new Error('Invalid "action" value, use either "copy" or "cut"');
+            }
+        }
+
+        /**
+         * Gets the `action` property.
+         * @return {String}
+         */
+        ,
+        get: function get() {
+            return this._action;
+        }
+
+        /**
+         * Sets the `target` property using an element
+         * that will be have its content copied.
+         * @param {Element} target
+         */
+
+    }, {
+        key: 'target',
+        set: function set(target) {
+            if (target !== undefined) {
+                if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
+                    if (this.action === 'copy' && target.hasAttribute('disabled')) {
+                        throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
+                    }
+
+                    if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
+                        throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
+                    }
+
+                    this._target = target;
+                } else {
+                    throw new Error('Invalid "target" value, use a valid Element');
+                }
+            }
+        }
+
+        /**
+         * Gets the `target` property.
+         * @return {String|HTMLElement}
+         */
+        ,
+        get: function get() {
+            return this._target;
+        }
+    }]);
+
+    return ClipboardAction;
+}();
+
+/* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction);
+// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js
+var tiny_emitter = __webpack_require__(1);
+var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);
+
+// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js
+var listen = __webpack_require__(2);
+var listen_default = /*#__PURE__*/__webpack_require__.n(listen);
+
+// CONCATENATED MODULE: ./src/clipboard.js
+var clipboard_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+
+
+
+
+/**
+ * Base class which takes one or more elements, adds event listeners to them,
+ * and instantiates a new `ClipboardAction` on each click.
+ */
+
+var clipboard_Clipboard = function (_Emitter) {
+    _inherits(Clipboard, _Emitter);
+
+    /**
+     * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
+     * @param {Object} options
+     */
+    function Clipboard(trigger, options) {
+        clipboard_classCallCheck(this, Clipboard);
+
+        var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
+
+        _this.resolveOptions(options);
+        _this.listenClick(trigger);
+        return _this;
+    }
+
+    /**
+     * Defines if attributes would be resolved using internal setter functions
+     * or custom functions that were passed in the constructor.
+     * @param {Object} options
+     */
+
+
+    clipboard_createClass(Clipboard, [{
+        key: 'resolveOptions',
+        value: function resolveOptions() {
+            var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+            this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
+            this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
+            this.text = typeof options.text === 'function' ? options.text : this.defaultText;
+            this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;
+        }
+
+        /**
+         * Adds a click event listener to the passed trigger.
+         * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
+         */
+
+    }, {
+        key: 'listenClick',
+        value: function listenClick(trigger) {
+            var _this2 = this;
+
+            this.listener = listen_default()(trigger, 'click', function (e) {
+                return _this2.onClick(e);
+            });
+        }
+
+        /**
+         * Defines a new `ClipboardAction` on each click event.
+         * @param {Event} e
+         */
+
+    }, {
+        key: 'onClick',
+        value: function onClick(e) {
+            var trigger = e.delegateTarget || e.currentTarget;
+
+            if (this.clipboardAction) {
+                this.clipboardAction = null;
+            }
+
+            this.clipboardAction = new clipboard_action({
+                action: this.action(trigger),
+                target: this.target(trigger),
+                text: this.text(trigger),
+                container: this.container,
+                trigger: trigger,
+                emitter: this
+            });
+        }
+
+        /**
+         * Default `action` lookup function.
+         * @param {Element} trigger
+         */
+
+    }, {
+        key: 'defaultAction',
+        value: function defaultAction(trigger) {
+            return getAttributeValue('action', trigger);
+        }
+
+        /**
+         * Default `target` lookup function.
+         * @param {Element} trigger
+         */
+
+    }, {
+        key: 'defaultTarget',
+        value: function defaultTarget(trigger) {
+            var selector = getAttributeValue('target', trigger);
+
+            if (selector) {
+                return document.querySelector(selector);
+            }
+        }
+
+        /**
+         * Returns the support of the given action, or all actions if no action is
+         * given.
+         * @param {String} [action]
+         */
+
+    }, {
+        key: 'defaultText',
+
+
+        /**
+         * Default `text` lookup function.
+         * @param {Element} trigger
+         */
+        value: function defaultText(trigger) {
+            return getAttributeValue('text', trigger);
+        }
+
+        /**
+         * Destroy lifecycle.
+         */
+
+    }, {
+        key: 'destroy',
+        value: function destroy() {
+            this.listener.destroy();
+
+            if (this.clipboardAction) {
+                this.clipboardAction.destroy();
+                this.clipboardAction = null;
+            }
+        }
+    }], [{
+        key: 'isSupported',
+        value: function isSupported() {
+            var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
+
+            var actions = typeof action === 'string' ? [action] : action;
+            var support = !!document.queryCommandSupported;
+
+            actions.forEach(function (action) {
+                support = support && !!document.queryCommandSupported(action);
+            });
+
+            return support;
+        }
+    }]);
+
+    return Clipboard;
+}(tiny_emitter_default.a);
+
+/**
+ * Helper function to retrieve attribute value.
+ * @param {String} suffix
+ * @param {Element} element
+ */
+
+
+function getAttributeValue(suffix, element) {
+    var attribute = 'data-clipboard-' + suffix;
+
+    if (!element.hasAttribute(attribute)) {
+        return;
+    }
+
+    return element.getAttribute(attribute);
+}
+
+/* harmony default export */ var clipboard = __webpack_exports__["default"] = (clipboard_Clipboard);
+
+/***/ })
+/******/ ])["default"];
+});

File diff suppressed because it is too large
+ 0 - 0
plugin/dayjs/dayjs.min.js


File diff suppressed because it is too large
+ 0 - 0
plugin/emoji-awesome/css/apple.min.css


File diff suppressed because it is too large
+ 0 - 0
plugin/emoji-awesome/css/emojione.min.css


File diff suppressed because it is too large
+ 0 - 0
plugin/emoji-awesome/css/facebook.min.css


File diff suppressed because it is too large
+ 0 - 0
plugin/emoji-awesome/css/google.min.css


File diff suppressed because it is too large
+ 0 - 0
plugin/emoji-awesome/css/messenger.min.css


File diff suppressed because it is too large
+ 0 - 0
plugin/emoji-awesome/css/twitter.min.css


BIN
plugin/emoji-awesome/img/sheet_apple_64_indexed_256colors.png


BIN
plugin/emoji-awesome/img/sheet_emojione_64_indexed_128.png


BIN
plugin/emoji-awesome/img/sheet_facebook_64_indexed_128.png


BIN
plugin/emoji-awesome/img/sheet_google_64_indexed_128.png


BIN
plugin/emoji-awesome/img/sheet_messenger_64_indexed_128.png


BIN
plugin/emoji-awesome/img/sheet_twitter_64_indexed_128.png


+ 147 - 0
plugin/image-tools/index.js

@@ -0,0 +1,147 @@
+function getLocalFilePath(path) {
+    if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
+        return path
+    }
+    if (path.indexOf('file://') === 0) {
+        return path
+    }
+    if (path.indexOf('/storage/emulated/0/') === 0) {
+        return path
+    }
+    if (path.indexOf('/') === 0) {
+        var localFilePath = plus.io.convertAbsoluteFileSystem(path)
+        if (localFilePath !== path) {
+            return localFilePath
+        } else {
+            path = path.substr(1)
+        }
+    }
+    return '_www/' + path
+}
+
+export function pathToBase64(path) {
+    return new Promise(function(resolve, reject) {
+        if (typeof window === 'object' && 'document' in window) {
+            if (typeof FileReader === 'function') {
+                var xhr = new XMLHttpRequest()
+                xhr.open('GET', path, true)
+                xhr.responseType = 'blob'
+                xhr.onload = function() {
+                    if (this.status === 200) {
+                        let fileReader = new FileReader()
+                        fileReader.onload = function(e) {
+                            resolve(e.target.result)
+                        }
+                        fileReader.onerror = reject
+                        fileReader.readAsDataURL(this.response)
+                    }
+                }
+                xhr.onerror = reject
+                xhr.send()
+                return
+            }
+            var canvas = document.createElement('canvas')
+            var c2x = canvas.getContext('2d')
+            var img = new Image
+            img.onload = function() {
+                canvas.width = img.width
+                canvas.height = img.height
+                c2x.drawImage(img, 0, 0)
+                resolve(canvas.toDataURL())
+                canvas.height = canvas.width = 0
+            }
+            img.onerror = reject
+            img.src = path
+            return
+        }
+        if (typeof plus === 'object') {
+            plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
+                entry.file(function(file) {
+                    var fileReader = new plus.io.FileReader()
+                    fileReader.onload = function(data) {
+                        resolve(data.target.result)
+                    }
+                    fileReader.onerror = function(error) {
+                        reject(error)
+                    }
+                    fileReader.readAsDataURL(file)
+                }, function(error) {
+                    reject(error)
+                })
+            }, function(error) {
+                reject(error)
+            })
+            return
+        }
+        if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
+            wx.getFileSystemManager().readFile({
+                filePath: path,
+                encoding: 'base64',
+                success: function(res) {
+                    resolve('data:image/png;base64,' + res.data)
+                },
+                fail: function(error) {
+                    reject(error)
+                }
+            })
+            return
+        }
+        reject(new Error('not support'))
+    })
+}
+
+export function base64ToPath(base64) {
+    return new Promise(function(resolve, reject) {
+        if (typeof window === 'object' && 'document' in window) {
+            base64 = base64.split(',')
+            var type = base64[0].match(/:(.*?);/)[1]
+            var str = atob(base64[1])
+            var n = str.length
+            var array = new Uint8Array(n)
+            while (n--) {
+                array[n] = str.charCodeAt(n)
+            }
+            return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type })))
+        }
+        var extName = base64.match(/data\:\S+\/(\S+);/)
+        if (extName) {
+            extName = extName[1]
+        } else {
+            reject(new Error('base64 error'))
+        }
+        var fileName = Date.now() + '.' + extName
+        if (typeof plus === 'object') {
+            var bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
+            bitmap.loadBase64Data(base64, function() {
+                var filePath = '_doc/uniapp_temp/' + fileName
+                bitmap.save(filePath, {}, function() {
+                    bitmap.clear()
+                    resolve(filePath)
+                }, function(error) {
+                    bitmap.clear()
+                    reject(error)
+                })
+            }, function(error) {
+                bitmap.clear()
+                reject(error)
+            })
+            return
+        }
+        if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
+            var filePath = wx.env.USER_DATA_PATH + '/' + fileName
+            wx.getFileSystemManager().writeFile({
+                filePath: filePath,
+                data: base64.replace(/^data:\S+\/\S+;base64,/, ''),
+                encoding: 'base64',
+                success: function() {
+                    resolve(filePath)
+                },
+                fail: function(error) {
+                    reject(error)
+                }
+            })
+            return
+        }
+        reject(new Error('not support'))
+    })
+}

File diff suppressed because it is too large
+ 0 - 0
plugin/jweixin-module/index.js


File diff suppressed because it is too large
+ 179 - 0
static/css/base.css


File diff suppressed because it is too large
+ 2 - 0
static/css/guildford.css


File diff suppressed because it is too large
+ 291 - 0
static/css/style.scss


File diff suppressed because it is too large
+ 3 - 0
static/iconfont/iconfont.css


BIN
static/iconfont/iconfont.eot


File diff suppressed because it is too large
+ 22 - 0
static/iconfont/iconfont.svg


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