diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..faffad9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+# Created by .ignore support plugin (hsz.mobi)
+.idea/
+node_modules/
+unpackage/
diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json
new file mode 100644
index 0000000..ee5be77
--- /dev/null
+++ b/.hbuilderx/launch.json
@@ -0,0 +1,20 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"app-plus" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}
diff --git a/.project b/.project
new file mode 100644
index 0000000..8921e9c
--- /dev/null
+++ b/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>mobile-phone-shell-applet</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..75db8f8
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,131 @@
+<script>
+	import updata from '@/util/updata.js'; //版本更新
+	import homeservice from '@/service/homeservice.js';
+	export default {
+		globalData: {
+			typefacedata: [],
+			num: 0
+		},
+		onLaunch: function(options) {
+			//console.log(options)
+			console.log('App Launch');
+			//设备信息
+			let app = uni.getSystemInfoSync()
+			app.machine_id = options.query.machine_id || 0
+			app.s = 'DeviceAccess.create'
+			this.$base.appInformation = app
+			this.$base.appInformationOld = JSON.parse(JSON.stringify(app));
+			//console.log(this.$base.appInformationOld)
+			homeservice.DeviceAccesscreate(app).then(result => {
+				console.log(result)
+			}).catch(err => {
+				console.log(err)
+			});
+			// 字体列表
+			homeservice.queryList({
+				s: 'Material.fontFamilyList'
+			}).then(result => {
+				result.forEach(item => {
+					item.long = false
+					item.textlong = null
+				})
+				result.unshift({
+					id: 0,
+					key: "SourceHanSansCN-Normal",
+					remark: "",
+					title: "思源黑体",
+					textlong: true,
+					long: true
+				})
+				this.globalData.typefacedata = result
+				this.$base.typefacedata = this.globalData.typefacedata
+				let t1 = new Date().getTime();
+				let that = this
+				this.globalData.typefacedata.forEach(textlist => {
+					uni.loadFontFace({
+						global: true,
+						family: textlist.key,
+						source: 'url(' + textlist.remark + ')',
+						desc: {
+							weight: 100
+						},
+						success: function(success) {
+							textlist.textlong = true
+							// console.log(success)
+						},
+						fail: function(fail) {
+							textlist.textlong = false
+							// console.log(fail)
+						},
+						complete(res) {
+							//console.log(res)
+							textlist.long = true
+							that.globalData.typefacedata.forEach(item => {
+								if (item.long == true) {
+									that.globalData.num++
+								}
+							})
+							that.$base.typefacedata = that.globalData.typefacedata
+							if (that.globalData.num == that.globalData.typefacedata.length) {
+								//console.log("加载字体耗时 "+ (new Date().getTime() - t1) +" 毫秒")
+								that.$base.typefacedata = that.globalData.typefacedata
+							}
+							that.globalData.num = 0
+						}
+					})
+				})
+			}).catch(err => {
+
+			});
+		},
+		onShow: function() {
+			console.log('App Show');
+			//调用监听网络状态的方法
+			wx.getNetworkType({
+				success: function(res) {
+					if (res.networkType == 'none') {
+						uni.showToast({
+							title: '网络似乎不太顺畅',
+							icon: 'none',
+							duration: 2000
+						});
+					}
+				}
+			})
+		},
+		onHide: function() {
+			console.log('App Hide');
+		}
+	};
+</script>
+
+<style lang="scss">
+	page,
+	.page {
+		height: 100%;
+		width: 100%;
+		background-color: #ebeef5;
+		font-size: 28upx;
+		font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif;
+	}
+
+	// hover-class="loginBtn-hover"
+	.hover-class-bg {
+		background: #888888 !important;
+	}
+
+	.hover-class-text {
+		color: #888888 !important;
+	}
+
+	// 单行
+	// overflow: hidden; /*文本超出隐藏*/
+	// text-overflow: ellipsis; /*文本超出显示省略号*/
+	// white-space: nowrap; /*超出的空白区域不换行*/
+	// word-break:break-all; /*如果文本中有英文,可以使一个单词能够在换行时进行拆分*/
+	// 多行
+	// overflow: hidden; /*文本超出隐藏*/
+	// display:-webkit-box; /*盒子模型微弹性伸缩模型*/
+	// -webkit-box-orient: vertical;/*伸缩盒子的子元素垂直排列*/
+	// -webkit-line-clamp: 2; /*文本显示3行*/
+</style>
diff --git a/api/AddressApi.js b/api/AddressApi.js
new file mode 100644
index 0000000..8817b2d
--- /dev/null
+++ b/api/AddressApi.js
@@ -0,0 +1,39 @@
+import Enums from '../util/Enums'
+import {
+  _request,
+  _queryPage
+} from './BaseApi'
+// 获取用户地址列表:http://tprint.refinecolor.com/zijie/index/getAddressList
+// 获取单个地址:http://tprint.refinecolor.com/zijie/index/getAddress
+// 添加用户地址:http://tprint.refinecolor.com/zijie/index/addAddress
+// 更新用户地址:http://tprint.refinecolor.com/zijie/index/updateAddress
+// 删除用户地址:http://tprint.refinecolor.com/zijie/index/deleteAddress
+/**
+ * 查询收货地址列表
+ * @param {*} params
+ */
+export const _queryAddressList = (params = {}) => _request({url: '/douyin/User/getAddressList', params, token: true, method: 'get'})
+
+/**
+ * 添加收货地址
+ * @param {*} params
+ */
+export const _saveAddress = (params = {}) => _request({url: '/douyin/User/addAddress', params, token: true, method: 'post'})
+
+/**
+ * 查询收货地址详情
+ * @param {*} id
+ */
+export const _queryAddress = (params = {}) => _request({url: '/douyin/User/getAddress', params, token: true, method: 'get'})
+
+/**
+ * 删除收货地址
+ * @param {*} id
+ */
+export const _deleteAddress = (params = {}) => _request({url: '/douyin/User/deleteAddress', params, token: true, method: 'post'})
+
+/**
+ * 修改收货地址
+ * @param {*} id
+ */
+export const _updateAddress = (params = {}) => _request({url: '/douyin/User/updateAddress', params, token: true, method: 'post'})
\ No newline at end of file
diff --git a/api/BaseApi.js b/api/BaseApi.js
new file mode 100644
index 0000000..add7364
--- /dev/null
+++ b/api/BaseApi.js
@@ -0,0 +1,75 @@
+import request from '../util/request'
+import $n from '../util/nothing'
+import Enums from '../util/Enums'
+import Qs from 'qs'
+
+/**
+ * ajax请求
+ * @param {*}
+ */
+export function _request ({
+  url,
+  params = {},
+  method = 'post',
+  token = false,
+  contentType = Enums.ContentType.JSON_UTF8,
+  headers = {}
+} = {}) {
+  headers['Content-Type'] = contentType;
+  return request.request(url, $n._caseValue(contentType, Enums.ContentType.FORM_UTF8, Qs.stringify(params), params), {
+    method: method,
+    _token: token,
+    headers
+  })
+}
+
+/**
+ * 分页查询
+ * @param {*}
+ */
+export function _queryPage ({
+  url,
+  params = {},
+  page = {},
+  method = 'post',
+  token = false,
+  contentType = Enums.ContentType.JSON_UTF8
+} = {}) {
+  return _request({
+    url,
+    params,
+    method,
+    token,
+    contentType,
+    headers: {
+      'pageNum': page.pageNum,
+      'pageSize': page.pageSize
+    }
+  })
+}
+/**
+ * 流式分页查询
+ * @param {*}
+ */
+export function _queryFlowPage ({
+  url,
+  params = {},
+  page = {},
+  method = 'post',
+  token = false,
+  contentType = Enums.ContentType.JSON_UTF8
+} = {}) {
+  return _request({
+    url,
+    params,
+    method,
+    token,
+    contentType,
+    headers: {
+      'beginTime': page.beginTime,
+      'direction': page.direction,
+      'orderBy': page.orderBy,
+      'pageSize': page.pageSize
+    }
+  })
+}
diff --git a/api/UserApi.js b/api/UserApi.js
new file mode 100644
index 0000000..916cc0d
--- /dev/null
+++ b/api/UserApi.js
@@ -0,0 +1,22 @@
+import Enums from '../util/Enums'
+import {
+  _request
+} from './BaseApi'
+
+/**
+ * 登录
+ * @param {*} params
+ */
+export const _login = (params = {}) => _request({url: '/userphoneapplets/index', params, method: 'post', contentType: Enums.ContentType.FORM_UTF8})
+
+/**
+ * 查询用户信息
+ * @param {*} params
+ */
+// export const _queryUser = (id = null) => _request({url: '/member/info/' + id, params: {}, token: true, method: 'get'})
+
+/**
+ * 刷新用户Token
+ * @param {*} params
+ */
+// export const _refreshToken = (oldToken = null) => _request({url: '/sso/refreshToken', params: {token: oldToken}, token: true, method: 'post'})
diff --git a/api/homeApi.js b/api/homeApi.js
new file mode 100644
index 0000000..e871947
--- /dev/null
+++ b/api/homeApi.js
@@ -0,0 +1,35 @@
+import Enums from '../util/Enums'
+import {
+  _request
+} from './BaseApi'
+
+/**
+ * contentType: Enums.ContentType.FORM_UTF8
+ * 色彩公园手机壳
+ * @param {*} params
+ */
+
+// 手机壳接口
+export const route = (params = {}) => _request({url: '/userphoneapplets/index', params, method: 'post',token: true})
+
+// 手机壳接口-延迟访问时间
+export const route_timeout = (params = {}) => _request({url: '/userphoneapplets/index', params, method: 'post',token: true,timeout: true})
+
+// 色彩公园公用接口
+export const T_route = (params = {}) => _request({url: '/userapplets/index/index', params, method: 'post',token: true})
+
+// 色彩公园公用接口-延迟访问时间
+export const usertshirtsapplets = (params = {}) => _request({url: '/usertshirtsapplets/index/index', params, method: 'post',token: true,timeout: true})
+
+
+// 创建订单
+export const route_CreateOrder = (params = {}) => _request({url: '/zijie/index/createOrder', params, method: 'post',token: true})
+
+// 接口:userapalets/index
+export const userapalets_Index = (params = {}) => _request({url: '/userapplets/index/index', params, method: 'post',token: true})
+// 接口:userapalets/index
+// s=DeviceAccess.checkModelGoods
+// machine_id=
+// brand=
+// model=
+
diff --git a/cache/CacheKeys.js b/cache/CacheKeys.js
new file mode 100644
index 0000000..c99f976
--- /dev/null
+++ b/cache/CacheKeys.js
@@ -0,0 +1,14 @@
+export default {
+	app: {
+		APP_USER: 'APP_USER', // app信息
+		WX_INFO: 'WX_INFO', // 微信信息
+		USER_INFO: 'USER_INFO', // 用户信息
+		DATA_SYNC_TIME: 'DATA_SYNC_TIME', // 数据同步时间
+		BACKGROUND_COLOR: 'BACKGROUND_COLOR', // 背景色
+		NAVIGATION_BAR_BACKGROUND_COLOR: 'NAVIGATION_BAR_BACKGROUND_COLOR', // 导航条背景颜色
+		NAVIGATION_BAR_FRONT_COLOR: 'NAVIGATION_BAR_FRONT_COLOR' // 导航条前景颜色
+	},
+	SEARCH: 'SEARCH', // 搜索
+	DECIMALS: 'DECIMALS', // 小数位数
+	DICT: 'DICT_' // 字典
+}
diff --git a/cache/index.js b/cache/index.js
new file mode 100644
index 0000000..89ade90
--- /dev/null
+++ b/cache/index.js
@@ -0,0 +1,48 @@
+import CacheKeys from './CacheKeys'
+
+/**
+ * 本地存储KEY前缀
+ */
+const _KEY_PREFIX = 'HL_'
+
+/**
+ * 用户级缓存定义
+ */
+const CACHE_LEVEL_USER = []
+
+/**
+ * 构造缓存KEY
+ * @param {*} key
+ */
+const buildKey = (key) => {
+	let newKey = _KEY_PREFIX
+	newKey += CACHE_LEVEL_USER.indexOf(key) !== -1 ? (newKey.endsWith('_') ? '' : '_') + this.$AppContext.$store.getters.sysUser
+		.username : ''
+	return newKey + (newKey.endsWith('_') ? '' : '_') + key
+}
+
+/**
+ * 缓存对象API
+ */
+const cache = {
+	$Keys: CacheKeys,
+	_KEY_PREFIX: _KEY_PREFIX,
+	set: (object) => uni.setStorage(Object.assign(object, {
+		key: buildKey(object.key)
+	})),
+	get: (object) => uni.getStorage(Object.assign(object, {
+		key: buildKey(object.key)
+	})),
+	setSync: (key, data) => uni.setStorageSync(buildKey(key), data),
+	getSync: (key) => uni.getStorageSync(buildKey(key)),
+	remove: (object) => uni.removeStorage(Object.assign(object, {
+		key: buildKey(object.key)
+	})),
+	removeSync: (key) => uni.removeStorageSync(buildKey(key)),
+	clear: (object) => uni.clearStorage(object),
+	clearSync: () => uni.clearStorageSync(),
+	getInfo: (object) => uni.getStorageInfo(object),
+	getInfoSync: () => uni.getStorageInfoSync()
+}
+
+export default cache
diff --git a/components/Progress-Bar/Progress-Bar.vue b/components/Progress-Bar/Progress-Bar.vue
new file mode 100644
index 0000000..693cdeb
--- /dev/null
+++ b/components/Progress-Bar/Progress-Bar.vue
@@ -0,0 +1,423 @@
+<template>
+	<view style="width: 60%; margin: auto;">
+		<view class="progress" :class="Type">
+			<view class="progress-text" v-if="Vice == true">{{ Width + '%' }}</view>
+			<view class="progress-bar" :style="{width: Width+'%'}"><view class="progress-text" v-if="Main == true">{{ Width + '%' }}</view></view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		// 进度条百分比
+		Width: {
+			type: Number,
+			default: 0
+		},
+		// 进度条样式
+		/*
+			aqua
+			copper
+			candy
+			neon
+			shine
+			zigzag
+			diamond
+			hearts
+			sparkle
+		*/
+		Type: {
+			type: String,
+			default: 'aqua',
+		},
+		// 主进度显示百分比
+		Main: {
+			type: Boolean,
+			default: true,
+		},
+		// 副进度显示百分比
+		Vice: {
+			type: Boolean,
+			default: true,
+		},
+		
+	},
+	data() {
+		return {
+
+		};
+	},
+	methods: {}
+};
+</script>
+
+<style>
+.progress {
+    position: relative;
+    z-index: 5;
+    background: #484848;
+    border: 10px solid #282828;
+    border-radius: 20px;
+    display: inline-block;
+    box-shadow: 0 5px 17px rgba(40, 40, 40, 0.5), 0 0 3px 1px rgba(40, 40, 40, 0.5) inset;
+}
+
+.progress-text {
+    position: absolute;
+    font: bold 14px/20px Arial;
+    text-align: center;
+    top: 0;
+    left: 0;
+}
+
+.progress,
+.progress-bar,
+.progress-text {
+    /* width: 710rpx; */
+	width: 100%;
+    height: 40rpx;
+}
+
+.progress .progress-text:first-child {
+    z-index: 5;
+    color: white;
+}
+
+.progress .progress-text:last-child {
+    z-index: 10;
+    color: black;
+}
+
+.progress-bar {
+    overflow: hidden;
+    position: relative;
+    z-index: 10;
+    border-radius: 12px;
+    width: 0;
+    -moz-transition: width .2s linear;
+    -webkit-transition: width .2s linear;
+    -o-transition: width .2s linear;
+    transition: width .2s linear;
+}
+
+/* Test Style */
+.progress.test .progress-bar {
+    background-color: #00baba;
+    background-image: -moz-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: -webkit-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: -o-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: -ms-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: linear-gradient(to right, #d1fffb 0%, #00baba 100%);
+    background-size: 200px 20px;
+    overflow: visible;
+}
+
+.progress.test .progress-text:first-child {
+    display: none;
+}
+
+.progress.test .progress-text:last-child {
+    left: auto;
+    top: auto;
+    bottom: -26px;
+    right: -12px;
+    display: block;
+    background-color: #00baba;
+    width: 40px;
+    height: 20px;
+    border-radius: 3px;
+}
+
+.test[data-width='0%'] .progress-text:last-child {
+    display: none;
+}
+
+.progress.test .progress-text:last-child:before {
+    position: absolute;
+    left: 12px;
+    top: -6px;
+    content: '';
+    width: 0;
+    height: 0;
+    border-style: solid;
+    border-width: 0 6px 6px 6px;
+    border-color: transparent transparent #00baba transparent;
+}
+
+/* Copper style */
+.progress.copper .progress-bar {
+    background-color: #b68d4c;
+    background-image: -moz-linear-gradient(top, #f3e2c7 0%, #b68d4c 51%, #e9d4b3 100%);
+    background-image: -webkit-linear-gradient(top, #f3e2c7 0%, #b68d4c 51%, #e9d4b3 100%);
+    background-image: -ms-linear-gradient(top, #f3e2c7 0%, #b68d4c 51%, #e9d4b3 100%);
+    background-image: linear-gradient(to bottom, #f3e2c7 0%, #b68d4c 51%, #e9d4b3 100%);
+    box-shadow: inset 2px 2px 3px 0 rgba(255, 255, 255, 0.75), inset -3px 0 3px 0 rgba(255, 255, 255, 0.75);
+}
+
+/* Aqua Style */
+.progress.aqua .progress-bar {
+    background-color: #00baba;
+    background-image: -moz-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: -webkit-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: -o-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: -ms-linear-gradient(left, #d1fffb 0%, #00baba 100%);
+    background-image: linear-gradient(to right, #d1fffb 0%, #00baba 100%);
+}
+
+/* Candystripe style */
+.progress.candy .progress-bar {
+    background-color: #d00;
+    box-shadow: 0 0 6px 2px rgba(255, 255, 255, 0.3) inset;
+    background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.35) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.35) 50%, rgba(255, 255, 255, 0.35) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0));
+    background-repeat: repeat-x;
+    background-size: 20px 20px;
+    -webkit-animation: candystripe 1s linear infinite;
+    -moz-animation: candystripe 1s linear infinite;
+    animation: candystripe 1s linear infinite;
+}
+
+@-webkit-keyframes candystripe {
+    to {
+        background-position: 20px 0;
+    }
+}
+
+@-moz-keyframes candystripe {
+    to {
+        background-position: 20px 0;
+    }
+}
+
+@keyframes candystripe {
+    to {
+        background-position: 20px 0;
+    }
+}
+
+/* Pulsating Neon style */
+.progress.neon .progress-bar {
+    background-color: #fff;
+    box-shadow: 0 0 5px #01fe32 inset, 0 0 16px #08ff35, 0 0 20px #08ff35, 0 0 15px #08ff35;
+    -webkit-animation: pulse 2s linear infinite;
+    -moz-animation: pulse 2s linear infinite;
+    animation: pulse 2s linear infinite;
+}
+
+@-webkit-keyframes pulse {
+    50% {
+        box-shadow: 0 0 5px #01fe32 inset, 0 0 10px #08ff35, 0 0 10px #08ff35, 0 0 10px #08ff35;
+    }
+}
+
+@-moz-keyframes pulse {
+    50% {
+        box-shadow: 0 0 5px #01fe32 inset, 0 0 10px #08ff35, 0 0 10px #08ff35, 0 0 10px #08ff35;
+    }
+}
+
+@keyframes pulse {
+    50% {
+        box-shadow: 0 0 5px #01fe32 inset, 0 0 10px #08ff35, 0 0 10px #08ff35, 0 0 10px #08ff35;
+    }
+}
+
+/* Shine style */
+.progress.shine .progress-bar {
+    background-color: #00BA0C;
+    background-image: -moz-linear-gradient(left, #00BA0C 0%, #00BA0C 75%, #D7FFD1 80%, #00BA0C 85%, #00BA0C 100%);
+    background-image: -webkit-linear-gradient(left, #00BA0C 0%, #00BA0C 75%, #D7FFD1 80%, #00BA0C 85%, #00BA0C 100%);
+    background-image: -o-linear-gradient(left, #00BA0C 0%, #00BA0C 75%, #D7FFD1 80%, #00BA0C 85%, #00BA0C 100%);
+    background-image: -ms-linear-gradient(left, #00BA0C 0%, #00BA0C 75%, #D7FFD1 80%, #00BA0C 85%, #00BA0C 100%);
+    background-image: linear-gradient(to right, #00BA0C 0%, #00BA0C 75%, #D7FFD1 80%, #00BA0C 85%, #00BA0C 100%);
+    background-size: 800px 20px;
+    box-shadow: inset 0 -2px 2px rgba(0, 0, 0, 0.5), inset 0 2px 2px rgba(255, 255, 255, 0.8);
+    -webkit-animation: shine 2s linear infinite;
+    -moz-animation: shine 2s linear infinite;
+    animation: shine 2s linear infinite;
+}
+
+@-webkit-keyframes shine {
+    to {
+        background-position: 800px 0;
+    }
+}
+
+@-moz-keyframes shine {
+    to {
+        background-position: 800px 0;
+    }
+}
+
+@keyframes shine {
+    to {
+        background-position: 800px 0;
+    }
+}
+
+/* Zigzag style */
+.progress.zigzag .progress-bar {
+    background-color: #EFE743;
+    background-image: -moz-linear-gradient(135deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -moz-linear-gradient(225deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -moz-linear-gradient(315deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -moz-linear-gradient(45deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%);
+    background-image: -webkit-linear-gradient(135deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -webkit-linear-gradient(225deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -webkit-linear-gradient(315deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -webkit-linear-gradient(45deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%);
+    background-image: -o-linear-gradient(135deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -o-linear-gradient(225deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -o-linear-gradient(315deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -o-linear-gradient(45deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%);
+    background-image: -ms-linear-gradient(135deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -ms-linear-gradient(225deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -ms-linear-gradient(315deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), -ms-linear-gradient(45deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%);
+    background-image: linear-gradient(135deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), linear-gradient(225deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), linear-gradient(315deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%), linear-gradient(45deg, #EA0000 25%, rgba(234, 0, 0, 0) 25%);
+    background-position: -10px 0, -10px 0, 0 0, 0 0;
+    background-size: 20px 20px;
+    -webkit-animation: zigzagmove .5s linear infinite;
+    -moz-animation: zigzagmove .5s linear infinite;
+    animation: zigzagmove .5s linear infinite;
+}
+
+@-webkit-keyframes zigzagmove {
+    to {
+        background-position: 10px 0, 10px 0, 20px 0, 20px 0;
+    }
+}
+
+@-moz-keyframes zigzagmove {
+    to {
+        background-position: 10px 0, 10px 0, 20px 0, 20px 0;
+    }
+}
+
+@keyframes zigzagmove {
+    to {
+        background-position: 10px 0, 10px 0, 20px 0, 20px 0;
+    }
+}
+
+/* Diamond style */
+.progress.diamond .progress-bar {
+    background-color: #eee;
+    background-image: -moz-linear-gradient(45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red), -moz-linear-gradient(-45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red);
+    background-image: -webkit-linear-gradient(45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red), -webkit-linear-gradient(-45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red);
+    background-image: -o-linear-gradient(45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red), -o-linear-gradient(-45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red);
+    background-image: -ms-linear-gradient(45deg, red 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red), -ms-linear-gradient(-45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red);
+    background-image: linear-gradient(45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red), linear-gradient(-45deg, red 25%, rgba(255, 0, 0, 0) 25%, rgba(255, 0, 0, 0) 75%, red 75%, red);
+    background-size: 10px 10px;
+    -webkit-animation: move 1.2s linear alternate infinite;
+    -moz-animation: move 1.2s linear alternate infinite;
+    animation: move 1.2s linear alternate infinite;
+}
+
+@-webkit-keyframes move {
+    to {
+        background-position: 5px -10px;
+        background-size: 20px 20px;
+    }
+}
+
+@-moz-keyframes move {
+    to {
+        background-position: 5px -10px;
+        background-size: 20px 20px;
+    }
+}
+
+@keyframes move {
+    to {
+        background-position: 5px -10px;
+        background-size: 20px 20px;
+    }
+}
+
+.progress.sparkle .progress-bar {
+    background-color: #F7A806;
+    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAABACAMAAADMI7KPAAACZFBMVEX////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xG13JAAAAzHRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJytLua8SRAAASK0lEQVR42nXWWZMb12H28edsvQJoAINl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");
+    box-shadow: inset 0 -2px 2px rgba(0, 0, 0, 0.5), inset 0 2px 2px rgba(255, 255, 255, 0.8);
+    -webkit-animation: sparkle 1500ms linear infinite;
+    -moz-animation: sparkle 1500ms linear infinite;
+    -o-animation: sparkle 1500ms linear infinite;
+    animation: sparkle 1500ms linear infinite;
+}
+
+@-webkit-keyframes sparkle {
+    from {
+        background-position: 0 0;
+    }
+
+    to {
+        background-position: 0 -64px;
+    }
+}
+
+@-moz-keyframes sparkle {
+    from {
+        background-position: 0 0;
+    }
+
+    to {
+        background-position: 0 -64px;
+    }
+}
+
+@-o-keyframes sparkle {
+    from {
+        background-position: 0 0;
+    }
+
+    to {
+        background-position: 0 -64px;
+    }
+}
+
+@keyframes sparkle {
+    from {
+        background-position: 0 0;
+    }
+
+    to {
+        background-position: 0 -64px;
+    }
+}
+
+.progress.hearts .progress-bar {
+    background-image:
+        radial-gradient(circle closest-side at 60% 43%, #bb0033 26%, rgba(187, 0, 51, 0) 27%),
+        radial-gradient(circle closest-side at 40% 43%, #bb0033 26%, rgba(187, 0, 51, 0) 27%),
+        radial-gradient(circle closest-side at 40% 22%, #dd3355 45%, rgba(221, 51, 85, 0) 46%),
+        radial-gradient(circle closest-side at 60% 22%, #dd3355 45%, rgba(221, 51, 85, 0) 46%),
+        radial-gradient(circle closest-side at 50% 35%, #dd3355 30%, rgba(221, 51, 85, 0) 31%),
+        radial-gradient(circle closest-side at 60% 43%, #bb0033 26%, rgba(187, 0, 51, 0) 27%),
+        radial-gradient(circle closest-side at 40% 43%, #bb0033 26%, rgba(187, 0, 51, 0) 27%),
+        radial-gradient(circle closest-side at 40% 22%, #dd3355 45%, rgba(221, 51, 85, 0) 46%),
+        radial-gradient(circle closest-side at 60% 22%, #dd3355 45%, rgba(221, 51, 85, 0) 46%),
+        radial-gradient(circle closest-side at 50% 35%, #dd3355 30%, rgba(221, 51, 85, 0) 31%);
+    background-color: #b03;
+    background-position: 0 0, 0 0, 0 0, 0 0, 0 0, 20px 20px, 20px 20px, 20px 20px, 20px 20px, 0 0;
+    background-size: 40px 40px;
+    -webkit-animation: heartmove 1.2s linear infinite;
+    -moz-animation: heartmove 1.2s linear infinite;
+    animation: heartmove 1.2s linear infinite;
+}
+
+@-webkit-keyframes heartmove {
+    to {
+        background-position: 20px 0;
+    }
+}
+
+@-moz-keyframes heartmove {
+    to {
+        background-position: 20px 0;
+    }
+}
+
+@keyframes heartmove {
+    to {
+        background-position: 40px 0, 40px 0, 40px 0, 40px 0, 40px 20px, 40px 20px, 40px 20px, 40px 20px, 40px 20px, 40px 0px;
+    }
+}
+
+h2 {
+    text-align: center;
+    font-size: 18px;
+    font-family: Arial;
+}
+
+a {
+    color: #89310F;
+}
+</style>
diff --git a/components/ay-firework/README.md b/components/ay-firework/README.md
new file mode 100644
index 0000000..15b9c77
--- /dev/null
+++ b/components/ay-firework/README.md
@@ -0,0 +1,32 @@
+## 使用注意
+- 引入该组件,用v-if控制组件,组件create会触发喷发特效函数,然后可以传入一些位置参数,具体参考组件内的props属性,每个属性都备注了
+- 
+## 示例代码
+```
+  <template>
+  	<view>
+  		<fireworks v-if="isReady" />
+  	</view>
+  </template>
+  
+  <script>
+  	import fireworks from '@/components/fireworks/index.vue'
+  	export default {
+		data() {
+			return {
+				isReady: false
+			}
+		},
+  		components: {
+  			fireworks
+  		},
+		onReady() {
+			this.$nextTick(() => {//后面记得销毁哈,不使用时设置为false
+				setTimeout(() => {
+					this.isReady = true;
+				}, 50)
+			})
+		},
+  	}
+  </script>
+```
\ No newline at end of file
diff --git a/components/ay-firework/firework.vue b/components/ay-firework/firework.vue
new file mode 100644
index 0000000..8725372
--- /dev/null
+++ b/components/ay-firework/firework.vue
@@ -0,0 +1,236 @@
+<template>
+	<canvas class="fire-canvas" :style="{width: width + 'px', height: height + 'px', 'z-index': zIndex}" 
+	:canvas-id="canvasId" @error="canvasIdErrorCallback"></canvas>
+</template>
+
+<script>
+	/*
+		浏览器的最高刷新赔率(最后一个表示1秒刷新60次)
+	*/
+	const minBrowserRefreshTime = window && (window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame) || function(t) {
+		setTimeout(t, 1e3 / 60)
+	}
+	const systenInfo = uni.getSystemInfoSync();
+	let fireCanvasBox = null;
+	export default {
+		props: {
+			/*
+				礼花数量(最好小于500,太多会卡顿)
+			*/
+			particleCount: {
+				type: [Number, String],
+				default: 30
+			},
+			/*取值	0-360
+				喷发角度示意图(简单说就是喷射方向)
+						礼花(90)
+				礼花(180)		礼花0
+						礼花(270)
+			*/
+			angle: {
+				type: [Number, String],
+				default: 90
+			},
+			/*
+				爆炸范围
+			*/
+			spread: {
+				type: [Number, String],
+				default: 100
+			},
+			/*
+				喷发的初始速度
+			*/
+			startVelocity: {
+				type: [Number, String],
+				default: 45
+			},
+			/*
+				喷发的衰退时间,超出canvas会被清除,跟startVelocity配合使用
+			*/
+			decay: {
+				type: [Number, String],
+				default: 0.9
+			},
+			/*
+				刷新几次消失(其实是透明度为0),这个跟间隔的刷新频率有关
+			*/
+			ticks: {
+				type: [Number, String],
+				default: 150
+			},
+			/*
+				礼花层级
+			*/
+			zIndex: {
+				type: [Number, String],
+				default: 1
+			},
+			/*
+				所有要随机的礼花颜色预选值
+			*/
+			colors: {
+				type: Array,
+				default: () => ["#5BC0EB", "#2176AE", "#FDE74C", "#9BC53D", "#E55934", "#FA7921", "#FF4242"]
+			},
+			canvasId: {
+				type: String,
+				default: 'fireCanvas'
+			},
+			/*
+				canvas宽度(单位px)
+			*/
+			width: {
+				type: [Number, String],
+				default: () => {
+					return systenInfo.windowWidth
+				}
+			},
+			/*
+				canvas高度(单位px)
+			*/
+			height: {
+				type: [Number, String],
+				default: () => {
+					return systenInfo.windowHeight
+				}
+			},
+			/*
+				中心点-x
+			*/
+			x: {
+				type: [Number, String],
+				default: () => {
+					return systenInfo.windowWidth / 2
+				}
+			},
+			/*
+				中心点-y
+			*/
+			y: {
+				type: [Number, String],
+				default: () => {
+					return systenInfo.windowHeight * 0.4
+				}
+			}
+		},
+		data() {
+			return {
+				/*
+					手机分辨率
+				*/
+				pixelRatio: systenInfo.pixelRatio
+			}
+		},
+		onShow(){
+			console.log('onShow');
+			this.initCanvas();
+		},
		created() {
+			console.log('created');
+			this.initCanvas();
+		},
+		methods: {
+			open(){
+				
+			},
+			/*
+				转16进制(颜色用)
+			*/
+			parseInt16(t) {
+				return parseInt(t, 16);
+			},
+			canvasIdErrorCallback(e) {
+				console.error(e.detail.errMsg)
+			},
+			initCanvas() {
+				fireCanvasBox = null;
+				fireCanvasBox = uni.createCanvasContext(this.canvasId, this);
+				fireCanvasBox.fillRect(0, 0, this.width * this.pixelRatio, this.height * this.pixelRatio);
+				fireCanvasBox.scale(this.pixelRatio,this.pixelRatio);
+				fireCanvasBox.save();
+				this.fireworksDraw();
+			},
+			fireworksDraw() {
+					let ribbon = [] ,//彩带容器
+					particleCount = this.particleCount, n = null, r = null, a = null,i = null;
+					for (; particleCount--;){
+						n = {
+							x: this.x,
+							y: this.y,
+							angle: this.angle,
+							spread: this.spread,
+							startVelocity: this.startVelocity,
+							color: this.colors[particleCount % this.colors.length],
+							ticks: this.ticks,
+							decay: this.decay
+						}, 
+						i = 0, 
+						r = n.angle * (Math.PI / 180), 
+						a = n.spread * (Math.PI / 180);
+						ribbon.push({//菜单位置初始化
+							x: n.x,
+							y: n.y,
+							depth: .5 * Math.random() + .6,
+							wobble: 10 * Math.random(),
+							velocity: .5 * n.startVelocity + Math.random() * n.startVelocity,
+							angle2D: -r + (.5 * a - Math.random() * a),
+							tiltAngle: Math.random() * Math.PI,
+							color: (i = (n.color + "").replace(/[^0-9a-f]/gi, ""), i.length < 6 && (i = i[0] + i[0] + i[1] + i[1] + i[2] + i[2]), {//生成随机颜色
+								r: this.parseInt16(i.substring(0, 2)),
+								g: this.parseInt16(i.substring(2, 4)),
+								b: this.parseInt16(i.substring(4, 6))
+							}),
+							tick: 0,
+							totalTicks: n.ticks,
+							decay: n.decay,
+							random: Math.random() + 5,
+							tiltSin: 0,
+							tiltCos: 0,
+							wobbleX: 0,
+							wobbleY: 0
+						})
+					}
+					minBrowserRefreshTime(function drawRibbon() {
+						if(!fireCanvasBox) return ;
+						fireCanvasBox.draw(),
+						fireCanvasBox.restore(),
+						ribbon = ribbon.filter((e) => {
+							e.x += Math.cos(e.angle2D) * e.velocity,
+							e.y += Math.sin(e.angle2D) * e.velocity + 5 * e.depth,
+							e.wobble += .1,
+							e.velocity *= e.decay,
+							e.tiltAngle += .02 * Math.random() + .12,
+							e.tiltSin = Math.sin(e.tiltAngle),
+							e.tiltCos = Math.cos(e.tiltAngle),
+							e.random = Math.random() + 4,
+							e.wobbleX = e.x + 10 * Math.cos(e.wobble) * e.depth,
+							e.wobbleY = e.y + 10 * Math.sin(e.wobble) * e.depth;
+							// 开始画图
+							fireCanvasBox.fillStyle="rgba(" + e.color.r + ", " + e.color.g + ", " + e.color.b + ", " + (1 - (e.tick++) / e.totalTicks) + ")",
+							fireCanvasBox.beginPath(),
+							fireCanvasBox.moveTo(Math.floor(e.x),Math.floor(e.y)),
+							fireCanvasBox.lineTo(Math.floor(e.wobbleX),Math.floor(e.y + e.random * e.tiltSin)),
+							fireCanvasBox.lineTo(Math.floor(e.wobbleX + e.random * e.tiltCos),Math.floor(e.wobbleY + e.random * e.tiltSin)),
+							fireCanvasBox.lineTo(Math.floor(e.x + e.random * e.tiltCos),Math.floor(e.wobbleY)),
+							fireCanvasBox.closePath(),
+							fireCanvasBox.fill();
+							return e.tick < e.totalTicks
+						})
+						ribbon.length ? minBrowserRefreshTime(drawRibbon): fireCanvasBox = null;//轮询调用或者释放掉
+					}
+				)
+			}
+		},
+		
+	}
+</script>
+
+<style>
+	.fire-canvas{
+		position: fixed; 
+		top: 0px; 
+		left: 0px;
+		pointer-events: none;
+		z-index: 99999999;
+	}
+</style>
diff --git a/components/colorPanel/color-panel.vue b/components/colorPanel/color-panel.vue
new file mode 100644
index 0000000..5d76465
--- /dev/null
+++ b/components/colorPanel/color-panel.vue
@@ -0,0 +1,519 @@
+<template>
+	<view class="color-panel" :class="{'color-panel-show': colorPanelShow}">
+		<view class="color-section">
+			<view @click="colorPickAction(item)" :style="{backgroundColor: item.color}" v-for="(item, index) in colorArr" :key="index" class="color-item">
+				<text class="color-title">{{item.index}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default  {
+		props: {
+			colorPanelShow: {
+				type: Boolean,
+				default () {
+					return false;
+				}
+			}
+		},
+		data () {
+			return {
+				colorArr: [
+					{
+						color: '#7f2a3f',
+						index: '01'
+					}, {
+						color: '#e24187',
+						index: '03'
+					}, {
+						color: '#f5305d',
+						index: '04'
+					}, {
+						color: '#de4156',
+						index: '05'
+					}, {
+						color: '#fe42cd',
+						index: '06'
+					}, {
+						color: '#f48b9a',
+						index: '07'
+					}, {
+						color: '#ec8191',
+						index: '08'
+					}, {
+						color: '#f9aeb5',
+						index: '09'
+					}, {
+						color: '#f21d5f',
+						index: '10'
+					}, {
+						color: '#cc3739',
+						index: '11'
+					}, {
+						color: '#dd5047',
+						index: '12'
+					}, {
+						color: '#e24187',
+						index: '13'
+					}, {
+						color: '#fa6449',
+						index: '14'
+					}, {
+						color: '#e8495b',
+						index: '15'
+					}, {
+						color: '#fb7162',
+						index: '16'
+					}, {
+						color: '#f6afd1',
+						index: '17'
+					}, {
+						color: '#fbb6b9',
+						index: '18'
+					}, {
+						color: '#db6f27',
+						index: '21'
+					}, {
+						color: '#ed702e',
+						index: '22'
+					}, {
+						color: '#f99627',
+						index: '23'
+					}, {
+						color: '#eb8926',
+						index: '24'
+					}, {
+						color: '#edc3aa',
+						index: '25'
+					}, {
+						color: '#e1d8cf',
+						index: '26'
+					}, {
+						color: '#deebc5',
+						index: '27'
+					}, {
+						color: '#fccdc7',
+						index: '28'
+					}, {
+						color: '#dbbdd2',
+						index: '29'
+					}, {
+						color: '#e8a321',
+						index: '31'
+					}, {
+						color: '#db6f27',
+						index: '32'
+					}, {
+						color: '#edb74b',
+						index: '33'
+					}, {
+						color: '#e8b741',
+						index: '34'
+					}, {
+						color: '#fef052',
+						index: '35'
+					}, {
+						color: '#ffd684',
+						index: '36'
+					}, {
+						color: '#e2d958',
+						index: '37'
+					}, {
+						color: '#e2e5d0',
+						index: '38'
+					}, {
+						color: '#ba9431',
+						index: '41'
+					}, {
+						color: '#797f5d',
+						index: '42'
+					}, {
+						color: '#536d50',
+						index: '43'
+					}, {
+						color: '#d8b53f',
+						index: '44'
+					}, {
+						color: '#d4c172',
+						index: '45'
+					}, {
+						color: '#32b75c',
+						index: '46'
+					}, {
+						color: '#90D15B',
+						index: '47'
+					}, {
+						color: '#c5d52a',
+						index: '48'
+					}, {
+						color: '#e8e098',
+						index: '49'
+					}, {
+						color: '#1b6661',
+						index: '50'
+					}, {
+						color: '#3b4f4d',
+						index: '51'
+					}, {
+						color: '#336559',
+						index: '52'
+					}, {
+						color: '#01776e',
+						index: '53'
+					}, {
+						color: '#2e7662',
+						index: '54'
+					}, {
+						color: '#439877',
+						index: '55'
+					}, {
+						color: '#0ba066',
+						index: '56'
+					}, {
+						color: '#318488',
+						index: '57'
+					}, {
+						color: '#6fd3c9',
+						index: '58'
+					}, {
+						color: '#b9d3ac',
+						index: '59'
+					}, {
+						color: '#0e898e',
+						index: '61'
+					}, {
+						color: '#317194',
+						index: '62'
+					}, {
+						color: '#029bc7',
+						index: '63'
+					}, {
+						color: '#2a8ec9',
+						index: '64'
+					}, {
+						color: '#57c9d3',
+						index: '65'
+					}, {
+						color: '#65b3df',
+						index: '67'
+					}, {
+						color: '#8bd0d7',
+						index: '68'
+					}, {
+						color: '#4B4881',
+						index: '69'
+					}, {
+						color: '#77A1CB',
+						index: '70'
+					}, {
+						color: '#3051BB',
+						index: '71'
+					}, {
+						color: '#2E41A7',
+						index: '72'
+					}, {
+						color: '#704CAE',
+						index: '73'
+					}, {
+						color: '#385BD1',
+						index: '74'
+					}, {
+						color: '#E0DFED',
+						index: '75'
+					}, {
+						color: '#A6BDE9',
+						index: '76'
+					}, {
+						color: '#B3B9DD',
+						index: '77'
+					}, {
+						color: '#7942A8',
+						index: '81'
+					}, {
+						color: '#8F52BA',
+						index: '82'
+					}, {
+						color: '#9680C0',
+						index: '83'
+					}, {
+						color: '#CD82BB',
+						index: '84'
+					}, {
+						color: '#8E2A80',
+						index: '85'
+					}, {
+						color: '#E24CB0',
+						index: '86'
+					}, {
+						color: '#CC2A75',
+						index: '87'
+					}, {
+						color: '#ED89D2',
+						index: '88'
+					}, {
+						color: '#F562B6',
+						index: '89'
+					}, {
+						color: '#8B3B32',
+						index: '91'
+					}, {
+						color: '#593A35',
+						index: '92'
+					}, {
+						color: '#7A3C2D',
+						index: '93'
+					}, {
+						color: '#7D2E21',
+						index: '94'
+					}, {
+						color: '#935A47',
+						index: '95'
+					}, {
+						color: '#A05047',
+						index: '96'
+					}, {
+						color: '#E39476',
+						index: '97'
+					}, {
+						color: '#4E3F3C',
+						index: '98'
+					}, {
+						color: '#5A4939',
+						index: '99'
+					}, {
+						color: '#EDE8EC',
+						index: '100'
+					}, {
+						color: '#C0813A',
+						index: '101'
+					}, {
+						color: '#77432E',
+						index: '102'
+					}, {
+						color: '#C17748',
+						index: '103'
+					}, {
+						color: '#C7AC39',
+						index: '104'
+					}, {
+						color: '#DBA179',
+						index: '107'
+					}, {
+						color: '#D8D3D0',
+						index: '109'
+					}, {
+						color: '#091A22',
+						index: '120'
+					}, {
+						color: '#CA3A32',
+						index: '121'
+					}, {
+						color: '#FAAB60',
+						index: '122'
+					}, {
+						color: '#CADEAD',
+						index: '123'
+					}, {
+						color: '#C7D858',
+						index: '124'
+					}, {
+						color: '#F264D0',
+						index: '125'
+					}, {
+						color: '#F77ADC',
+						index: '126'
+					}, {
+						color: '#FAE7D9',
+						index: '131'
+					}, {
+						color: '#E6D9D1',
+						index: '132'
+					}, {
+						color: '#EBCDB1',
+						index: '133'
+					}, {
+						color: '#E2DCCC',
+						index: '134'
+					}, {
+						color: '#FAD9D2',
+						index: '135'
+					}, {
+						color: '#E1C2BD',
+						index: '136'
+					}, {
+						color: '#E5BBCF',
+						index: '137'
+					}, {
+						color: '#F7BACC',
+						index: '138'
+					}, {
+						color: '#E9CBC1',
+						index: '139'
+					}, {
+						color: '#EBB89F',
+						index: '140'
+					}, {
+						color: '#E6D09E',
+						index: '141'
+					}, {
+						color: '#E2B78D',
+						index: '142'
+					}, {
+						color: '#D1E4EB',
+						index: '143'
+					}, {
+						color: '#B9D9EE',
+						index: '144'
+					}, {
+						color: '#CFD0E2',
+						index: '145'
+					}, {
+						color: '#CECFF0',
+						index: '146'
+					}, {
+						color: '#D6C3E3',
+						index: '147'
+					}, {
+						color: '#E3F0C5',
+						index: '163'
+					}, {
+						color: '#DAD792',
+						index: '164'
+					}, {
+						color: '#D4D4BC',
+						index: '166'
+					}, {
+						color: '#C0D0AB',
+						index: '167'
+					}, {
+						color: '#D7C6A8',
+						index: '169'
+					}, {
+						color: '#D9E9E8',
+						index: '171'
+					}, {
+						color: '#B4E0C7',
+						index: '172'
+					}, {
+						color: '#D6E2BA',
+						index: '173'
+					}, {
+						color: '#E3E5D0',
+						index: '174'
+					}, {
+						color: '#C1D39A',
+						index: '175'
+					}, {
+						color: '#AFE4E6',
+						index: '178'
+					}, {
+						color: '#92DDE2',
+						index: '179'
+					}, {
+						color: '#DBE0E6',
+						index: '182'
+					}, {
+						color: '#8FBFF0',
+						index: '183'
+					}, {
+						color: '#9DCDE1',
+						index: '185'
+					}, {
+						color: '#BBC4BF',
+						index: '196'
+					}, {
+						color: '#E484A9',
+						index: '198'
+					}, {
+						color: '#BBC4BF',
+						index: 'GG3'
+					}, {
+						color: '#494A4C',
+						index: 'CG9'
+					}, {
+						color: '#C2CEDA',
+						index: 'BG1'
+					}, {
+						color: '#C1C3D3',
+						index: 'BG3'
+					}, {
+						color: '#8696A3',
+						index: 'BG5'
+					}, {
+						color: '#646A76',
+						index: 'BG7'
+					}, {
+						color: '#415361',
+						index: 'BG9'
+					}, {
+						color: '#DFDEE3',
+						index: 'WG.5'
+					}, {
+						color: '#CBC6CC',
+						index: 'WG1'
+					}, {
+						color: '#B6B0B2',
+						index: 'WG2'
+					}, {
+						color: '#C5BBBA',
+						index: 'WG3'
+					}, {
+						color: '#958A92',
+						index: 'WG4'
+					}, {
+						color: '#837477',
+						index: 'WG5'
+					}, {
+						color: '#8A7E7E',
+						index: 'WG6'
+					}, {
+						color: '#4D4342',
+						index: 'WG9'
+					}
+				]
+			}
+		},
+		methods: {
+			colorPickAction (color) {
+				this.$emit('colorPickTap', color);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.color-panel {
+		position: absolute;
+		left: 0;
+		bottom: 200upx;
+		right: 0;
+		// top: 145px;
+		display: none;
+		z-index: 10;
+		
+		.color-section {
+			display: flex;
+			flex-wrap: wrap;
+			
+			.color-item {
+				width: 10vw;
+				height: 10vw;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				
+				.color-title {
+					color: #fff;
+					font-size: $uni-font-size-sm;
+				}
+			}
+		}
+	}
+	
+	.color-panel-show {
+		background-color: rgba(0, 0, 0, .6);
+		display: block;
+	}
+</style>
diff --git a/components/cropper/cropper.vue b/components/cropper/cropper.vue
new file mode 100644
index 0000000..2ad3fd5
--- /dev/null
+++ b/components/cropper/cropper.vue
@@ -0,0 +1,621 @@
+<template>
+	<view class="cropper" id="cropper" :class="{ show: show }">
+		<view class="cropper-head"><view class="cropper-btn cropper-reset" @tap="resetCrop">重做</view></view>
+		<view class="cropper-body">
+			<image id="image" class="cropper-image" :src="imagePath" mode="aspectFit"></image>
+			<view :style="{ width: stageWidth + 'px', height: stageHeight + 'px', left: stageLeft + 'px', top: stageTop + 'px' }" class="cropper-stage" @touchstart.stop.prevent="touchStart" @touchmove.stop.prevent="touchMove">
+				<view id="box" class="cropper-box" :style="{ width: boxWidth + 'px', height: boxHeight + 'px', left: boxLeft + 'px', top: boxTop + 'px' }">
+					<view id="lt" class="lt"></view>
+					<view id="lb" class="lb"></view>
+					<view id="rt" class="rt"></view>
+					<view id="rb" class="rb"></view>
+
+					<view class="line-v" style="left:33.3%;"></view>
+					<view class="line-v" style="left:66.6%;"></view>
+					<view class="line-h" style="top:33.3%;"></view>
+					<view class="line-h" style="top:66.6%;"></view>
+				</view>
+			</view>
+
+			<canvas class="cropper-canvas" canvas-id="canvas" :style="{ height: canvasHeight + 'px', width: canvasWidth + 'px' }"></canvas>
+		</view>
+		<view class="cropper-bottom">
+			<view class="cropper-btn cropper-cancel" @tap="cancelCrop">取消</view>
+			<view class="cropper-btn cropper-ok" @tap="completeCrop">裁剪</view>
+		</view>
+	</view>
+</template>
+<script>
+//无须渲染的变量
+
+let layoutLeft = 0;
+let layoutTop = 0;
+let layoutWidth = 0;
+let layoutHeight = 0;
+
+let stageLeft = 0;
+let stageTop = 0;
+let stageWidth = 0;
+let stageHeight = 0;
+
+let imageWidth = 0;
+let imageHeight = 0;
+
+let pixelRatio = 1; //todo设备像素密度//暂不使用//
+
+let imageStageRatio = 1; //图片实际尺寸与剪裁舞台大小的比值,用于尺寸换算。
+
+let minBoxWidth = 0;
+let minBoxHeight = 0;
+
+let touchStartBoxLeft = 0;
+let touchStartBoxTop = 0;
+let touchStartBoxWidth = 0;
+let touchStartBoxHeight = 0;
+
+let touchStartX = 0;
+let touchStartY = 0;
+
+export default {
+	name: 'cropper',
+	props: {
+		quality: {
+			type: Number,
+			default: 1
+		},
+
+		//目标文件的类型。默认值为jpg,jpg:输出jpg格式图片;png:输出png格式图片
+		outputFileType: {
+			type: String,
+			default: 'jpg'
+		},
+		//目标图片的宽高比,默认null,即不限制剪裁宽高比。aspectRatio需大于0
+		aspectRatio: {
+			type: [Number, null],
+			default: null
+		},
+		//最小剪裁尺寸与原图尺寸的比率,默认0.15,即宽度最小剪裁到原图的0.15宽。
+		minBoxWidthRatio: {
+			type: Number,
+			default: 0.15
+		},
+		//同minBoxWidthRatio,当设置aspectRatio时,minBoxHeight值设置无效。minBoxHeight值由minBoxWidth 和 aspectRatio自动计算得到。
+		minBoxHeightRatio: {
+			type: Number,
+			default: 0.15
+		},
+		//剪裁框初始大小比率。默认值0.8,即剪裁框默认宽度为图片宽度的0.8倍。
+		initialBoxWidthRatio: {
+			type: Number,
+			default: 0.8
+		},
+		//同initialBoxWidthRatio,当设置aspectRatio时,initialBoxHeightRatio值设置无效。initialBoxHeightRatio值由initialBoxWidthRatio 和 aspectRatio自动计算得到。
+		initialBoxHeightRatio: {
+			type: Number,
+			default: 0.8
+		}
+	},
+	data() {
+		return {
+			//data
+			stageLeft: 0,
+			stageTop: 0,
+			stageWidth: 0,
+			stageHeight: 0,
+
+			boxWidth: 0,
+			boxHeight: 0,
+			boxLeft: 0,
+			boxTop: 0,
+
+			canvasWidth: 0,
+			canvasHeight: 0,
+			show: false,
+			imagePath: ''
+		};
+	},
+	mounted() {
+		// setTimeout(() => {
+		// 	this.init();
+		// }, 150);
+	},
+	methods: {
+		resetCrop() {
+			this.$emit('reset');
+			this.init(this.imagePath);
+		},
+		cancelCrop() {
+			this.$emit('cancel');
+		},
+		completeCrop() {
+			let imagePath = this.imagePath;
+			let canvasContext = wx.createCanvasContext('canvas', this);
+
+			let boxLeft = this.boxLeft;
+			let boxTop = this.boxTop;
+			let boxWidth = this.boxWidth;
+			let boxHeight = this.boxHeight;
+
+			let sx = Math.ceil(boxLeft * imageStageRatio);
+			let sy = Math.ceil(boxTop * imageStageRatio);
+
+			let sWidth = Math.ceil(boxWidth * imageStageRatio);
+			let sHeight = Math.ceil(boxHeight * imageStageRatio);
+			let dx = 0;
+			let dy = 0;
+
+			let dWidth = Math.ceil(sWidth * pixelRatio);
+			let dHeight = Math.ceil(sHeight * pixelRatio);
+			const param = {
+				x: sx,
+				y: sy,
+				width: dWidth,
+				height: dHeight,
+				rotate: 0,
+				scaleX: 1,
+				scaleY: 1
+			};
+
+			canvasContext.drawImage(imagePath, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
+			canvasContext.draw(false, () => {
+				wx.canvasToTempFilePath(
+					{
+						x: dx,
+						y: dy,
+						width: dWidth,
+						height: dHeight,
+						destWidth: sWidth,
+						destHeight: sHeight,
+						canvasId: 'canvas',
+						fileType: this.outputFileType,
+						quality: this.quality,
+						success: res => {
+							this.$emit('complete', { param, path: res.tempFilePath,source:this.imagePath });
+						}
+					},
+					this
+				);
+			});
+		},
+		touchMove(e) {
+			let targetId = e.target.id;
+			let touch = e.touches[0];
+			let pageX = touch.pageX;
+			let pageY = touch.pageY;
+
+			let offsetX = pageX - touchStartX;
+			let offsetY = pageY - touchStartY;
+
+			if (targetId == 'box') {
+				let newBoxLeft = touchStartBoxLeft + offsetX;
+				let newBoxTop = touchStartBoxTop + offsetY;
+
+				if (newBoxLeft < 0) {
+					newBoxLeft = 0;
+				}
+				if (newBoxTop < 0) {
+					newBoxTop = 0;
+				}
+				if (newBoxLeft + touchStartBoxWidth > stageWidth) {
+					newBoxLeft = stageWidth - touchStartBoxWidth;
+				}
+				if (newBoxTop + touchStartBoxHeight > stageHeight) {
+					newBoxTop = stageHeight - touchStartBoxHeight;
+				}
+				this.boxLeft = newBoxLeft;
+				this.boxTop = newBoxTop;
+			} else if (targetId == 'lt') {
+				if (this.aspectRatio) {
+					offsetY = offsetX / this.aspectRatio;
+				}
+
+				let newBoxLeft = touchStartBoxLeft + offsetX;
+				let newBoxTop = touchStartBoxTop + offsetY;
+
+				if (newBoxLeft < 0) {
+					newBoxLeft = 0;
+				}
+				if (newBoxTop < 0) {
+					newBoxTop = 0;
+				}
+
+				if (touchStartBoxLeft + touchStartBoxWidth - newBoxLeft < minBoxWidth) {
+					newBoxLeft = touchStartBoxLeft + touchStartBoxWidth - minBoxWidth;
+				}
+				if (touchStartBoxTop + touchStartBoxHeight - newBoxTop < minBoxHeight) {
+					newBoxTop = touchStartBoxTop + touchStartBoxHeight - minBoxHeight;
+				}
+
+				let newBoxWidth = touchStartBoxWidth - (newBoxLeft - touchStartBoxLeft);
+				let newBoxHeight = touchStartBoxHeight - (newBoxTop - touchStartBoxTop);
+
+				//约束比例
+				if (newBoxTop == 0 && this.aspectRatio && newBoxLeft != 0) {
+					newBoxWidth = newBoxHeight * this.aspectRatio;
+					newBoxLeft = touchStartBoxWidth - newBoxWidth + touchStartBoxLeft;
+				}
+				if (newBoxLeft == 0 && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+					newBoxTop = touchStartBoxHeight - newBoxHeight + touchStartBoxTop;
+				}
+
+				if (newBoxWidth == minBoxWidth && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+					newBoxTop = touchStartBoxHeight - newBoxHeight + touchStartBoxTop;
+				}
+				this.boxTop = newBoxTop;
+				this.boxLeft = newBoxLeft;
+				this.boxWidth = newBoxWidth;
+				this.boxHeight = newBoxHeight;
+			} else if (targetId == 'rt') {
+				if (this.aspectRatio) {
+					offsetY = -offsetX / this.aspectRatio;
+				}
+
+				let newBoxWidth = touchStartBoxWidth + offsetX;
+				if (newBoxWidth < minBoxWidth) {
+					newBoxWidth = minBoxWidth;
+				}
+				if (touchStartBoxLeft + newBoxWidth > stageWidth) {
+					newBoxWidth = stageWidth - touchStartBoxLeft;
+				}
+
+				let newBoxTop = touchStartBoxTop + offsetY;
+
+				if (newBoxTop < 0) {
+					newBoxTop = 0;
+				}
+
+				if (touchStartBoxTop + touchStartBoxHeight - newBoxTop < minBoxHeight) {
+					newBoxTop = touchStartBoxTop + touchStartBoxHeight - minBoxHeight;
+				}
+				let newBoxHeight = touchStartBoxHeight - (newBoxTop - touchStartBoxTop);
+
+				//约束比例
+				if (newBoxTop == 0 && this.aspectRatio && newBoxWidth != stageWidth - touchStartBoxLeft) {
+					newBoxWidth = newBoxHeight * this.aspectRatio;
+				}
+
+				if (newBoxWidth == stageWidth - touchStartBoxLeft && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+					newBoxTop = touchStartBoxHeight - newBoxHeight + touchStartBoxTop;
+				}
+
+				if (newBoxWidth == minBoxWidth && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+					newBoxTop = touchStartBoxHeight - newBoxHeight + touchStartBoxTop;
+				}
+
+				this.boxTop = newBoxTop;
+				this.boxHeight = newBoxHeight;
+				this.boxWidth = newBoxWidth;
+			} else if (targetId == 'lb') {
+				if (this.aspectRatio) {
+					offsetY = -offsetX / this.aspectRatio;
+				}
+				let newBoxLeft = touchStartBoxLeft + offsetX;
+
+				if (newBoxLeft < 0) {
+					newBoxLeft = 0;
+				}
+				if (touchStartBoxLeft + touchStartBoxWidth - newBoxLeft < minBoxWidth) {
+					newBoxLeft = touchStartBoxLeft + touchStartBoxWidth - minBoxWidth;
+				}
+
+				let newBoxWidth = touchStartBoxWidth - (newBoxLeft - touchStartBoxLeft);
+
+				let newBoxHeight = touchStartBoxHeight + offsetY;
+				if (newBoxHeight < minBoxHeight) {
+					newBoxHeight = minBoxHeight;
+				}
+				if (touchStartBoxTop + newBoxHeight > stageHeight) {
+					newBoxHeight = stageHeight - touchStartBoxTop;
+				}
+
+				//约束比例
+				if (newBoxHeight == stageHeight - touchStartBoxTop && this.aspectRatio && newBoxLeft != 0) {
+					newBoxWidth = newBoxHeight * this.aspectRatio;
+					newBoxLeft = touchStartBoxWidth - newBoxWidth + touchStartBoxLeft;
+				}
+				if (newBoxLeft == 0 && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+				}
+
+				if (newBoxWidth == minBoxWidth && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+				}
+
+				this.boxLeft = newBoxLeft;
+				this.boxWidth = newBoxWidth;
+				this.boxHeight = newBoxHeight;
+			} else if (targetId == 'rb') {
+				if (this.aspectRatio) {
+					offsetY = offsetX / this.aspectRatio;
+				}
+				let newBoxWidth = touchStartBoxWidth + offsetX;
+				if (newBoxWidth < minBoxWidth) {
+					newBoxWidth = minBoxWidth;
+				}
+				if (touchStartBoxLeft + newBoxWidth > stageWidth) {
+					newBoxWidth = stageWidth - touchStartBoxLeft;
+				}
+
+				let newBoxHeight = touchStartBoxHeight + offsetY;
+				if (newBoxHeight < minBoxHeight) {
+					newBoxHeight = minBoxHeight;
+				}
+				if (touchStartBoxTop + newBoxHeight > stageHeight) {
+					newBoxHeight = stageHeight - touchStartBoxTop;
+				}
+
+				//约束比例
+				if (newBoxHeight == stageHeight - touchStartBoxTop && this.aspectRatio && newBoxWidth != stageWidth - touchStartBoxLeft) {
+					newBoxWidth = newBoxHeight * this.aspectRatio;
+				}
+
+				if (newBoxWidth == stageWidth - touchStartBoxLeft && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+				}
+
+				if (newBoxWidth == minBoxWidth && this.aspectRatio) {
+					newBoxHeight = newBoxWidth / this.aspectRatio;
+				}
+
+				this.boxWidth = newBoxWidth;
+				this.boxHeight = newBoxHeight;
+			}
+		},
+		touchStart(e) {
+			let touch = e.touches[0];
+			let pageX = touch.pageX;
+			let pageY = touch.pageY;
+
+			touchStartX = pageX;
+			touchStartY = pageY;
+
+			touchStartBoxLeft = this.boxLeft;
+			touchStartBoxTop = this.boxTop;
+			touchStartBoxWidth = this.boxWidth;
+			touchStartBoxHeight = this.boxHeight;
+		},
+		close(force=true) {
+			this.show = false;
+			if(force){
+				this.imagePath = ''
+			}
+		},
+		init(src) {
+			if (!src) {
+				return '';
+			}
+			this.imagePath = src;
+			uni.showLoading({
+				mask: true,
+				title: '载入图片中'
+			});
+			uni.createSelectorQuery()
+				.in(this)
+				.select('.cropper-body')
+				.boundingClientRect(rect => {
+					layoutLeft = rect.left;
+					layoutTop = rect.top;
+					layoutWidth = rect.width;
+					layoutHeight = rect.height;
+
+					wx.getImageInfo({
+						src: this.imagePath,
+						success: imageInfo => {
+							imageWidth = imageInfo.width;
+							imageHeight = imageInfo.height;
+							let imageWH = imageWidth / imageHeight;
+							let layoutWH = layoutWidth / layoutHeight;
+							if (imageWH >= layoutWH) {
+								stageWidth = layoutWidth;
+								stageHeight = stageWidth / imageWH;
+								imageStageRatio = imageHeight / stageHeight;
+							} else {
+								stageHeight = layoutHeight;
+								stageWidth = layoutHeight * imageWH;
+								imageStageRatio = imageWidth / stageWidth;
+							}
+							stageLeft = (layoutWidth - stageWidth) / 2;
+							stageTop = (layoutHeight - stageHeight) / 2;
+
+							minBoxWidth = stageWidth * this.minBoxWidthRatio;
+							minBoxHeight = stageHeight * this.minBoxHeightRatio;
+
+							let boxWidth = stageWidth * this.initialBoxWidthRatio;
+							let boxHeight = stageHeight * this.initialBoxHeightRatio;
+
+							if (this.aspectRatio) {
+								boxHeight = boxWidth / this.aspectRatio;
+							}
+							if (boxHeight > stageHeight) {
+								boxHeight = stageHeight;
+								boxWidth = boxHeight * this.aspectRatio;
+							}
+
+							let boxLeft = (stageWidth - boxWidth) / 2;
+							let boxTop = (stageHeight - boxHeight) / 2;
+
+							this.canvasWidth = imageWidth * pixelRatio;
+							this.canvasHeight = imageHeight * pixelRatio;
+
+							this.stageLeft = stageLeft;
+							this.stageTop = stageTop;
+							this.stageWidth = stageWidth;
+							this.stageHeight = stageHeight;
+
+							this.boxWidth = boxWidth;
+							this.boxHeight = boxHeight;
+							this.boxLeft = boxLeft;
+							this.boxTop = boxTop;
+							setTimeout(() => {
+								uni.hideLoading();
+								this.show = true;
+							}, 100);
+						},
+						fail: () => {
+							uni.showToast({
+								icon: 'none',
+								title: '图片载入失败'
+							});
+						}
+					});
+				})
+				.exec();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.cropper {
+	position: fixed;
+	left: 0;
+	right: 0;
+	top: 0;
+	bottom: 0;
+	background-color: #000;
+	z-index: -1000000;
+	opacity: 0;
+	&.show {
+		z-index: 999;
+		opacity: 1;
+	}
+	.cropper-head {
+		position: fixed;
+		top: 0;
+		width: 750rpx;
+		z-index: 6;
+		height: calc(var(--status-bar-height) + 88rpx);
+		padding-top: var(--status-bar-height);
+		display: flex;
+		justify-content: flex-end;
+		align-items: center;
+	}
+	.cropper-btn {
+		height: 64rpx;
+		margin: 0 20rpx;
+		padding: 0 30rpx;
+		line-height: 64rpx;
+		color: #fff;
+		font-size: 26rpx;
+	}
+	.cropper-body {
+		margin: calc(var(--status-bar-height) + 88rpx) 30rpx 0 30rpx;
+		height: calc(100vh - var(--status-bar-height) - 88rpx - 100rpx - var(--safe-area-inset-bottom));
+		position: relative;
+	}
+	.cropper-bottom {
+		height: calc(var(--safe-area-inset-bottom) + 100rpx);
+		padding-top: var(--safe-area-inset-bottom);
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		position: fixed;
+		z-index: 6;
+		width: 750rpx;
+		bottom: 0;
+	}
+	.cropper-ok {
+		color: #39f;
+	}
+	.cropper-image {
+		position: absolute;
+		width: 100%;
+		height: 100%;
+	}
+	.cropper-stage {
+		position: absolute;
+		.cropper-box {
+			position: absolute;
+			border: 4rpx solid #ddd;
+			box-sizing: border-box;
+			box-shadow: 0 0 0 2000rpx rgba(0, 0, 0, 0.5);
+			.lt {
+				position: absolute;
+				height: 48rpx;
+				width: 48rpx;
+				left: -6rpx;
+				top: -6rpx;
+				border-left: 12rpx solid #ffffff;
+				border-top: 12rpx solid #ffffff;
+			}
+
+			.lb {
+				position: absolute;
+				height: 48rpx;
+				width: 48rpx;
+				left: -6rpx;
+				bottom: -6rpx;
+				border-left: 12rpx solid #ffffff;
+				border-bottom: 12rpx solid #ffffff;
+			}
+
+			.rt {
+				position: absolute;
+				height: 48rpx;
+				width: 48rpx;
+				right: -6rpx;
+				top: -6rpx;
+				border-right: 12rpx solid #ffffff;
+				border-top: 12rpx solid #ffffff;
+			}
+
+			.rb {
+				position: absolute;
+				height: 48rpx;
+				width: 48rpx;
+				right: -6rpx;
+				bottom: -6rpx;
+				border-right: 12rpx solid #ffffff;
+				border-bottom: 12rpx solid #ffffff;
+			}
+			.line-v,
+			.line-h {
+				position: absolute;
+				opacity: 0.5;
+			}
+			.line-v {
+				width: 2rpx;
+				border-left: 2rpx dashed #fff;
+				height: 100%;
+			}
+			.line-h {
+				height: 2rpx;
+				border-bottom: 2rpx dashed #fff;
+				width: 100%;
+			}
+		}
+	}
+	.cropper-canvas {
+		position: fixed;
+		background-color: red;
+		left: 5000rpx;
+	}
+}
+
+// 安全域兼容样式
+// page {
+// 	--safe-area-inset-top: 0px;
+// 	--safe-area-inset-right: 0px;
+// 	--safe-area-inset-bottom: 0px;
+// 	--safe-area-inset-left: 0px;
+
+// 	@supports (top: constant(safe-area-inset-top)) {
+// 		--safe-area-inset-top: constant(safe-area-inset-top);
+// 		--safe-area-inset-right: constant(safe-area-inset-right);
+// 		--safe-area-inset-bottom: constant(safe-area-inset-bottom);
+// 		--safe-area-inset-left: constant(safe-area-inset-left);
+// 	}
+
+// 	@supports (top: env(safe-area-inset-top)) {
+// 		--safe-area-inset-top: env(safe-area-inset-top);
+// 		--safe-area-inset-right: env(safe-area-inset-right);
+// 		//--safe-area-inset-bottom: 12px;
+// 		--safe-area-inset-bottom: env(safe-area-inset-bottom);
+// 		--safe-area-inset-left: env(safe-area-inset-left);
+// 	}
+// }
+</style>
diff --git a/components/cropper/readme.md b/components/cropper/readme.md
new file mode 100644
index 0000000..9ca8ae9
--- /dev/null
+++ b/components/cropper/readme.md
@@ -0,0 +1,79 @@
+#### 【注意】由于赶时间,只做了功能性测试,兼容性测试暂时无法进行,更不用说优化测试了。欢迎有遇到问题的留言,或者自己动手修改也可以。
+#### 【注意】因为属于业余时间开发的一个项目所依赖的插件,所以更新较缓慢。
+
+### 使用方式
+
+```javascript
+import Cropper from '@/components/cropper/cropper.vue';
+```
+
+```html
+<cropper :imagePath="originalFaceSrc" :aspectRatio="1" @complete="complete" @cancel="cancel" v-if="handleFaceStatus"></cropper>
+```
+
+使用v-if控制显示,mounted内执行init方法,使用简单,操作便利。
+
+## 参数
+| 参数  | 类型  | 解释  |  默认 |  必填 | 备注  |
+| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |
+|  quality | Number  | 返回图片质量  | 1  | 否  |  如返回的图片仅需预览不用上传,请适当调低 |
+|  imagePath | String  | 原始图片路径  |""  | 是  | blob、静态图片资源地址或者base64(未测试)  |
+|  outputFileType | String  | 目标文件的类型  | jpg  | 否  | jpg:输出jpg格式图片;png:输出png格式图片  |
+|  aspectRatio | Number, null  | 目标图片的宽高比  | null  | 否  | null,即不限制剪裁宽高比。aspectRatio需大于0  |
+|  minBoxWidthRatio | Number  | 最小剪裁尺寸与原图尺寸的比率(宽)  | 0.15  | 否  | 宽度最小剪裁到原图的0.15宽  |
+|  minBoxHeightRatio  | Number  | 最小剪裁尺寸与原图尺寸的比率(高)  | 0.15  | 否  | 当设置aspectRatio时,minBoxHeight值设置无效。minBoxHeight值由minBoxWidth 和 aspectRatio自动计算得到  |
+|  initialBoxWidthRatio | Number  | 剪裁框初始大小比率(宽)  | 0.8  | 否  | 裁框默认宽度为图片宽度的0.8倍  |
+|  initialBoxHeightRatio | Number  | 剪裁框初始大小比率(高)  | 0.8  | 否  | 当设置aspectRatio时,initialBoxHeightRatio值设置无效。initialBoxHeightRatio值由initialBoxWidthRatio 和 aspectRatio自动计算得到  |
+
+## 事件
+
+| 事件名  | 解释  | 参数  |  备注 |
+| ------------ | ------------ | ------------ | ------------ |
+|  reset |  用户点击重做后触发 | 无  | 可能无用,但留一个给开发者备用  |
+|  cancel |  用户点击取消后触发 | 无  | 开发者可以将组件置为消失v-if(尽量不要用v-show)   |
+|  complete |  用户点击裁剪后触发 | path:路径,h5为base64,app与小程序为临时路径;param:裁切参数,见【备注1】  | 核心功能   |
+
+
+### 备注1
+param:
+```json
+{
+	x:Number, //裁切左上角X坐标
+	y:Number, //裁切左上角Y坐标
+	width:Number, //裁切宽度
+	height:Number, //裁切高度
+	rotate:Number, //旋转(未实现,预留)
+	scaleX:Number, //X轴缩放(未实现,预留)
+	scaleY:Number, //Y轴缩放(未实现,预留)
+}
+```
+
+### 备注2
+本组件样式支持iphone安全范围但需要手动开启
+请在插件被样式中最后备注的地方解除备注即可。
+控制台会报错,无视即可。
+或者复制如下样式样式代码
+```css
+// 安全域兼容样式
+page {
+	--safe-area-inset-top: 0px;
+	--safe-area-inset-right: 0px;
+	--safe-area-inset-bottom: 0px;
+	--safe-area-inset-left: 0px;
+
+	@supports (top: constant(safe-area-inset-top)) {
+		--safe-area-inset-top: constant(safe-area-inset-top);
+		--safe-area-inset-right: constant(safe-area-inset-right);
+		--safe-area-inset-bottom: constant(safe-area-inset-bottom);
+		--safe-area-inset-left: constant(safe-area-inset-left);
+	}
+
+	@supports (top: env(safe-area-inset-top)) {
+		--safe-area-inset-top: env(safe-area-inset-top);
+		--safe-area-inset-right: env(safe-area-inset-right);
+		//--safe-area-inset-bottom: 12px;
+		--safe-area-inset-bottom: env(safe-area-inset-bottom);
+		--safe-area-inset-left: env(safe-area-inset-left);
+	}
+}
+```
\ No newline at end of file
diff --git a/components/fr-image/fr-image.vue b/components/fr-image/fr-image.vue
new file mode 100644
index 0000000..d3c898c
--- /dev/null
+++ b/components/fr-image/fr-image.vue
@@ -0,0 +1,201 @@
+<template>
+	<view class="fr_img">
+		<!-- 主图 -->
+		<image class="fr_img_content" 
+		:src="src" :mode="mode" :lazy-load="lazyLoad" :webp="webp" :show-menu-by-longpress="showMenuByLongpress" @error="onImgError" @load="onImgLoad"/>
+		<view v-if="loading_complete && completeTransition" class="loading_complete_transition"></view>
+		
+		<!-- 加载失败图 -->
+		<view v-if="loading_error" class="loading_error"> <image class="loading_error_img" :src="loadingErrorImg" mode="aspectFit"></image> </view>
+		
+		<!-- 加载中图 -->
+		<view v-else-if="!loading_complete" class="loading"> 
+			
+			<view v-if="loadingIngImg == 'oblique-light'" class="loading_oblique_light"></view>
+			<view v-if="loadingIngImg == 'looming'" class="loading_looming"></view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		
+		props: {
+		  
+		  // 和官方Image组件属性一致
+		  src: { 
+		    type: String,
+			default: "",
+		  },
+		  
+		  mode: { 
+		    type: String,
+			default: "",
+		  },
+		  
+		  lazyLoad: {
+			  type: Boolean,
+			  default: false,
+		  },
+		  
+		  webp: {
+			  type: Boolean,
+			  default: false,
+		  },
+		  
+		  showMenuByLongpress: {
+			  type: Boolean,
+			  default: false,
+		  },
+		  
+		  
+		  // 可选: 加载失败图片:可以本地url、网络url、base64 (与src一致)
+		  loadingErrorImg: {
+			  type: String,
+			  default: require('./loading_error.png'),
+		  },
+		  
+		  // 可选: 加载中的图片
+		  // two-balls = 两个球来回转 
+		  // oblique-light = 斜光 
+		  // looming = 若影若现
+		  // 本地url、网络url、base64 = 自定义的加载中图片(与src一致)
+		  loadingIngImg: {
+			  type: String,
+			  default: "oblique-light",
+		  },
+		  
+		  // 可选:是否需要加载完成动画
+		  completeTransition: {
+			  type: Boolean,
+			  default: true,
+		  },
+		  
+		  
+		},
+		
+		data() {
+			return {
+				loading_complete: false,
+				loading_error: false,
+			};
+		},
+		
+		methods: {
+			onImgError: function(event){
+				this.loading_error = true;
+				this.$emit("error", event);
+			},
+			
+			onImgLoad: function(event){
+				this.loading_complete = true;
+				this.$emit("load", event);
+			},
+		},
+	}
+</script>
+
+<style lang="scss">
+
+.fr_img{
+	width: 100%;
+	height: 100%;
+	position: relative;
+	
+	.fr_img_content{
+		width: 100%;
+		height: 100%;
+		position: absolute;
+	}
+	
+	.loading_complete_transition{
+		width: 100%;
+		height: 100%;
+		position: absolute;
+		background-color: #FFFFFF;
+	    animation: loading_complete_transition 1.2s forwards;
+	}
+	
+	@keyframes loading_complete_transition{
+	    0% { opacity: 1; }
+	    100% { opacity: 0; }
+	} 
+	
+	
+	
+	.loading_error{
+		width: 100%;
+		height: 100%;
+		background-color: #F8F8F8;
+		position: absolute;
+		
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		
+		.loading_error_img{
+			width: 100rpx;
+			height: 100rpx;
+			max-width: 100%;
+			max-height: 100%;
+		}
+	}
+	
+	.loading{
+		width: 100%;
+		height: 100%;
+		background-color: #FFFFFF;
+		position: absolute;
+		
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		
+		// 加载图
+		.loading_img{
+			width: 100rpx;
+			height: 100rpx;
+			max-width: 100%;
+			max-height: 100%;
+		}
+		
+		// 斜光
+		.loading_oblique_light{
+			width: 100%;
+			height: 100%;
+			
+			background-color: #e3e3e3;
+			background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0) 80%);
+			background-size: 100rpx 100%;
+			background-repeat: repeat-y;
+			background-position:0 0;
+			animation: loading_oblique_light .6s infinite;
+		}
+		
+		@keyframes loading_oblique_light {
+		    to {
+		        background-position: 200% 0;
+		    }
+		}
+		
+		
+		// 若隐若现
+		.loading_looming{
+			width: 100%;
+			height: 100%;
+		    animation: loading_looming 1s infinite linear;
+		    background-color: #e3e3e3;
+		}
+		@keyframes loading_looming{
+		    0%   {background-color:rgba($color: #e3e3e3, $alpha: 0.5);}
+		    50%  {background-color:rgba($color: #e3e3e3, $alpha: 1.0);}
+		    100% {background-color:rgba($color: #e3e3e3, $alpha: 0.5);}
+		} 
+		
+	}
+	
+	
+}
+
+</style>
diff --git a/components/fr-image/loading_error.png b/components/fr-image/loading_error.png
new file mode 100644
index 0000000..9f6b4e9
Binary files /dev/null and b/components/fr-image/loading_error.png differ
diff --git a/components/ksp-image-cutter/ksp-image-cutter.vue b/components/ksp-image-cutter/ksp-image-cutter.vue
new file mode 100644
index 0000000..8d2af32
--- /dev/null
+++ b/components/ksp-image-cutter/ksp-image-cutter.vue
@@ -0,0 +1,847 @@
+<template>
+	<view v-show="properties.content" class="ksp-image-cutter" @tap="onok"
+		style="position: relative; width: 100%; height: 100%; overflow: hidden;">
+		<view class="body">
+			<!-- 背景图 -->
+			<view v-if="mask.show" class="mask"></view>
+			<!-- 窗口 -->
+			<view @touchstart="touchStart($event, 'plank')" :data-time="lastTapTime" @touchmove="touchMove"
+				@touchend="touchEnd" @touchcancel="touchCancel" class="plank"
+				:style="{transform: 'rotate(' + properties.angle + 'deg)'}">
+				<view class="frame" @touchstart="touchStart($event, 'frame')" @touchstart.stop.prevent="touchHandle"
+					:data-time="lastTapTime" :style="{left: frame.left + 'px', top: frame.top + 'px', 
+				     width: frame.width + 'px', height: frame.height + 'px'}">
+					<!-- 图片 -->
+					<image v-if="properties.content" class="image" :data-time="lastTapTime" @load="imageLoad" :style="{'margin-left': -(frame.left - image.left) + 'px', 'margin-top': -(frame.top - image.top) + 'px',
+					width: image.width + 'px', height: image.height + 'px'}" :src="properties.content"></image>
+					<view class="rect"></view>
+					<view class="line-one"></view>
+					<view class="line-two"></view>
+					<view class="line-three"></view>
+					<view class="line-four"></view>
+					<view @touchstart="touchStart($event, 'left')" @touchstart.stop.prevent="touchHandle"
+						class="frame-left">
+						<view class='left_edge'></view>
+					</view>
+					<view @touchstart="touchStart($event, 'right')" @touchstart.stop.prevent="touchHandle"
+						class="frame-right">
+						<view class='rightedge'> </view>
+					</view>
+					<view @touchstart="touchStart($event, 'top')" @touchstart.stop.prevent="touchHandle"
+						class="frame-top">
+						<view class='topedge'> </view>
+					</view>
+					<view @touchstart="touchStart($event, 'bottom')" @touchstart.stop.prevent="touchHandle"
+						class="frame-bottom">
+						<view class='bottomedge'> </view>
+					</view>
+					<view @touchstart="touchStart($event, 'left-top')" @touchstart.stop.prevent="touchHandle"
+						class="frame-left-top-wrap">
+						<view class='frame-left-top'> </view>
+					</view>
+					<view @touchstart="touchStart($event, 'left-bottom')" @touchstart.stop.prevent="touchHandle"
+						class="frame-left-bottom-wrap">
+						<view class='frame-left-bottom'> </view>
+					</view>
+					<view @touchstart="touchStart($event, 'right-top')" @touchstart.stop.prevent="touchHandle"
+						class="frame-right-top-wrap">
+						<view class='frame-right-top'> </view>
+					</view>
+					<view @touchstart="touchStart($event, 'right-bottom')" @touchstart.stop.prevent="touchHandle"
+						class="frame-right-bottom-wrap">
+						<view class='frame-right-bottom'> </view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	// 封装
+	import drag from '../../pages/index/js/drag.js'
+	export default {
+		props: {
+			properties: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			url: {
+				type: String,
+				default: ""
+			},
+			fixed: {
+				type: Boolean,
+				default: false
+			},
+			width: {
+				type: Number,
+				default: 200
+			},
+			height: {
+				type: Number,
+				default: 200
+			},
+			maxWidth: {
+				type: Number,
+				default: 1024
+			},
+			maxHeight: {
+				type: Number,
+				default: 1024
+			},
+			blob: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				mask: {
+					show: false
+				},
+				// 裁剪的窗口
+				frame: {
+					left: 100,
+					top: 100,
+					width: this.properties.width,
+					height: this.properties.height
+				},
+				// 背景图
+				image: {
+					left: 100,
+					top: 100,
+					width: this.properties.initialWidth,
+					height: this.properties.initialHeight
+				},
+				// 背景图初始
+				real: {
+					width: this.properties.initialWidth,
+					height: this.properties.initialHeight
+				},
+				// 裁剪的窗口初始
+				target: {
+					width: this.properties.width,
+					height: this.properties.height
+				},
+				touches: [],
+				type: "",
+				start: {
+					frame: {
+						left: 0,
+						top: 0,
+						width: 0,
+						height: 0
+					},
+					image: {
+						left: 0,
+						top: 0,
+						width: 0,
+						height: 0
+					},
+				},
+				timeoutId: -1,
+				context: Object,
+				targetContext: Object,
+				//后添加属性值
+				Centerleft: null,
+				Centertop: null,
+				lastTapTime: 0, //判断点击时间间隔
+			};
+		},
+		mounted() {
+			//#ifdef H5
+			this.$el.addEventListener("touchmove", (ev) => {
+				ev.preventDefault();
+			});
+			// #endif
+			// this.context = uni.createCanvasContext("canvas", this);
+			// this.targetContext = uni.createCanvasContext("target", this);
+		},
+		methods: {
+			doubleTap(e) {
+				console.log(e)
+				var curTime = e.timeStamp
+				var lastTime = e.currentTarget.dataset.time // 通过e.currentTarget.dataset.time 访问到绑定到该组件的自定义数据
+				if (curTime - lastTime > 0) {
+					if (curTime - lastTime < 300) { //是双击事件
+
+					}
+				}
+				this.lastTapTime = curTime
+			},
+			/**
+			 * 初始化方法
+			 * 获取图片宽高后,把图片缩放至剪切框大小,
+			 * 并使剪切框位于图片中央
+			 **/
+			init() {
+				if (!this.properties.content) return
+				let {
+					windowWidth,
+					windowHeight,
+					pixelRatio
+				} = wx.getSystemInfoSync()
+				let clipSize = windowWidth / 750
+				let clipHeight = windowHeight / 1206
+				// 计算宽度高度
+				this.real.width = this.properties.initialWidth * this.properties.initialScale
+				this.real.height = this.properties.initialHeight * this.properties.initialScale
+				this.image.width = this.properties.initialWidth * this.properties.initialScale
+				this.image.height = this.properties.initialHeight * this.properties.initialScale
+				this.image.angle = this.properties.angle
+				this.frame.width = this.properties.width;
+				this.frame.height = this.properties.height;
+				this.frame.angle = this.properties.angle;
+
+				let rotate = Math.abs(this.frame.angle) % 360 //计算角度
+				if (this.frame.angle < 0) {
+					let multiple = Math.ceil(Math.abs(this.frame.angle) / 360) //Math.ceil
+					rotate = this.frame.angle + multiple * 360
+				}
+				if (rotate == 360) {
+					rotate = 0;
+				}
+				this.frame.rotate = rotate; //设置新旋转角度
+
+				// 默认居中
+				this.Centerleft = (windowWidth - this.properties.width) / 2 - this.properties.frame_left
+				this.Centertop = (windowHeight - this.properties.height) / 2 - this.properties.frame_top
+				this.image.left = this.Centerleft
+				this.image.top = this.Centertop
+				this.frame.left = this.Centerleft
+				this.frame.top = this.Centertop
+				// 有值替换
+				if (this.properties.frame_left) {
+					this.frame.left = this.properties.frame_left + this.Centerleft
+				}
+				if (this.properties.frame_top) {
+					this.frame.top = this.properties.frame_top + this.Centertop
+				}
+				if (this.properties.image_left) {
+					this.image.left = this.properties.image_left + this.Centerleft
+				}
+				if (this.properties.image_top) {
+					this.image.top = this.properties.image_top + this.Centertop
+				}
+				// 初始化的位置
+				drag.initPos(this.frame)
+				drag.initPos(this.image)
+			},
+			imageLoad(ev) {
+				this.mask.show = true;
+			},
+			touchHandle(ev) {
+				//console.log(ev)
+				var curTime = ev.timeStamp
+				var lastTime = ev.currentTarget.dataset.time // 通过e.currentTarget.dataset.time 访问到绑定到该组件的自定义数据
+				if (curTime - lastTime > 0) {
+					if (curTime - lastTime < 300) { //是双击事件
+						this.onok()
+					}
+				}
+				this.lastTapTime = curTime
+			},
+			touchStart(ev, type) {
+				this.mask.show = false;
+				if (this.touches.length == 0) {
+					this.type = type;
+					this.start.frame.left = this.frame.left;
+					this.start.frame.top = this.frame.top;
+					this.start.frame.width = this.frame.width;
+					this.start.frame.height = this.frame.height;
+					this.start.image.left = this.image.left;
+					this.start.image.top = this.image.top;
+					this.start.image.width = this.image.width;
+					this.start.image.height = this.image.height;
+				}
+				var touches = ev.changedTouches;
+				for (var i = 0; i < touches.length; i++) {
+					var touch = touches[i];
+					this.touches.push(touch);
+				}
+			},
+			touchMove(ev) {
+				ev.preventDefault();
+				var touches = ev.touches;
+				// 点击
+				if (this.touches.length == 1) {
+					if (this.type == "plank" || this.type == "frame" || this.fixed) {
+						this.moveImage(this.touches[0], touches[0]);
+					} else {
+						this.scaleFrame(this.touches[0], touches[0], this.type);
+					}
+
+				} else if (this.touches.length == 2 && touches.length == 2) {
+					// 双指头操作
+					var ta = this.touches[0];
+					var tb = this.touches[1];
+					var tc = touches[0];
+					var td = touches[1];
+					if (ta.identifier != tc.identifier) {
+						var temp = tc;
+						tc = td;
+						td = temp;
+					}
+					this.scaleImage(ta, tb, tc, td);
+				}
+			},
+			touchEnd(ev) {
+				this.type = "";
+				this.touches = [];
+				drag.getTransferPosition(this.frame.left, this.frame.top, this.frame.width, this.frame.height, this.frame
+					.angle, this.frame.centerPos, this.frame)
+				drag.getTransferPosition(this.image.left, this.image.top, this.image.width, this.image.height, this.image
+					.angle, this.image.centerPos, this.image)
+			},
+			touchCancel(ev) {
+				this.type = "";
+				this.touches = [];
+			},
+
+			//计算距离
+			calculateDistance(dx, dy) {
+				let c = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)) //使用三角公式计算边c长度
+				let angle = this.getAngle(dx, dy) //计算移动位置角度差
+				let rad = (Math.PI / 180) * (angle - this.frame.rotate) //旋转角度转换公式
+				let diffY = (Math.sin(rad) * c) //计算角度差x轴
+				let diffX = (Math.cos(rad) * c) //计算角度差y轴
+				return {
+					x: diffX,
+					y: diffY
+				};
+			},
+
+			//计算相差角度
+			getAngle(x, y) {
+				let theta = Math.atan2(y, x) // range (-PI, PI]
+				theta = Math.round((180 / Math.PI) * theta) // rads to degs, range (-180, 180]
+				if (theta < 0) theta = 360 + theta // range [0, 360)
+				return theta
+			},
+
+
+			moveImage(ta, tb) {
+				// 计算角度
+				// let roat = Math.abs(this.properties.angle) % 360
+				// if (this.properties.angle < 0) {
+				// 	let multiple = Math.ceil(Math.abs(this.properties.angle) / 360)
+				// 	roat = this.properties.angle + multiple * 360
+				// }
+				var ax = tb.clientX - ta.clientX;
+				var ay = tb.clientY - ta.clientY;
+
+
+				let distance = this.calculateDistance(ax, ay);
+
+				ax = distance.x;
+				ay = distance.y;
+
+
+				this.image.left = this.start.image.left + ax;
+				this.image.top = this.start.image.top + ay;
+				if (this.image.left > this.frame.left) {
+					this.image.left = this.frame.left;
+				}
+				if (this.image.top > this.frame.top) {
+					this.image.top = this.frame.top;
+				}
+				if (this.image.left + this.image.width < this.frame.left + this.frame.width) {
+					this.image.left = this.frame.left + this.frame.width - this.image.width;
+				}
+				if (this.image.top + this.image.height < this.frame.top + this.frame.height) {
+					this.image.top = this.frame.top + this.frame.height - this.image.height;
+				}
+			},
+			scaleImage(ta, tb, tc, td) {
+				var x1 = ta.clientX;
+				var y1 = ta.clientY;
+				var x2 = tb.clientX;
+				var y2 = tb.clientY;
+				var x3 = tc.clientX;
+				var y3 = tc.clientY;
+				var x4 = td.clientX;
+				var y4 = td.clientY;
+				var ol = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+				var el = Math.sqrt((x3 - x4) * (x3 - x4) + (y3 - y4) * (y3 - y4));
+				var ocx = (x1 + x2) / 2;
+				var ocy = (y1 + y2) / 2;
+				var ecx = (x3 + x4) / 2;
+				var ecy = (y3 + y4) / 2;
+				var ax = ecx - ocx;
+				var ay = ecy - ocy;
+				var scale = el / ol;
+				if (this.start.image.width * scale < this.frame.width) {
+					scale = this.frame.width / this.start.image.width;
+				}
+				if (this.start.image.height * scale < this.frame.height) {
+					scale = this.frame.height / this.start.image.height;
+				}
+				if (this.start.image.width * scale < this.frame.width) {
+					scale = this.frame.width / this.start.image.width;
+				}
+				this.image.left = this.start.image.left + ax - (ocx - this.start.image.left) * (scale - 1);
+				this.image.top = this.start.image.top + ay - (ocy - this.start.image.top) * (scale - 1);
+				this.image.width = this.start.image.width * scale;
+				this.image.height = this.start.image.height * scale;
+				if (this.image.left > this.frame.left) {
+					this.image.left = this.frame.left;
+				}
+				if (this.image.top > this.frame.top) {
+					this.image.top = this.frame.top;
+				}
+				if (this.image.left + this.image.width < this.frame.left + this.frame.width) {
+					this.image.left = this.frame.left + this.frame.width - this.image.width;
+				}
+				if (this.image.top + this.image.height < this.frame.top + this.frame.height) {
+					this.image.top = this.frame.top + this.frame.height - this.image.height;
+				}
+			},
+			scaleFrame(ta, tb, type) {
+				// 计算角度
+				var ax = tb.clientX - ta.clientX;
+				var ay = tb.clientY - ta.clientY;
+
+
+				let distance = this.calculateDistance(ax, ay);
+				ax = distance.x;
+				ay = distance.y;
+
+
+				var x1 = this.start.frame.left;
+				var y1 = this.start.frame.top;
+				var x2 = this.start.frame.left + this.start.frame.width;
+				var y2 = this.start.frame.top + this.start.frame.height;
+				if (type == "left") {
+					x1 += ax;
+					this.frame.width = x2 - x1;
+					if (this.frame.width <= 50) {
+						x1 = x2 - 50
+					}
+				} else if (type == "right") {
+					x2 += ax;
+					this.frame.width = x2 - x1;
+					if (this.frame.width <= 50) {
+						x2 = x1 + 50
+					}
+				} else if (type == "top") {
+					y1 += ay;
+					this.frame.height = y2 - y1;
+					if (this.frame.height <= 50) {
+						y1 = y2 - 50
+					}
+				} else if (type == "bottom") {
+					y2 += ay;
+					this.frame.height = y2 - y1;
+					if (this.frame.height <= 50) {
+						y2 = y1 + 50
+					}
+				} else if (type == "left-top") {
+					x1 += ax;
+					y1 += ay;
+					this.frame.width = x2 - x1;
+					if (this.frame.width <= 50) {
+						x1 = x2 - 50
+					}
+					this.frame.height = y2 - y1;
+					if (this.frame.height <= 50) {
+						y1 = y2 - 50
+					}
+				} else if (type == "left-bottom") {
+					x1 += ax;
+					y2 += ay;
+					this.frame.width = x2 - x1;
+					if (this.frame.width <= 50) {
+						x1 = x2 - 50
+					}
+					this.frame.height = y2 - y1;
+					if (this.frame.height <= 50) {
+						y2 = y1 + 50
+					}
+				} else if (type == "right-top") {
+					x2 += ax;
+					y1 += ay;
+					this.frame.width = x2 - x1;
+					if (this.frame.width <= 50) {
+						x2 = x1 + 50
+					}
+					this.frame.height = y2 - y1;
+					if (this.frame.height <= 50) {
+						y1 = y2 - 50
+					}
+				} else if (type == "right-bottom") {
+					x2 += ax;
+					y2 += ay;
+					this.frame.width = x2 - x1;
+					if (this.frame.width <= 50) {
+						x2 = x1 + 50
+					}
+					this.frame.height = y2 - y1;
+					if (this.frame.height <= 50) {
+						y2 = y1 + 50
+					}
+				}
+				if (x1 < this.image.left) {
+					x1 = this.image.left;
+				}
+				if (y1 < this.image.top) {
+					y1 = this.image.top;
+				}
+				if (x2 > this.image.left + this.image.width) {
+					x2 = this.image.left + this.image.width;
+				}
+				if (y2 > this.image.top + this.image.height) {
+					y2 = this.image.top + this.image.height;
+				}
+				this.frame.left = x1;
+				this.frame.top = y1;
+				this.frame.width = x2 - x1;
+				this.frame.height = y2 - y1;
+			},
+			onok() {
+
+				var scale = this.image.width / this.real.width;
+				var x = (this.frame.left - this.image.left) / scale;
+				var y = (this.frame.top - this.image.top) / scale;
+				var width = this.frame.width / scale;
+				var height = this.frame.height / scale;
+				var tw = width;
+				var th = height;
+
+				// if (this.fixed) {
+				// 	tw = this.width / 2;
+				// 	th = this.height / 2;
+				// } else {
+				// 	if (tw > this.maxWidth / 2) {
+				// 		var sc = this.maxWidth / 2 / tw;
+				// 		tw = tw * sc;
+				// 		th = th * sc;
+				// 	}
+				// 	if (th > this.maxHeight / 2) {
+				// 		var sc = this.maxHeight / 2 / th;
+				// 		th = th * sc;
+				// 		tw = tw * sc;
+				// 	}
+				// }
+				this.target.width = tw;
+				this.target.height = th;
+
+				// 复制数据
+				// 裁剪的宽和高
+				this.properties.width = this.frame.width
+				this.properties.height = this.frame.height
+				// 图片放大比率
+				this.properties.initialScale = this.properties.initialScale * scale
+				this.properties.initialscaling = this.properties.initialScale
+				// 裁剪区和原图顶点
+				this.properties.frame_left = 0
+				this.properties.frame_top = 0
+				this.properties.image_left = -(this.frame.left - this.image.left)
+				this.properties.image_top = -(this.frame.top - this.image.top)
+				// 初始x,y放大比率
+				this.properties.initialScalex = 1
+				this.properties.initialScaley = 1
+				this.$emit('ok', this.properties);
+
+
+			},
+			// 返回
+			oncancle() {
+				this.$emit("cancel");
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.ksp-image-cutter {
+		position: absolute;
+		width: 100%;
+		height: 100%;
+		top: 0;
+		bottom: 0;
+		z-index: 1000;
+	}
+
+	.body {
+		position: absolute;
+		left: 0upx;
+		right: 0upx;
+		top: 0upx;
+		bottom: 0upx;
+	}
+
+	.mask {
+		position: absolute;
+		left: 0upx;
+		right: 0upx;
+		top: 0upx;
+		bottom: 0upx;
+		background: black;
+		opacity: 0.4;
+	}
+
+	.plank {
+		position: absolute;
+		left: 0upx;
+		right: 0upx;
+		top: 0upx;
+		bottom: 0upx;
+	}
+
+	.image {
+		position: absolute;
+	}
+
+	.frame {
+		position: absolute;
+	}
+
+	.canvas {
+		position: absolute;
+		display: block;
+		left: 0px;
+		top: 0px;
+	}
+
+	.rect {
+		position: absolute;
+		left: -2px;
+		top: -2px;
+		width: 100%;
+		height: 100%;
+		border: 2px solid white;
+	}
+
+	.line-one {
+		position: absolute;
+		width: 100%;
+		height: 1px;
+		background: white;
+		left: 0;
+		top: 33.3%;
+	}
+
+	.line-two {
+		position: absolute;
+		width: 100%;
+		height: 1px;
+		background: white;
+		left: 0;
+		top: 66.7%;
+	}
+
+	.line-three {
+		position: absolute;
+		width: 1px;
+		height: 100%;
+		background: white;
+		top: 0;
+		left: 33.3%;
+	}
+
+	.line-four {
+		position: absolute;
+		width: 1px;
+		height: 100%;
+		background: white;
+		top: 0;
+		left: 66.7%;
+	}
+
+	.frame-left {
+		position: absolute;
+		left: -30upx;
+		width: 40upx;
+		height: 100%;
+		top: 0;
+		background: transparent;
+
+		.left_edge {
+			position: absolute;
+			z-index: 99;
+			left: 24upx;
+			width: 6upx;
+			height: 40upx;
+			background: #5CE6B5;
+			top: calc(50% - 20upx);
+		}
+	}
+
+	.frame-right {
+		position: absolute;
+		z-index: 99;
+		right: -30upx;
+		width: 40upx;
+		height: 100%;
+		background: transparent;
+		top: 0;
+
+		.rightedge {
+			position: absolute;
+			z-index: 99;
+			right: 24upx;
+			width: 6upx;
+			height: 40upx;
+			background: #5CE6B5;
+			top: calc(50% - 20upx);
+		}
+	}
+
+	.frame-top {
+		position: absolute;
+		z-index: 99;
+		top: -30upx;
+		width: 100%;
+		height: 40upx;
+		background: transparent;
+		left: 0;
+		right: 0;
+		margin: auto;
+
+		.topedge {
+			position: absolute;
+			z-index: 99;
+			top: 24upx;
+			width: 40upx;
+			height: 6upx;
+			background: #5CE6B5;
+			left: 0;
+			right: 0;
+			margin: auto;
+		}
+	}
+
+	.frame-bottom {
+		position: absolute;
+		z-index: 99;
+		bottom: -30upx;
+		width: 100%;
+		height: 40upx;
+		background: transparent;
+		left: 0;
+		right: 0;
+		margin: auto;
+
+		.bottomedge {
+			position: absolute;
+			z-index: 99;
+			bottom: 24upx;
+			width: 40upx;
+			height: 6upx;
+			background: #5CE6B5;
+			left: 0;
+			right: 0;
+			margin: auto;
+		}
+	}
+
+	.left_edge::after,
+	.rightedge::after,
+	.topedge::after,
+	.bottomedge::after {
+		content: '';
+		position: absolute;
+		left: 0;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		transform: scale(2);
+	}
+
+	.frame-left-top-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		left: -30upx;
+		top: -30upx;
+
+		.frame-left-top {
+			position: absolute;
+			z-index: 100;
+			width: 30upx;
+			height: 30upx;
+			left: 24upx;
+			top: 24upx;
+			border-left: 6upx solid #5CE6B5;
+			border-top: 6upx solid #5CE6B5;
+		}
+	}
+
+	.frame-left-bottom-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		left: -30upx;
+		bottom: -30upx;
+
+		.frame-left-bottom {
+			position: absolute;
+			z-index: 100;
+			width: 30upx;
+			height: 30upx;
+			left: 24upx;
+			bottom: 24upx;
+			border-left: 6upx solid #5CE6B5;
+			border-bottom: 6upx solid #5CE6B5;
+		}
+	}
+
+	.frame-right-top-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		right: -30upx;
+		top: -30upx;
+
+		.frame-right-top {
+			position: absolute;
+			z-index: 100;
+			width: 30upx;
+			height: 30upx;
+			right: 24upx;
+			top: 24upx;
+			border-right: 6upx solid #5CE6B5;
+			border-top: 6upx solid #5CE6B5;
+		}
+	}
+
+	.frame-right-bottom-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		right: -30upx;
+		bottom: -30upx;
+
+		.frame-right-bottom {
+			position: absolute;
+			z-index: 100;
+			width: 30upx;
+			height: 30upx;
+			right: 24upx;
+			bottom: 24upx;
+			border-right: 6upx solid #5CE6B5;
+			border-bottom: 6upx solid #5CE6B5;
+		}
+	}
+
+	.frame-left-top::after,
+	.frame-right-top::after,
+	.frame-left-bottom::after,
+	.frame-right-bottom::after {
+		content: '';
+		position: absolute;
+		left: 0;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		transform: scale(1.5);
+	}
+</style>
diff --git a/components/m-icon/m-icon.css b/components/m-icon/m-icon.css
new file mode 100644
index 0000000..a1992ff
--- /dev/null
+++ b/components/m-icon/m-icon.css
@@ -0,0 +1,377 @@
+@font-face {
+	font-family: uniicons;
+	font-weight: normal;
+	font-style: normal;
+	src: url('https://img-cdn-qiniu.dcloud.net.cn/fonts/uni.ttf?t=1536565627510') format('truetype');
+}
+
+.m-icon {
+	font-family: uniicons;
+	font-size: 24px;
+	font-weight: normal;
+	font-style: normal;
+	line-height: 1;
+	display: inline-block;
+	text-decoration: none;
+	-webkit-font-smoothing: antialiased;
+}
+
+.m-icon.uni-active {
+	color: #007aff;
+}
+
+.m-icon-contact:before {
+	content: '\e100';
+}
+
+.m-icon-person:before {
+	content: '\e101';
+}
+
+.m-icon-personadd:before {
+	content: '\e102';
+}
+
+.m-icon-contact-filled:before {
+	content: '\e130';
+}
+
+.m-icon-person-filled:before {
+	content: '\e131';
+}
+
+.m-icon-personadd-filled:before {
+	content: '\e132';
+}
+
+.m-icon-phone:before {
+	content: '\e200';
+}
+
+.m-icon-email:before {
+	content: '\e201';
+}
+
+.m-icon-chatbubble:before {
+	content: '\e202';
+}
+
+.m-icon-chatboxes:before {
+	content: '\e203';
+}
+
+.m-icon-phone-filled:before {
+	content: '\e230';
+}
+
+.m-icon-email-filled:before {
+	content: '\e231';
+}
+
+.m-icon-chatbubble-filled:before {
+	content: '\e232';
+}
+
+.m-icon-chatboxes-filled:before {
+	content: '\e233';
+}
+
+.m-icon-weibo:before {
+	content: '\e260';
+}
+
+.m-icon-weixin:before {
+	content: '\e261';
+}
+
+.m-icon-pengyouquan:before {
+	content: '\e262';
+}
+
+.m-icon-chat:before {
+	content: '\e263';
+}
+
+.m-icon-qq:before {
+	content: '\e264';
+}
+
+.m-icon-videocam:before {
+	content: '\e300';
+}
+
+.m-icon-camera:before {
+	content: '\e301';
+}
+
+.m-icon-mic:before {
+	content: '\e302';
+}
+
+.m-icon-location:before {
+	content: '\e303';
+}
+
+.m-icon-mic-filled:before,
+.m-icon-speech:before {
+	content: '\e332';
+}
+
+.m-icon-location-filled:before {
+	content: '\e333';
+}
+
+.m-icon-micoff:before {
+	content: '\e360';
+}
+
+.m-icon-image:before {
+	content: '\e363';
+}
+
+.m-icon-map:before {
+	content: '\e364';
+}
+
+.m-icon-compose:before {
+	content: '\e400';
+}
+
+.m-icon-trash:before {
+	content: '\e401';
+}
+
+.m-icon-upload:before {
+	content: '\e402';
+}
+
+.m-icon-download:before {
+	content: '\e403';
+}
+
+.m-icon-close:before {
+	content: '\e404';
+}
+
+.m-icon-redo:before {
+	content: '\e405';
+}
+
+.m-icon-undo:before {
+	content: '\e406';
+}
+
+.m-icon-refresh:before {
+	content: '\e407';
+}
+
+.m-icon-star:before {
+	content: '\e408';
+}
+
+.m-icon-plus:before {
+	content: '\e409';
+}
+
+.m-icon-minus:before {
+	content: '\e410';
+}
+
+.m-icon-circle:before,
+.m-icon-checkbox:before {
+	content: '\e411';
+}
+
+.m-icon-close-filled:before,
+.m-icon-clear:before {
+	content: '\e434';
+}
+
+.m-icon-refresh-filled:before {
+	content: '\e437';
+}
+
+.m-icon-star-filled:before {
+	content: '\e438';
+}
+
+.m-icon-plus-filled:before {
+	content: '\e439';
+}
+
+.m-icon-minus-filled:before {
+	content: '\e440';
+}
+
+.m-icon-circle-filled:before {
+	content: '\e441';
+}
+
+.m-icon-checkbox-filled:before {
+	content: '\e442';
+}
+
+.m-icon-closeempty:before {
+	content: '\e460';
+}
+
+.m-icon-refreshempty:before {
+	content: '\e461';
+}
+
+.m-icon-reload:before {
+	content: '\e462';
+}
+
+.m-icon-starhalf:before {
+	content: '\e463';
+}
+
+.m-icon-spinner:before {
+	content: '\e464';
+}
+
+.m-icon-spinner-cycle:before {
+	content: '\e465';
+}
+
+.m-icon-search:before {
+	content: '\e466';
+}
+
+.m-icon-plusempty:before {
+	content: '\e468';
+}
+
+.m-icon-forward:before {
+	content: '\e470';
+}
+
+.m-icon-back:before,
+.m-icon-left-nav:before {
+	content: '\e471';
+}
+
+.m-icon-checkmarkempty:before {
+	content: '\e472';
+}
+
+.m-icon-home:before {
+	content: '\e500';
+}
+
+.m-icon-navigate:before {
+	content: '\e501';
+}
+
+.m-icon-gear:before {
+	content: '\e502';
+}
+
+.m-icon-paperplane:before {
+	content: '\e503';
+}
+
+.m-icon-info:before {
+	content: '\e504';
+}
+
+.m-icon-help:before {
+	content: '\e505';
+}
+
+.m-icon-locked:before {
+	content: '\e506';
+}
+
+.m-icon-more:before {
+	content: '\e507';
+}
+
+.m-icon-flag:before {
+	content: '\e508';
+}
+
+.m-icon-home-filled:before {
+	content: '\e530';
+}
+
+.m-icon-gear-filled:before {
+	content: '\e532';
+}
+
+.m-icon-info-filled:before {
+	content: '\e534';
+}
+
+.m-icon-help-filled:before {
+	content: '\e535';
+}
+
+.m-icon-more-filled:before {
+	content: '\e537';
+}
+
+.m-icon-settings:before {
+	content: '\e560';
+}
+
+.m-icon-list:before {
+	content: '\e562';
+}
+
+.m-icon-bars:before {
+	content: '\e563';
+}
+
+.m-icon-loop:before {
+	content: '\e565';
+}
+
+.m-icon-paperclip:before {
+	content: '\e567';
+}
+
+.m-icon-eye:before {
+	content: '\e568';
+}
+
+.m-icon-arrowup:before {
+	content: '\e580';
+}
+
+.m-icon-arrowdown:before {
+	content: '\e581';
+}
+
+.m-icon-arrowleft:before {
+	content: '\e582';
+}
+
+.m-icon-arrowright:before {
+	content: '\e583';
+}
+
+.m-icon-arrowthinup:before {
+	content: '\e584';
+}
+
+.m-icon-arrowthindown:before {
+	content: '\e585';
+}
+
+.m-icon-arrowthinleft:before {
+	content: '\e586';
+}
+
+.m-icon-arrowthinright:before {
+	content: '\e587';
+}
+
+.m-icon-pulldown:before {
+	content: '\e588';
+}
+
+.m-icon-scan:before {
+	content: "\e612";
+}
diff --git a/components/m-icon/m-icon.vue b/components/m-icon/m-icon.vue
new file mode 100644
index 0000000..57cb1f7
--- /dev/null
+++ b/components/m-icon/m-icon.vue
@@ -0,0 +1,23 @@
+<template>
+	<view class="m-icon" :class="['m-icon-'+type]" @click="onClick()"></view>
+</template>
+
+<script>
+	export default {
+		props: {
+			/**
+			 * 图标类型
+			 */
+			type: String
+		},
+		methods: {
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style>
+	@import "./m-icon.css";
+</style>
diff --git a/components/marked/index.js b/components/marked/index.js
new file mode 100644
index 0000000..a12f905
--- /dev/null
+++ b/components/marked/index.js
@@ -0,0 +1 @@
+module.exports = require('./lib/marked');
diff --git a/components/marked/lib/marked.js b/components/marked/lib/marked.js
new file mode 100644
index 0000000..6a71e92
--- /dev/null
+++ b/components/marked/lib/marked.js
@@ -0,0 +1,1573 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+;(function(root) {
+'use strict';
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+  newline: /^\n+/,
+  code: /^( {4}[^\n]+\n*)+/,
+  fences: noop,
+  hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+  heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+  nptable: noop,
+  blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+  list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+  html: '^ {0,3}(?:' // optional indentation
+    + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+    + '|comment[^\\n]*(\\n+|$)' // (2)
+    + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+    + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
+    + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
+    + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+    + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+    + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+    + ')',
+  def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+  table: noop,
+  lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+  paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
+  text: /^[^\n]+/
+};
+
+block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+block.def = edit(block.def)
+  .replace('label', block._label)
+  .replace('title', block._title)
+  .getRegex();
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = edit(block.item, 'gm')
+  .replace(/bull/g, block.bullet)
+  .getRegex();
+
+block.list = edit(block.list)
+  .replace(/bull/g, block.bullet)
+  .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+  .replace('def', '\\n+(?=' + block.def.source + ')')
+  .getRegex();
+
+block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+  + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+  + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+  + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+  + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+  + '|track|ul';
+block._comment = /<!--(?!-?>)[\s\S]*?-->/;
+block.html = edit(block.html, 'i')
+  .replace('comment', block._comment)
+  .replace('tag', block._tag)
+  .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+  .getRegex();
+
+block.paragraph = edit(block.paragraph)
+  .replace('hr', block.hr)
+  .replace('heading', block.heading)
+  .replace('lheading', block.lheading)
+  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+  .getRegex();
+
+block.blockquote = edit(block.blockquote)
+  .replace('paragraph', block.paragraph)
+  .getRegex();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+  fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
+  paragraph: /^/,
+  heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
+
+block.gfm.paragraph = edit(block.paragraph)
+  .replace('(?!', '(?!'
+    + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+    + block.list.source.replace('\\1', '\\3') + '|')
+  .getRegex();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+  nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+  table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
+});
+
+/**
+ * Pedantic grammar
+ */
+
+block.pedantic = merge({}, block.normal, {
+  html: edit(
+    '^ *(?:comment *(?:\\n|\\s*$)'
+    + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+    + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+    .replace('comment', block._comment)
+    .replace(/tag/g, '(?!(?:'
+      + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+      + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+      + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+    .getRegex(),
+  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+  this.tokens = [];
+  this.tokens.links = Object.create(null);
+  this.options = options || marked.defaults;
+  this.rules = block.normal;
+
+  if (this.options.pedantic) {
+    this.rules = block.pedantic;
+  } else if (this.options.gfm) {
+    if (this.options.tables) {
+      this.rules = block.tables;
+    } else {
+      this.rules = block.gfm;
+    }
+  }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+  var lexer = new Lexer(options);
+  return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+  src = src
+    .replace(/\r\n|\r/g, '\n')
+    .replace(/\t/g, '    ')
+    .replace(/\u00a0/g, ' ')
+    .replace(/\u2424/g, '\n');
+
+  return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top) {
+  src = src.replace(/^ +$/gm, '');
+  var next,
+      loose,
+      cap,
+      bull,
+      b,
+      item,
+      listStart,
+      listItems,
+      t,
+      space,
+      i,
+      tag,
+      l,
+      isordered,
+      istask,
+      ischecked;
+
+  while (src) {
+    // newline
+    if (cap = this.rules.newline.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[0].length > 1) {
+        this.tokens.push({
+          type: 'space'
+        });
+      }
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      cap = cap[0].replace(/^ {4}/gm, '');
+      this.tokens.push({
+        type: 'code',
+        text: !this.options.pedantic
+          ? rtrim(cap, '\n')
+          : cap
+      });
+      continue;
+    }
+
+    // fences (gfm)
+    if (cap = this.rules.fences.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'code',
+        lang: cap[2],
+        text: cap[3] || ''
+      });
+      continue;
+    }
+
+    // heading
+    if (cap = this.rules.heading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[1].length,
+        text: cap[2]
+      });
+      continue;
+    }
+
+    // table no leading pipe (gfm)
+    if (top && (cap = this.rules.nptable.exec(src))) {
+      item = {
+        type: 'table',
+        header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+      };
+
+      if (item.header.length === item.align.length) {
+        src = src.substring(cap[0].length);
+
+        for (i = 0; i < item.align.length; i++) {
+          if (/^ *-+: *$/.test(item.align[i])) {
+            item.align[i] = 'right';
+          } else if (/^ *:-+: *$/.test(item.align[i])) {
+            item.align[i] = 'center';
+          } else if (/^ *:-+ *$/.test(item.align[i])) {
+            item.align[i] = 'left';
+          } else {
+            item.align[i] = null;
+          }
+        }
+
+        for (i = 0; i < item.cells.length; i++) {
+          item.cells[i] = splitCells(item.cells[i], item.header.length);
+        }
+
+        this.tokens.push(item);
+
+        continue;
+      }
+    }
+
+    // hr
+    if (cap = this.rules.hr.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'hr'
+      });
+      continue;
+    }
+
+    // blockquote
+    if (cap = this.rules.blockquote.exec(src)) {
+      src = src.substring(cap[0].length);
+
+      this.tokens.push({
+        type: 'blockquote_start'
+      });
+
+      cap = cap[0].replace(/^ *> ?/gm, '');
+
+      // Pass `top` to keep the current
+      // "toplevel" state. This is exactly
+      // how markdown.pl works.
+      this.token(cap, top);
+
+      this.tokens.push({
+        type: 'blockquote_end'
+      });
+
+      continue;
+    }
+
+    // list
+    if (cap = this.rules.list.exec(src)) {
+      src = src.substring(cap[0].length);
+      bull = cap[2];
+      isordered = bull.length > 1;
+
+      listStart = {
+        type: 'list_start',
+        ordered: isordered,
+        start: isordered ? +bull : '',
+        loose: false
+      };
+
+      this.tokens.push(listStart);
+
+      // Get each top-level item.
+      cap = cap[0].match(this.rules.item);
+
+      listItems = [];
+      next = false;
+      l = cap.length;
+      i = 0;
+
+      for (; i < l; i++) {
+        item = cap[i];
+
+        // Remove the list item's bullet
+        // so it is seen as the next token.
+        space = item.length;
+        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+        // Outdent whatever the
+        // list item contains. Hacky.
+        if (~item.indexOf('\n ')) {
+          space -= item.length;
+          item = !this.options.pedantic
+            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+            : item.replace(/^ {1,4}/gm, '');
+        }
+
+        // Determine whether the next list item belongs here.
+        // Backpedal if it does not belong in this list.
+        if (this.options.smartLists && i !== l - 1) {
+          b = block.bullet.exec(cap[i + 1])[0];
+          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+            src = cap.slice(i + 1).join('\n') + src;
+            i = l - 1;
+          }
+        }
+
+        // Determine whether item is loose or not.
+        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+        // for discount behavior.
+        loose = next || /\n\n(?!\s*$)/.test(item);
+        if (i !== l - 1) {
+          next = item.charAt(item.length - 1) === '\n';
+          if (!loose) loose = next;
+        }
+
+        if (loose) {
+          listStart.loose = true;
+        }
+
+        // Check for task list items
+        istask = /^\[[ xX]\] /.test(item);
+        ischecked = undefined;
+        if (istask) {
+          ischecked = item[1] !== ' ';
+          item = item.replace(/^\[[ xX]\] +/, '');
+        }
+
+        t = {
+          type: 'list_item_start',
+          task: istask,
+          checked: ischecked,
+          loose: loose
+        };
+
+        listItems.push(t);
+        this.tokens.push(t);
+
+        // Recurse.
+        this.token(item, false);
+
+        this.tokens.push({
+          type: 'list_item_end'
+        });
+      }
+
+      if (listStart.loose) {
+        l = listItems.length;
+        i = 0;
+        for (; i < l; i++) {
+          listItems[i].loose = true;
+        }
+      }
+
+      this.tokens.push({
+        type: 'list_end'
+      });
+
+      continue;
+    }
+
+    // html
+    if (cap = this.rules.html.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: this.options.sanitize
+          ? 'paragraph'
+          : 'html',
+        pre: !this.options.sanitizer
+          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+        text: cap[0]
+      });
+      continue;
+    }
+
+    // def
+    if (top && (cap = this.rules.def.exec(src))) {
+      src = src.substring(cap[0].length);
+      if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+      tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+      if (!this.tokens.links[tag]) {
+        this.tokens.links[tag] = {
+          href: cap[2],
+          title: cap[3]
+        };
+      }
+      continue;
+    }
+
+    // table (gfm)
+    if (top && (cap = this.rules.table.exec(src))) {
+      item = {
+        type: 'table',
+        header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
+      };
+
+      if (item.header.length === item.align.length) {
+        src = src.substring(cap[0].length);
+
+        for (i = 0; i < item.align.length; i++) {
+          if (/^ *-+: *$/.test(item.align[i])) {
+            item.align[i] = 'right';
+          } else if (/^ *:-+: *$/.test(item.align[i])) {
+            item.align[i] = 'center';
+          } else if (/^ *:-+ *$/.test(item.align[i])) {
+            item.align[i] = 'left';
+          } else {
+            item.align[i] = null;
+          }
+        }
+
+        for (i = 0; i < item.cells.length; i++) {
+          item.cells[i] = splitCells(
+            item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
+            item.header.length);
+        }
+
+        this.tokens.push(item);
+
+        continue;
+      }
+    }
+
+    // lheading
+    if (cap = this.rules.lheading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[2] === '=' ? 1 : 2,
+        text: cap[1]
+      });
+      continue;
+    }
+
+    // top-level paragraph
+    if (top && (cap = this.rules.paragraph.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'paragraph',
+        text: cap[1].charAt(cap[1].length - 1) === '\n'
+          ? cap[1].slice(0, -1)
+          : cap[1]
+      });
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      // Top-level should never reach here.
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'text',
+        text: cap[0]
+      });
+      continue;
+    }
+
+    if (src) {
+      throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+  escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+  autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+  url: noop,
+  tag: '^comment'
+    + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+    + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+    + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+    + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+    + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
+  link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
+  reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+  nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+  strong: /^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
+  em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
+  code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
+  br: /^( {2,}|\\)\n(?!\s*$)/,
+  del: noop,
+  text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
+};
+
+inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+
+inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+inline.autolink = edit(inline.autolink)
+  .replace('scheme', inline._scheme)
+  .replace('email', inline._email)
+  .getRegex();
+
+inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+
+inline.tag = edit(inline.tag)
+  .replace('comment', block._comment)
+  .replace('attribute', inline._attribute)
+  .getRegex();
+
+inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
+inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
+inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+
+inline.link = edit(inline.link)
+  .replace('label', inline._label)
+  .replace('href', inline._href)
+  .replace('title', inline._title)
+  .getRegex();
+
+inline.reflink = edit(inline.reflink)
+  .replace('label', inline._label)
+  .getRegex();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+  link: edit(/^!?\[(label)\]\((.*?)\)/)
+    .replace('label', inline._label)
+    .getRegex(),
+  reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+    .replace('label', inline._label)
+    .getRegex()
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+  escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+  url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
+    .replace('email', inline._email)
+    .getRegex(),
+  _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+  del: /^~+(?=\S)([\s\S]*?\S)~+/,
+  text: edit(inline.text)
+    .replace(']|', '~]|')
+    .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
+    .getRegex()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+  br: edit(inline.br).replace('{2,}', '*').getRegex(),
+  text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+  this.options = options || marked.defaults;
+  this.links = links;
+  this.rules = inline.normal;
+  this.renderer = this.options.renderer || new Renderer();
+  this.renderer.options = this.options;
+
+  if (!this.links) {
+    throw new Error('Tokens array requires a `links` property.');
+  }
+
+  if (this.options.pedantic) {
+    this.rules = inline.pedantic;
+  } else if (this.options.gfm) {
+    if (this.options.breaks) {
+      this.rules = inline.breaks;
+    } else {
+      this.rules = inline.gfm;
+    }
+  }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+  var inline = new InlineLexer(links, options);
+  return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+  var out = '',
+      link,
+      text,
+      href,
+      title,
+      cap,
+      prevCapZero;
+
+  while (src) {
+    // escape
+    if (cap = this.rules.escape.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += cap[1];
+      continue;
+    }
+
+    // autolink
+    if (cap = this.rules.autolink.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = escape(this.mangle(cap[1]));
+        href = 'mailto:' + text;
+      } else {
+        text = escape(cap[1]);
+        href = text;
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // url (gfm)
+    if (!this.inLink && (cap = this.rules.url.exec(src))) {
+      do {
+        prevCapZero = cap[0];
+        cap[0] = this.rules._backpedal.exec(cap[0])[0];
+      } while (prevCapZero !== cap[0]);
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = escape(cap[0]);
+        href = 'mailto:' + text;
+      } else {
+        text = escape(cap[0]);
+        if (cap[1] === 'www.') {
+          href = 'http://' + text;
+        } else {
+          href = text;
+        }
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // tag
+    if (cap = this.rules.tag.exec(src)) {
+      if (!this.inLink && /^<a /i.test(cap[0])) {
+        this.inLink = true;
+      } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+        this.inLink = false;
+      }
+      src = src.substring(cap[0].length);
+      out += this.options.sanitize
+        ? this.options.sanitizer
+          ? this.options.sanitizer(cap[0])
+          : escape(cap[0])
+        : cap[0]
+      continue;
+    }
+
+    // link
+    if (cap = this.rules.link.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.inLink = true;
+      href = cap[2];
+      if (this.options.pedantic) {
+        link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+        if (link) {
+          href = link[1];
+          title = link[3];
+        } else {
+          title = '';
+        }
+      } else {
+        title = cap[3] ? cap[3].slice(1, -1) : '';
+      }
+      href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
+      out += this.outputLink(cap, {
+        href: InlineLexer.escapes(href),
+        title: InlineLexer.escapes(title)
+      });
+      this.inLink = false;
+      continue;
+    }
+
+    // reflink, nolink
+    if ((cap = this.rules.reflink.exec(src))
+        || (cap = this.rules.nolink.exec(src))) {
+      src = src.substring(cap[0].length);
+      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+      link = this.links[link.toLowerCase()];
+      if (!link || !link.href) {
+        out += cap[0].charAt(0);
+        src = cap[0].substring(1) + src;
+        continue;
+      }
+      this.inLink = true;
+      out += this.outputLink(cap, link);
+      this.inLink = false;
+      continue;
+    }
+
+    // strong
+    if (cap = this.rules.strong.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
+      continue;
+    }
+
+    // em
+    if (cap = this.rules.em.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
+      continue;
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.codespan(escape(cap[2].trim(), true));
+      continue;
+    }
+
+    // br
+    if (cap = this.rules.br.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.br();
+      continue;
+    }
+
+    // del (gfm)
+    if (cap = this.rules.del.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.del(this.output(cap[1]));
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.text(escape(this.smartypants(cap[0])));
+      continue;
+    }
+
+    if (src) {
+      throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return out;
+};
+
+InlineLexer.escapes = function(text) {
+  return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
+}
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+  var href = link.href,
+      title = link.title ? escape(link.title) : null;
+
+  return cap[0].charAt(0) !== '!'
+    ? this.renderer.link(href, title, this.output(cap[1]))
+    : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+  if (!this.options.smartypants) return text;
+  return text
+    // em-dashes
+    .replace(/---/g, '\u2014')
+    // en-dashes
+    .replace(/--/g, '\u2013')
+    // opening singles
+    .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+    // closing singles & apostrophes
+    .replace(/'/g, '\u2019')
+    // opening doubles
+    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+    // closing doubles
+    .replace(/"/g, '\u201d')
+    // ellipses
+    .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+  if (!this.options.mangle) return text;
+  var out = '',
+      l = text.length,
+      i = 0,
+      ch;
+
+  for (; i < l; i++) {
+    ch = text.charCodeAt(i);
+    if (Math.random() > 0.5) {
+      ch = 'x' + ch.toString(16);
+    }
+    out += '&#' + ch + ';';
+  }
+
+  return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+  this.options = options || marked.defaults;
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+  if (this.options.highlight) {
+    var out = this.options.highlight(code, lang);
+    if (out != null && out !== code) {
+      escaped = true;
+      code = out;
+    }
+  }
+
+  if (!lang) {
+    return '<pre><code>'
+      + (escaped ? code : escape(code, true))
+      + '</code></pre>';
+  }
+
+  return '<pre><code class="'
+    + this.options.langPrefix
+    + escape(lang, true)
+    + '">'
+    + (escaped ? code : escape(code, true))
+    + '</code></pre>\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+  return '<blockquote>\n' + quote + '</blockquote>\n';
+};
+
+Renderer.prototype.html = function(html) {
+  return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+  if (this.options.headerIds) {
+    return '<h'
+      + level
+      + ' id="'
+      + this.options.headerPrefix
+      + raw.toLowerCase().replace(/[^\w]+/g, '-')
+      + '">'
+      + text
+      + '</h'
+      + level
+      + '>\n';
+  }
+  // ignore IDs
+  return '<h' + level + '>' + text + '</h' + level + '>\n';
+};
+
+Renderer.prototype.hr = function() {
+  return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
+
+Renderer.prototype.list = function(body, ordered, start) {
+  var type = ordered ? 'ol' : 'ul',
+      startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
+  return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+  return '<li>' + text + '</li>\n';
+};
+
+Renderer.prototype.checkbox = function(checked) {
+  return '<input '
+    + (checked ? 'checked="" ' : '')
+    + 'disabled="" type="checkbox"'
+    + (this.options.xhtml ? ' /' : '')
+    + '> ';
+}
+
+Renderer.prototype.paragraph = function(text) {
+  return '<p>' + text + '</p>\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+  if (body) body = '<tbody>' + body + '</tbody>';
+
+  return '<table>\n'
+    + '<thead>\n'
+    + header
+    + '</thead>\n'
+    + body
+    + '</table>\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+  return '<tr>\n' + content + '</tr>\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+  var type = flags.header ? 'th' : 'td';
+  var tag = flags.align
+    ? '<' + type + ' align="' + flags.align + '">'
+    : '<' + type + '>';
+  return tag + content + '</' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+  return '<strong>' + text + '</strong>';
+};
+
+Renderer.prototype.em = function(text) {
+  return '<em>' + text + '</em>';
+};
+
+Renderer.prototype.codespan = function(text) {
+  return '<code>' + text + '</code>';
+};
+
+Renderer.prototype.br = function() {
+  return this.options.xhtml ? '<br/>' : '<br>';
+};
+
+Renderer.prototype.del = function(text) {
+  return '<del>' + text + '</del>';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+  if (this.options.sanitize) {
+    try {
+      var prot = decodeURIComponent(unescape(href))
+        .replace(/[^\w:]/g, '')
+        .toLowerCase();
+    } catch (e) {
+      return text;
+    }
+    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+      return text;
+    }
+  }
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  try {
+    href = encodeURI(href).replace(/%25/g, '%');
+  } catch (e) {
+    return text;
+  }
+  var out = '<a href="' + escape(href) + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += '>' + text + '</a>';
+  return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  var out = '<img src="' + href + '" alt="' + text + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += this.options.xhtml ? '/>' : '>';
+  return out;
+};
+
+Renderer.prototype.text = function(text) {
+  return text;
+};
+
+/**
+ * TextRenderer
+ * returns only the textual part of the token
+ */
+
+function TextRenderer() {}
+
+// no need for block level renderers
+
+TextRenderer.prototype.strong =
+TextRenderer.prototype.em =
+TextRenderer.prototype.codespan =
+TextRenderer.prototype.del =
+TextRenderer.prototype.text = function (text) {
+  return text;
+}
+
+TextRenderer.prototype.link =
+TextRenderer.prototype.image = function(href, title, text) {
+  return '' + text;
+}
+
+TextRenderer.prototype.br = function() {
+  return '';
+}
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+  this.tokens = [];
+  this.token = null;
+  this.options = options || marked.defaults;
+  this.options.renderer = this.options.renderer || new Renderer();
+  this.renderer = this.options.renderer;
+  this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options) {
+  var parser = new Parser(options);
+  return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+  this.inline = new InlineLexer(src.links, this.options);
+  // use an InlineLexer with a TextRenderer to extract pure text
+  this.inlineText = new InlineLexer(
+    src.links,
+    merge({}, this.options, {renderer: new TextRenderer()})
+  );
+  this.tokens = src.reverse();
+
+  var out = '';
+  while (this.next()) {
+    out += this.tok();
+  }
+
+  return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+  return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+  return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+  var body = this.token.text;
+
+  while (this.peek().type === 'text') {
+    body += '\n' + this.next().text;
+  }
+
+  return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+  switch (this.token.type) {
+    case 'space': {
+      return '';
+    }
+    case 'hr': {
+      return this.renderer.hr();
+    }
+    case 'heading': {
+      return this.renderer.heading(
+        this.inline.output(this.token.text),
+        this.token.depth,
+        unescape(this.inlineText.output(this.token.text)));
+    }
+    case 'code': {
+      return this.renderer.code(this.token.text,
+        this.token.lang,
+        this.token.escaped);
+    }
+    case 'table': {
+      var header = '',
+          body = '',
+          i,
+          row,
+          cell,
+          j;
+
+      // header
+      cell = '';
+      for (i = 0; i < this.token.header.length; i++) {
+        cell += this.renderer.tablecell(
+          this.inline.output(this.token.header[i]),
+          { header: true, align: this.token.align[i] }
+        );
+      }
+      header += this.renderer.tablerow(cell);
+
+      for (i = 0; i < this.token.cells.length; i++) {
+        row = this.token.cells[i];
+
+        cell = '';
+        for (j = 0; j < row.length; j++) {
+          cell += this.renderer.tablecell(
+            this.inline.output(row[j]),
+            { header: false, align: this.token.align[j] }
+          );
+        }
+
+        body += this.renderer.tablerow(cell);
+      }
+      return this.renderer.table(header, body);
+    }
+    case 'blockquote_start': {
+      body = '';
+
+      while (this.next().type !== 'blockquote_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.blockquote(body);
+    }
+    case 'list_start': {
+      body = '';
+      var ordered = this.token.ordered,
+          start = this.token.start;
+
+      while (this.next().type !== 'list_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.list(body, ordered, start);
+    }
+    case 'list_item_start': {
+      body = '';
+      var loose = this.token.loose;
+
+      if (this.token.task) {
+        body += this.renderer.checkbox(this.token.checked);
+      }
+
+      while (this.next().type !== 'list_item_end') {
+        body += !loose && this.token.type === 'text'
+          ? this.parseText()
+          : this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'html': {
+      // TODO parse inline content if parameter markdown=1
+      return this.renderer.html(this.token.text);
+    }
+    case 'paragraph': {
+      return this.renderer.paragraph(this.inline.output(this.token.text));
+    }
+    case 'text': {
+      return this.renderer.paragraph(this.parseText());
+    }
+  }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+  return html
+    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/"/g, '&quot;')
+    .replace(/'/g, '&#39;');
+}
+
+function unescape(html) {
+  // explicitly match decimal, hex, and named HTML entities
+  return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+    n = n.toLowerCase();
+    if (n === 'colon') return ':';
+    if (n.charAt(0) === '#') {
+      return n.charAt(1) === 'x'
+        ? String.fromCharCode(parseInt(n.substring(2), 16))
+        : String.fromCharCode(+n.substring(1));
+    }
+    return '';
+  });
+}
+
+function edit(regex, opt) {
+  regex = regex.source || regex;
+  opt = opt || '';
+  return {
+    replace: function(name, val) {
+      val = val.source || val;
+      val = val.replace(/(^|[^\[])\^/g, '$1');
+      regex = regex.replace(name, val);
+      return this;
+    },
+    getRegex: function() {
+      return new RegExp(regex, opt);
+    }
+  };
+}
+
+function resolveUrl(base, href) {
+  if (!baseUrls[' ' + base]) {
+    // we can ignore everything in base after the last slash of its path component,
+    // but we might need to add _that_
+    // https://tools.ietf.org/html/rfc3986#section-3
+    if (/^[^:]+:\/*[^/]*$/.test(base)) {
+      baseUrls[' ' + base] = base + '/';
+    } else {
+      baseUrls[' ' + base] = rtrim(base, '/', true);
+    }
+  }
+  base = baseUrls[' ' + base];
+
+  if (href.slice(0, 2) === '//') {
+    return base.replace(/:[\s\S]*/, ':') + href;
+  } else if (href.charAt(0) === '/') {
+    return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+  } else {
+    return base + href;
+  }
+}
+var baseUrls = {};
+var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+  var i = 1,
+      target,
+      key;
+
+  for (; i < arguments.length; i++) {
+    target = arguments[i];
+    for (key in target) {
+      if (Object.prototype.hasOwnProperty.call(target, key)) {
+        obj[key] = target[key];
+      }
+    }
+  }
+
+  return obj;
+}
+
+function splitCells(tableRow, count) {
+  // ensure that every cell-delimiting pipe has a space
+  // before it to distinguish it from an escaped pipe
+  var row = tableRow.replace(/\|/g, function (match, offset, str) {
+        var escaped = false,
+            curr = offset;
+        while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
+        if (escaped) {
+          // odd number of slashes means | is escaped
+          // so we leave it alone
+          return '|';
+        } else {
+          // add space before unescaped |
+          return ' |';
+        }
+      }),
+      cells = row.split(/ \|/),
+      i = 0;
+
+  if (cells.length > count) {
+    cells.splice(count);
+  } else {
+    while (cells.length < count) cells.push('');
+  }
+
+  for (; i < cells.length; i++) {
+    // leading or trailing whitespace is ignored per the gfm spec
+    cells[i] = cells[i].trim().replace(/\\\|/g, '|');
+  }
+  return cells;
+}
+
+// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+// /c*$/ is vulnerable to REDOS.
+// invert: Remove suffix of non-c chars instead. Default falsey.
+function rtrim(str, c, invert) {
+  if (str.length === 0) {
+    return '';
+  }
+
+  // Length of suffix matching the invert condition.
+  var suffLen = 0;
+
+  // Step left until we fail to match the invert condition.
+  while (suffLen < str.length) {
+    var currChar = str.charAt(str.length - suffLen - 1);
+    if (currChar === c && !invert) {
+      suffLen++;
+    } else if (currChar !== c && invert) {
+      suffLen++;
+    } else {
+      break;
+    }
+  }
+
+  return str.substr(0, str.length - suffLen);
+}
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+  // throw error in case of non string input
+  if (typeof src === 'undefined' || src === null) {
+    throw new Error('marked(): input parameter is undefined or null');
+  }
+  if (typeof src !== 'string') {
+    throw new Error('marked(): input parameter is of type '
+      + Object.prototype.toString.call(src) + ', string expected');
+  }
+
+  if (callback || typeof opt === 'function') {
+    if (!callback) {
+      callback = opt;
+      opt = null;
+    }
+
+    opt = merge({}, marked.defaults, opt || {});
+
+    var highlight = opt.highlight,
+        tokens,
+        pending,
+        i = 0;
+
+    try {
+      tokens = Lexer.lex(src, opt)
+    } catch (e) {
+      return callback(e);
+    }
+
+    pending = tokens.length;
+
+    var done = function(err) {
+      if (err) {
+        opt.highlight = highlight;
+        return callback(err);
+      }
+
+      var out;
+
+      try {
+        out = Parser.parse(tokens, opt);
+      } catch (e) {
+        err = e;
+      }
+
+      opt.highlight = highlight;
+
+      return err
+        ? callback(err)
+        : callback(null, out);
+    };
+
+    if (!highlight || highlight.length < 3) {
+      return done();
+    }
+
+    delete opt.highlight;
+
+    if (!pending) return done();
+
+    for (; i < tokens.length; i++) {
+      (function(token) {
+        if (token.type !== 'code') {
+          return --pending || done();
+        }
+        return highlight(token.text, token.lang, function(err, code) {
+          if (err) return done(err);
+          if (code == null || code === token.text) {
+            return --pending || done();
+          }
+          token.text = code;
+          token.escaped = true;
+          --pending || done();
+        });
+      })(tokens[i]);
+    }
+
+    return;
+  }
+  try {
+    if (opt) opt = merge({}, marked.defaults, opt);
+    return Parser.parse(Lexer.lex(src, opt), opt);
+  } catch (e) {
+    e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+    if ((opt || marked.defaults).silent) {
+      return '<p>An error occurred:</p><pre>'
+        + escape(e.message + '', true)
+        + '</pre>';
+    }
+    throw e;
+  }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+  merge(marked.defaults, opt);
+  return marked;
+};
+
+marked.getDefaults = function () {
+  return {
+    baseUrl: null,
+    breaks: false,
+    gfm: true,
+    headerIds: true,
+    headerPrefix: '',
+    highlight: null,
+    langPrefix: 'language-',
+    mangle: true,
+    pedantic: false,
+    renderer: new Renderer(),
+    sanitize: false,
+    sanitizer: null,
+    silent: false,
+    smartLists: false,
+    smartypants: false,
+    tables: true,
+    xhtml: false
+  };
+}
+
+marked.defaults = marked.getDefaults();
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+marked.TextRenderer = TextRenderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+  module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+  define(function() { return marked; });
+} else {
+  root.marked = marked;
+}
+})(this || (typeof window !== 'undefined' ? window : global));
diff --git a/components/mpvue-citypicker/city-data/area.js b/components/mpvue-citypicker/city-data/area.js
new file mode 100644
index 0000000..92dfc30
--- /dev/null
+++ b/components/mpvue-citypicker/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;
diff --git a/components/mpvue-citypicker/city-data/city.js b/components/mpvue-citypicker/city-data/city.js
new file mode 100644
index 0000000..8c1dc26
--- /dev/null
+++ b/components/mpvue-citypicker/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;
diff --git a/components/mpvue-citypicker/city-data/province.js b/components/mpvue-citypicker/city-data/province.js
new file mode 100644
index 0000000..1bd680e
--- /dev/null
+++ b/components/mpvue-citypicker/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;
diff --git a/components/mpvue-citypicker/mpvueCityPicker.vue b/components/mpvue-citypicker/mpvueCityPicker.vue
new file mode 100644
index 0000000..2a0416c
--- /dev/null
+++ b/components/mpvue-citypicker/mpvueCityPicker.vue
@@ -0,0 +1,210 @@
+<template>
+  <div class="mpvue-picker">
+    <div :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></div>
+    <div class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}">
+      <div class="mpvue-picker__hd" catchtouchmove="true">
+        <div class="mpvue-picker__action" @click="pickerCancel">取消</div>
+        <div class="mpvue-picker__action" :style="{color:themeColor}" @click="pickerConfirm">确定</div>
+      </div>
+      <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange">
+        <block>
+          <picker-view-column>
+            <div class="picker-item" v-for="(item,index) in provinceDataList" :key="index">{{item.label}}</div>
+          </picker-view-column>
+          <picker-view-column>
+            <div class="picker-item" v-for="(item,index) in cityDataList" :key="index">{{item.label}}</div>
+          </picker-view-column>
+          <picker-view-column>
+            <div class="picker-item" v-for="(item,index) in areaDataList" :key="index">{{item.label}}</div>
+          </picker-view-column>
+        </block>
+      </picker-view>
+    </div>
+  </div>
+</template>
+
+<script>
+import provinceData from './city-data/province.js';
+import cityData from './city-data/city.js';
+import areaData from './city-data/area.js';
+export default {
+  data() {
+    return {
+      pickerValue: [0, 0, 0],
+      provinceDataList: [],
+      cityDataList: [],
+      areaDataList: [],
+			/* 是否显示控件 */
+			showPicker: false,
+    };
+  },
+  created() {
+    this.init()
+  },
+  props: {
+    /* 默认值 */
+    pickerValueDefault: {
+      type: Array,
+      default(){
+				return [0, 0, 0]
+			}
+    },
+    /* 主题色 */
+    themeColor: String
+  },
+	watch:{
+		pickerValueDefault(){
+			this.init();
+		}
+	},
+  methods: {
+		init() {
+			this.handPickValueDefault(); // 对 pickerValueDefault 做兼容处理
+			this.provinceDataList = provinceData;
+			this.cityDataList = cityData[this.pickerValueDefault[0]];
+			this.areaDataList = areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]];
+			this.pickerValue = this.pickerValueDefault;
+		},
+    show() {
+      setTimeout(() => {
+        this.showPicker = true;
+      }, 0);
+    },
+    maskClick() {
+      this.pickerCancel();
+    },
+    pickerCancel() {
+      this.showPicker = false;
+      this._$emit('onCancel');
+    },
+    pickerConfirm(e) {
+      this.showPicker = false;
+      this._$emit('onConfirm');
+    },
+    showPickerView() {
+      this.showPicker = true;
+    },
+    handPickValueDefault() {
+      if (this.pickerValueDefault !== [0, 0, 0]) {
+        if (this.pickerValueDefault[0] > provinceData.length - 1) {
+          this.pickerValueDefault[0] = provinceData.length - 1;
+        }
+        if (this.pickerValueDefault[1] > cityData[this.pickerValueDefault[0]].length - 1) {
+          this.pickerValueDefault[1] = cityData[this.pickerValueDefault[0]].length - 1;
+        }
+        if (this.pickerValueDefault[2] > areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]].length - 1) {
+          this.pickerValueDefault[2] = areaData[this.pickerValueDefault[0]][this.pickerValueDefault[1]].length - 1;
+        }
+      }
+    },
+    pickerChange(e) {
+      let changePickerValue = e.mp.detail.value;
+      if (this.pickerValue[0] !== changePickerValue[0]) {
+        // 第一级发生滚动
+        this.cityDataList = cityData[changePickerValue[0]];
+        this.areaDataList = areaData[changePickerValue[0]][0];
+        changePickerValue[1] = 0;
+        changePickerValue[2] = 0;
+      } else if (this.pickerValue[1] !== changePickerValue[1]) {
+        // 第二级滚动
+        this.areaDataList =
+          areaData[changePickerValue[0]][changePickerValue[1]];
+        changePickerValue[2] = 0;
+      }
+      this.pickerValue = changePickerValue;
+      this._$emit('onChange');
+    },
+    _$emit(emitName) {
+      let pickObj = {
+        label: this._getLabel(),
+        value: this.pickerValue,
+        cityCode: this._getCityCode()
+      };
+      this.$emit(emitName, pickObj);
+    },
+    _getLabel() {
+      let pcikerLabel =
+        this.provinceDataList[this.pickerValue[0]].label +
+        '-' +
+        this.cityDataList[this.pickerValue[1]].label +
+        '-' +
+        this.areaDataList[this.pickerValue[2]].label;
+      return pcikerLabel;
+    },
+    _getCityCode() {
+      return this.areaDataList[this.pickerValue[2]].value;
+    }
+  }
+};
+</script>
+
+<style>
+.pickerMask {
+  position: fixed;
+  z-index: 1000;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.6);
+}
+.mpvue-picker-content {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  transition: all 0.3s ease;
+  transform: translateY(100%);
+  z-index: 3000;
+}
+.mpvue-picker-view-show {
+  transform: translateY(0);
+}
+.mpvue-picker__hd {
+  display: flex;
+  padding: 9px 15px;
+  background-color: #fff;
+  position: relative;
+  text-align: center;
+  font-size: 17px;
+}
+.mpvue-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);
+}
+.mpvue-picker__action {
+  display: block;
+  flex: 1;
+  color: #1aad19;
+}
+.mpvue-picker__action:first-child {
+  text-align: left;
+  color: #888;
+}
+.mpvue-picker__action:last-child {
+  text-align: right;
+}
+.picker-item {
+  text-align: center;
+  line-height: 40px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 16px;
+}
+.mpvue-picker-view {
+  position: relative;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 238px;
+  background-color: rgba(255, 255, 255, 1);
+}
+</style>
diff --git a/components/mpvue-picker/mpvuePicker.vue b/components/mpvue-picker/mpvuePicker.vue
new file mode 100644
index 0000000..413fd40
--- /dev/null
+++ b/components/mpvue-picker/mpvuePicker.vue
@@ -0,0 +1,464 @@
+<template>
+    <view class="mpvue-picker">
+        <view :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></view>
+        <view class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}">
+            <view class="mpvue-picker__hd" catchtouchmove="true">
+                <view class="mpvue-picker__action" @click.prevent="pickerCancel">取消</view>
+                <view class="mpvue-picker__action" :style="{color:themeColor}" @click.prevent="pickerConfirm">确定</view>
+            </view>
+            <!-- 单列 -->
+            <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change.prevent="pickerChange" v-if="mode==='selector' && pickerValueSingleArray.length > 0">
+                <block>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueSingleArray" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                </block>
+            </picker-view>
+            <!-- 时间选择器 -->
+            <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange" v-if="mode==='timeSelector'">
+                <block>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueHour" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueMinute" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                </block>
+            </picker-view>
+            <!-- 多列选择 -->
+            <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange" v-if="mode==='multiSelector'">
+                <block v-for="(n,index) in pickerValueMulArray.length" :key="index">
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index1) in pickerValueMulArray[n]" :key="index1">{{item.label}}</view>
+                    </picker-view-column>
+                </block>
+            </picker-view>
+            <!-- 二级联动 -->
+            <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChangeMul" v-if="mode==='multiLinkageSelector' && deepLength===2">
+                <block>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueMulTwoOne" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueMulTwoTwo" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                </block>
+            </picker-view>
+            <!-- 三级联动 -->
+            <picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChangeMul" v-if="mode==='multiLinkageSelector' && deepLength===3">
+                <block>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueMulThreeOne" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueMulThreeTwo" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                    <picker-view-column>
+                        <view class="picker-item" v-for="(item,index) in pickerValueMulThreeThree" :key="index">{{item.label}}</view>
+                    </picker-view-column>
+                </block>
+            </picker-view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                pickerChangeValue: [],
+                pickerValue: [],
+                pickerValueArrayChange: true,
+                modeChange: false,
+                pickerValueSingleArray: [],
+                pickerValueHour: [],
+                pickerValueMinute: [],
+                pickerValueMulArray: [],
+                pickerValueMulTwoOne: [],
+                pickerValueMulTwoTwo: [],
+                pickerValueMulThreeOne: [],
+                pickerValueMulThreeTwo: [],
+                pickerValueMulThreeThree: [],
+				/* 是否显示控件 */
+				showPicker: false,
+            };
+        },
+        props: {
+            /* mode */
+            mode: {
+                type: String,
+                default: 'selector'
+            },
+            /* picker 数值 */
+            pickerValueArray: {
+                type: Array,
+                default(){
+					return []
+				}
+            },
+            /* 默认值 */
+            pickerValueDefault: {
+                type: Array,
+                default(){
+                	return []
+                }
+            },
+            /* 几级联动 */
+            deepLength: {
+                type: Number,
+                default: 2
+            },
+            /* 主题色 */
+            themeColor: String
+        },
+        watch: {
+            pickerValueArray(oldVal, newVal) {
+                this.pickerValueArrayChange = true;
+            },
+            mode(oldVal, newVal) {
+                this.modeChange = true;
+            },
+			pickerValueArray(val){
+				this.initPicker(val);
+			}
+        },
+        methods: {
+            initPicker(valueArray) {
+                let pickerValueArray = valueArray;
+                this.pickerValue = this.pickerValueDefault;
+                // 初始化多级联动
+                if (this.mode === 'selector') {
+                    this.pickerValueSingleArray = valueArray;
+                } else if (this.mode === 'timeSelector') {
+                    this.modeChange = false;
+                    let hourArray = [];
+                    let minuteArray = [];
+                    for (let i = 0; i < 24; i++) {
+                        hourArray.push({
+                            value: i,
+                            label: i > 9 ? `${i} 时` : `0${i} 时`
+                        });
+                    }
+                    for (let i = 0; i < 60; i++) {
+                        minuteArray.push({
+                            value: i,
+                            label: i > 9 ? `${i} 分` : `0${i} 分`
+                        });
+                    }
+                    this.pickerValueHour = hourArray;
+                    this.pickerValueMinute = minuteArray;
+                } else if (this.mode === 'multiSelector') {
+                    this.pickerValueMulArray = valueArray;
+                } else if (this.mode === 'multiLinkageSelector' && this.deepLength === 2) {
+                    // 两级联动
+                    let pickerValueMulTwoOne = [];
+                    let pickerValueMulTwoTwo = [];
+                    // 第一列
+                    for (let i = 0, length = pickerValueArray.length; i < length; i++) {
+                        pickerValueMulTwoOne.push(pickerValueArray[i]);
+                    }
+                    // 渲染第二列
+                    // 如果有设定的默认值
+                    if (this.pickerValueDefault.length === 2) {
+                        let num = this.pickerValueDefault[0];
+                        for (
+                            let i = 0, length = pickerValueArray[num].children.length; i < length; i++
+                        ) {
+                            pickerValueMulTwoTwo.push(pickerValueArray[num].children[i]);
+                        }
+                    } else {
+                        for (
+                            let i = 0, length = pickerValueArray[0].children.length; i < length; i++
+                        ) {
+                            pickerValueMulTwoTwo.push(pickerValueArray[0].children[i]);
+                        }
+                    }
+                    this.pickerValueMulTwoOne = pickerValueMulTwoOne;
+                    this.pickerValueMulTwoTwo = pickerValueMulTwoTwo;
+                } else if (
+                    this.mode === 'multiLinkageSelector' &&
+                    this.deepLength === 3
+                ) {
+                    let pickerValueMulThreeOne = [];
+                    let pickerValueMulThreeTwo = [];
+                    let pickerValueMulThreeThree = [];
+                    // 第一列
+                    for (let i = 0, length = pickerValueArray.length; i < length; i++) {
+                        pickerValueMulThreeOne.push(pickerValueArray[i]);
+                    }
+                    // 渲染第二列
+                    this.pickerValueDefault =
+                        this.pickerValueDefault.length === 3 ?
+                        this.pickerValueDefault :
+                        [0, 0, 0];
+                    if (this.pickerValueDefault.length === 3) {
+                        let num = this.pickerValueDefault[0];
+                        for (
+                            let i = 0, length = pickerValueArray[num].children.length; i < length; i++
+                        ) {
+                            pickerValueMulThreeTwo.push(pickerValueArray[num].children[i]);
+                        }
+                        // 第三列
+                        let numSecond = this.pickerValueDefault[1];
+                        for (let i = 0, length = pickerValueArray[num].children[numSecond].children.length; i < length; i++) {
+                            pickerValueMulThreeThree.push(
+                                pickerValueArray[num].children[numSecond].children[i]
+                            );
+                        }
+                    }
+                    this.pickerValueMulThreeOne = pickerValueMulThreeOne;
+                    this.pickerValueMulThreeTwo = pickerValueMulThreeTwo;
+                    this.pickerValueMulThreeThree = pickerValueMulThreeThree;
+                }
+            },
+            show() {
+                setTimeout(() => {
+                    if (this.pickerValueArrayChange || this.modeChange) {
+                        this.initPicker(this.pickerValueArray);
+                        this.showPicker = true;
+                        this.pickerValueArrayChange = false;
+                        this.modeChange = false;
+                    } else {
+                        this.showPicker = true;
+                    }
+                }, 0);
+            },
+            maskClick() {
+                this.pickerCancel();
+            },
+            pickerCancel() {
+                this.showPicker = false;
+                this._initPickerVale();
+                let pickObj = {
+                    index: this.pickerValue,
+                    value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
+                    label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
+                };
+                this.$emit('onCancel', pickObj);
+            },
+            pickerConfirm(e) {
+                this.showPicker = false;
+                this._initPickerVale();
+                let pickObj = {
+                    index: this.pickerValue,
+                    value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
+                    label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
+                };
+                this.$emit('onConfirm', pickObj);
+            },
+            showPickerView() {
+                this.showPicker = true;
+            },
+            pickerChange(e) {
+                this.pickerValue = e.mp.detail.value;
+                let pickObj = {
+                    index: this.pickerValue,
+                    value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
+                    label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
+                };
+                this.$emit('onChange', pickObj);
+            },
+            pickerChangeMul(e) {
+                if (this.deepLength === 2) {
+                    let pickerValueArray = this.pickerValueArray;
+                    let changeValue = e.mp.detail.value;
+                    // 处理第一列滚动
+                    if (changeValue[0] !== this.pickerValue[0]) {
+                        let pickerValueMulTwoTwo = [];
+                        // 第一列滚动第二列数据更新
+                        for (let i = 0, length = pickerValueArray[changeValue[0]].children.length; i < length; i++) {
+                            pickerValueMulTwoTwo.push(pickerValueArray[changeValue[0]].children[i]);
+                        }
+                        this.pickerValueMulTwoTwo = pickerValueMulTwoTwo;
+                        // 第二列初始化为 0
+                        changeValue[1] = 0;
+                    }
+                    this.pickerValue = changeValue;
+                } else if (this.deepLength === 3) {
+                    let pickerValueArray = this.pickerValueArray;
+                    let changeValue = e.mp.detail.value;
+                    let pickerValueMulThreeTwo = [];
+                    let pickerValueMulThreeThree = [];
+                    // 重新渲染第二列
+                    // 如果是第一列滚动
+                    if (changeValue[0] !== this.pickerValue[0]) {
+                        this.pickerValueMulThreeTwo = [];
+                        for (let i = 0, length = pickerValueArray[changeValue[0]].children.length; i < length; i++) {
+                            pickerValueMulThreeTwo.push(pickerValueArray[changeValue[0]].children[i]);
+                        }
+                        // 重新渲染第三列
+                        for (let i = 0, length = pickerValueArray[changeValue[0]].children[0].children.length; i <
+                            length; i++) {
+                            pickerValueMulThreeThree.push(pickerValueArray[changeValue[0]].children[0].children[i]);
+                        }
+                        changeValue[1] = 0;
+                        changeValue[2] = 0;
+                        this.pickerValueMulThreeTwo = pickerValueMulThreeTwo;
+                        this.pickerValueMulThreeThree = pickerValueMulThreeThree;
+                    } else if (changeValue[1] !== this.pickerValue[1]) {
+                        // 第二列滚动
+                        // 重新渲染第三列
+                        this.pickerValueMulThreeThree = [];
+                        pickerValueMulThreeTwo = this.pickerValueMulThreeTwo;
+                        for (let i = 0, length = pickerValueArray[changeValue[0]].children[changeValue[1]].children.length; i <
+                            length; i++) {
+                            pickerValueMulThreeThree.push(pickerValueArray[changeValue[0]].children[changeValue[1]].children[
+                                i]);
+                        }
+                        changeValue[2] = 0;
+                        this.pickerValueMulThreeThree = pickerValueMulThreeThree;
+                    }
+                    this.pickerValue = changeValue;
+                }
+                let pickObj = {
+                    index: this.pickerValue,
+                    value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
+                    label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
+                };
+                this.$emit('onChange', pickObj);
+            },
+            // 获取 pxikerLabel
+            _getPickerLabelAndValue(value, mode) {
+                let pickerLable;
+                let pickerGetValue = [];
+                // selector
+                if (mode === 'selector') {
+                    pickerLable = this.pickerValueSingleArray[value].label;
+                    pickerGetValue.push(this.pickerValueSingleArray[value].value);
+                } else if (mode === 'timeSelector') {
+                    pickerLable = `${this.pickerValueHour[value[0]].label}-${this.pickerValueMinute[value[1]].label}`;
+                    pickerGetValue.push(this.pickerValueHour[value[0]].value);
+                    pickerGetValue.push(this.pickerValueHour[value[1]].value);
+                } else if (mode === 'multiSelector') {
+                    for (let i = 0; i < value.length; i++) {
+                        if (i > 0) {
+                            pickerLable += this.pickerValueMulArray[i][value[i]].label + (i === value.length - 1 ? '' :
+                                '-');
+                        } else {
+                            pickerLable = this.pickerValueMulArray[i][value[i]].label + '-';
+                        }
+                        pickerGetValue.push(this.pickerValueMulArray[i][value[i]].value);
+                    }
+                } else if (mode === 'multiLinkageSelector') {
+                    /* eslint-disable indent */
+                    pickerLable =
+                        this.deepLength === 2 ?
+                        `${this.pickerValueMulTwoOne[value[0]].label}-${this.pickerValueMulTwoTwo[value[1]].label}` :
+                        `${this.pickerValueMulThreeOne[value[0]].label}-${this.pickerValueMulThreeTwo[value[1]].label}-${this.pickerValueMulThreeThree[value[2]].label}`;
+                    if (this.deepLength === 2) {
+                        pickerGetValue.push(this.pickerValueMulTwoOne[value[0]].value);
+                        pickerGetValue.push(this.pickerValueMulTwoTwo[value[1]].value);
+                    } else {
+                        pickerGetValue.push(this.pickerValueMulThreeOne[value[0]].value);
+                        pickerGetValue.push(this.pickerValueMulThreeTwo[value[1]].value);
+                        pickerGetValue.push(this.pickerValueMulThreeThree[value[2]].value);
+                    }
+                    /* eslint-enable indent */
+                }
+                return {
+                    label: pickerLable,
+                    value: pickerGetValue
+                };
+            },
+            // 初始化 pickerValue 默认值
+            _initPickerVale() {
+                if (this.pickerValue.length === 0) {
+                    if (this.mode === 'selector') {
+                        this.pickerValue = [0];
+                    } else if (this.mode === 'multiSelector') {
+                        this.pickerValue = new Int8Array(this.pickerValueArray.length);
+                    } else if (
+                        this.mode === 'multiLinkageSelector' &&
+                        this.deepLength === 2
+                    ) {
+                        this.pickerValue = [0, 0];
+                    } else if (
+                        this.mode === 'multiLinkageSelector' &&
+                        this.deepLength === 3
+                    ) {
+                        this.pickerValue = [0, 0, 0];
+                    }
+                }
+            }
+        }
+    };
+</script>
+
+<style>
+    .pickerMask {
+        position: fixed;
+        z-index: 9999;
+        top: 0;
+        right: 0;
+        left: 0;
+        bottom: 0;
+        background: rgba(0, 0, 0, 0.6);
+    }
+
+    .mpvue-picker-content {
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        transition: all 0.3s ease;
+        transform: translateY(100%);
+        z-index: 9999;
+    }
+
+    .mpvue-picker-view-show {
+        transform: translateY(0);
+    }
+
+    .mpvue-picker__hd {
+        display: flex;
+        padding: 9px 15px;
+        background-color: #fff;
+        position: relative;
+        text-align: center;
+        font-size: 17px;
+    }
+
+    .mpvue-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);
+    }
+
+    .mpvue-picker__action {
+        display: block;
+        flex: 1;
+        color: #1aad19;
+    }
+
+    .mpvue-picker__action:first-child {
+        text-align: left;
+        color: #888;
+    }
+
+    .mpvue-picker__action:last-child {
+        text-align: right;
+    }
+
+    .picker-item {
+        text-align: center;
+        line-height: 40px;
+        font-size: 16px;
+		color: #000000;
+    }
+
+    .mpvue-picker-view {
+        position: relative;
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        height: 238px;
+        background-color: rgba(255, 255, 255, 1);
+    }
+</style>
diff --git a/components/navbar/navbar.vue b/components/navbar/navbar.vue
new file mode 100644
index 0000000..b33ef63
--- /dev/null
+++ b/components/navbar/navbar.vue
@@ -0,0 +1,74 @@
+<template>
+	<view class="navbar">
+		<view class="nav-left">
+			<image v-if="showBack" @click="navbarAction" class="menu-img" src="../../static/png/navbar_menu.png" mode="aspectFill"></image>
+		</view>
+		<view class="nav-middle">
+			<text class="title">{{title}}</text>
+		</view>
+		<view class="nav-right"></view>
+	</view>
+</template>
+
+<script>
+	export default  {
+		props: {
+			showBack: {
+				type: Boolean,
+				default () {
+					return true;
+				}
+			},
+			title: {
+				type: String,
+				default () {
+					return '极简画板';
+				}
+			}
+		},
+		methods: {
+			navbarAction () {
+				this.$emit('navbarBtnTap');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar {
+		height: 70px;
+		background-color: #fff;
+		display: flex;
+		// border-bottom: 1upx $uni-border-color solid;
+		
+		.nav-left {
+			width: 10%;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			
+			.menu-img {
+				width: 40upx;
+				height: 40upx;
+				margin-top: 15px;
+			}
+		}
+		
+		.nav-middle {
+			width: 80%;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			
+			.title {
+				color: #ff875d;
+				font-size: 34upx;
+				margin-top: 15px;
+			}
+		}
+		
+		.nav-right {
+			width: 10%;
+		}
+	}
+</style>
diff --git a/components/navbar/navber-mine.vue b/components/navbar/navber-mine.vue
new file mode 100644
index 0000000..363b7a9
--- /dev/null
+++ b/components/navbar/navber-mine.vue
@@ -0,0 +1,74 @@
+<template>
+	<view class="navbar">
+		<view class="nav-left">
+			<image v-if="showBack" @click="navbarAction" class="menu-img" src="../../static/png/navbar_back.png" mode="aspectFill"></image>
+		</view>
+		<view class="nav-middle">
+			<text class="title">{{title}}</text>
+		</view>
+		<view class="nav-right"></view>
+	</view>
+</template>
+
+<script>
+	export default  {
+		props: {
+			title: {
+				type: String,
+				default () {
+					return '关于';
+				}
+			},
+			showBack: {
+				type: Boolean,
+				default () {
+					return true;
+				}
+			}
+		},
+		methods: {
+			navbarAction () {
+				this.$emit('navbarBtnTap');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar {
+		height: 70px;
+		background-color: #fff;
+		display: flex;
+		// border-bottom: 1upx $uni-border-color solid;
+		
+		.nav-left {
+			width: 10%;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			
+			.menu-img {
+				width: 40upx;
+				height: 40upx;
+				margin-top: 15px;
+			}
+		}
+		
+		.nav-middle {
+			width: 80%;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			
+			.title {
+				color: #ff875d;
+				font-size: 34upx;
+				margin-top: 15px;
+			}
+		}
+		
+		.nav-right {
+			width: 10%;
+		}
+	}
+</style>
diff --git a/components/t-color-picker/t-color-picker.vue b/components/t-color-picker/t-color-picker.vue
new file mode 100644
index 0000000..9826a4c
--- /dev/null
+++ b/components/t-color-picker/t-color-picker.vue
@@ -0,0 +1,802 @@
+<template>
+	<view v-show="show" class="t-wrapper" @touchmove.stop.prevent="moveHandle">
+		<view class="t-mask" :class="{active:active}" @click.stop="close"></view>
+		<view class="t-box" :class="{active:active}">
+			<!-- <view class="t-header">
+				<view class="t-header-button" @click="close">取消</view>
+				<view class="t-header-button" @click="confirm">确认</view>
+			</view> -->
+			<!-- 颜色 -->
+			<scroll-view style="box-sizing: border-box; white-space: nowrap; margin: 10upx 0;" scroll-x scroll-with-animation >
+				<view style="text-align: center; display: inline-block;" class="t-alternative__item" v-for="(item,index) in colorList" :key="index">
+					<view class="t-alternative__item-content" :style="{ background: 'rgba(' + item.r + ',' + item.g + ',' + item.b + ',' + item.a + ')' }"
+					 @click="selectColor(item,index)">
+						<image v-if="index == selectColorIndex" src="../../static/mine/icon_confirm.png" mode="" 
+						style="width: 31upx; height: 22upx;"></image>
+					</view>
+				</view>
+				<view class="t-alternative__item" style="text-align: center; display: inline-block;">
+					<view class="t-alternative__item-content" style="background: rgba(0,0,0,0)"
+					 @click="eliminate(item)">
+					</view>
+				</view>
+			</scroll-view>
+			<view class="t-color__box" style="height: 0;" :style="{ background: 'rgb(' + bgcolor.r + ',' + bgcolor.g + ',' + bgcolor.b + ')'}">
+				<view class="t-background boxs" @touchstart="touchstart($event, 0)" @touchmove="touchmove($event, 0)" @touchend="touchend($event, 0)">
+					<!-- <view class="t-color-mask"></view>
+					<view class="t-pointer" :style="{ top: site[0].top - 8 + 'px', left: site[0].left - 8 + 'px' }"></view> -->
+				</view>
+			</view>
+			<!-- <view class="t-control__box">
+				<view class="t-control__color">
+					<view class="t-control__color-content" :style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + rgba.a + ')' }"></view>
+				</view>
+				<view class="t-control-box__item">
+					<view class="t-controller boxs" @touchstart="touchstart($event, 1)" @touchmove="touchmove($event, 1)" @touchend="touchend($event, 1)">
+						<view class="t-hue">
+							<view class="t-circle" :style="{ left: site[1].left - 12 + 'px' }"></view>
+						</view>
+					</view>
+				</view>
+			</view> -->
+			<view class="t-control__box">
+				<view class="t-control__color">
+					<!-- <view class="t-control__color-content" 
+					:style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + rgba.a + ')' }"></view> -->
+					<view class="t-control__color-content"
+					:style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',1)' }"></view>
+				</view>
+				<view class="t-control-box__item">
+					<view style="height: 0;" class="t-controller boxs" @touchstart="touchstart($event, 1)" @touchmove="touchmove($event, 1)" @touchend="touchend($event, 1)">
+						<!-- <view class="t-hue">
+							<view class="t-circle" :style="{ left: site[1].left - 12 + 'px' }"></view>
+						</view> -->
+					</view>
+					<view class="t-controller boxs" @touchstart="touchstart($event, 2)" @touchmove="touchmove($event, 2)" @touchend="touchend($event, 2)">
+						<!-- background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%); -->
+						<view class="t-transparency" 
+						:style="{'background': 'linear-gradient(to left, rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',0.2' + ') 0%, rgb(' + rgba.r + ',' + rgba.g + ',' + rgba.b + '))'}">
+							<view class="t-circle" :class="{'t-circle-active':tCircleActive}" :style="{ left: site[2].left + 'px' }"></view>
+						</view>
+					</view>
+				</view>
+				<view class="t-control__color">
+					<view class="t-control__color-content"
+					:style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',0.2)' }"></view>
+				</view>
+			</view>
+			<!-- <view class="t-result__box">
+				<view v-if="mode" class="t-result__item">
+					<view class="t-result__box-input">{{hex}}</view>
+					<view class="t-result__box-text">HEX</view>
+				</view>
+				<template v-else>
+					<view class="t-result__item">
+						<view class="t-result__box-input">{{rgba.r}}</view>
+						<view class="t-result__box-text">R</view>
+					</view>
+					<view class="t-result__item">
+						<view class="t-result__box-input">{{rgba.g}}</view>
+						<view class="t-result__box-text">G</view>
+					</view>
+					<view class="t-result__item">
+						<view class="t-result__box-input">{{rgba.b}}</view>
+						<view class="t-result__box-text">B</view>
+					</view>
+					<view class="t-result__item">
+						<view class="t-result__box-input">{{rgba.a}}</view>
+						<view class="t-result__box-text">A</view>
+					</view>
+				</template>
+				<view class="t-result__item t-select" @click="select">
+					<view class="t-result__box-input">
+						<view>切换</view>
+						<view>模式</view>
+					</view>
+				</view>
+			</view> -->
+			<!-- <view class="t-alternative">
+				<view class="t-alternative__item" v-for="(item,index) in colorList" :key="index">
+					<view class="t-alternative__item-content" :style="{ background: 'rgba(' + item.r + ',' + item.g + ',' + item.b + ',' + item.a + ')' }"
+					 @click="selectColor(item)">
+					</view>
+				</view>
+				<view class="t-alternative__item" >
+					<view class="t-alternative__item-content" style="background: rgba(0,0,0,0)"
+					 @click="eliminate(item)">
+					</view>
+				</view>
+			</view> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			color: {
+				type: Object,
+				default () {
+					return {
+						r: 0,
+						g: 0,
+						b: 0,
+						a: 0
+					}
+				}
+			},
+			spareColor: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			background_color:{
+				type:String,
+				default () {
+					return null
+				}
+			}
+		},
+		data() {
+			return {
+				show: false,
+				active: false,
+				background_state:false,
+				// rgba 颜色
+				rgba: {r: 0,g: 0,b: 0,a: 1},
+				// hsb 颜色
+				hsb: {h: 0,s: 0,b: 0},
+				site: [{top: 0,left: 0}, {left: 0}, {left: 0}],
+				index: 0,
+				bgcolor: {r: 255,g: 0,b: 0,a: 1},
+				hex: '#000000',
+				mode: true,
+				colorList: [
+					{r: 0,g: 0,b: 0,a: 1}, 
+					{r: 255,g: 255,b: 255,a: 1},
+					{r: 245,g: 99,b: 100,a: 1}, 
+					{r: 5,g: 11,b: 222,a: 1}, 
+					{r: 255,g: 116,b: 80,a: 1}, 
+					{r: 158,g: 235,b: 255,a: 1}, 
+					{r: 248,g: 229,b: 12,a: 1}, 
+					{r: 255,g: 162,b: 200,a: 1}, 
+					{r: 95,g: 220,b: 203,a: 1}, 
+				],
+				tCircleActive:false,
+				selectColorIndex:0
+			};
+		},
+		created() {
+			this.rgba = this.color;
+			if (this.spareColor.length !== 0) {
+				this.colorList = this.spareColor;
+			}
+		},
+		methods: {
+			eliminate(){
+				wx.showToast({title: '清空背景色',icon: 'none'})
+				this.close();
+				this.$emit('confirm', {rgba: {},hex: null})
+			},
+			/**
+			 * 初始化
+			 */
+			init() {
+				// hsb 颜色
+				this.hsb = this.rgbToHex(this.rgba);
+				this.hex = '#' + this.rgbToHex(this.rgba);
+				// this.setColor();
+			},
+			moveHandle() {},
+			open() {
+				this.background_state = false
+				this.show = true;
+				this.$nextTick(() => {
+					this.init();
+					setTimeout(() => {
+						this.active = true;
+						setTimeout(() => {
+							this.getSelectorQuery();
+						}, 350)
+					}, 50)
+				})
+
+			},
+			close() {
+				this.active = false;
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false;
+					}, 500)
+				})
+			},
+			confirm() {
+				this.close();
+				this.$emit('confirm', {
+					rgba: this.rgba,
+					hex: this.hex
+				})
+			},
+			// 选择模式
+			// select() {
+			// 	this.mode = !this.mode
+			// },
+			// 常用颜色选择
+			selectColor(item,index) {
+				this.selectColorIndex = index
+				this.background_state = true
+				this.setColorBySelect(item)
+			},
+			touchstart(e, index) {
+				this.tCircleActive = true
+				this.background_state = true
+				if(index == 0) return;
+				const {
+					pageX,
+					pageY
+				} = e.touches[0];
+				this.pageX = pageX;
+				this.pageY = pageY;
+				this.setPosition(pageX, pageY, index);
+			},
+			touchmove(e, index) {
+				this.tCircleActive = true
+				this.background_state = true
+				if(index == 0) return;
+				const {
+					pageX,
+					pageY
+				} = e.touches[0];
+				this.moveX = pageX;
+				this.moveY = pageY;
+				this.setPosition(pageX, pageY, index);
+			},
+			touchend(e, index) {
+				this.tCircleActive = false
+				this.background_state = true
+			},
+			/**
+			 * 设置位置
+			 */
+			setPosition(x, y, index) {
+				this.index = index;
+				const {
+					top,
+					left,
+					width,
+					height
+				} = this.position[index];
+				// 设置最大最小值
+				this.site[index].left = Math.max(0, Math.min(parseInt(x - left), (width - 24)));
+				
+				// if (index === 0) {
+				// 	this.site[index].top = Math.max(0, Math.min(parseInt(y - top), height));
+				// 	// 设置颜色
+				// 	this.hsb.s = parseInt((100 * this.site[index].left) / width);
+				// 	this.hsb.b = parseInt(100 - (100 * this.site[index].top) / height);
+				// 	this.setColor();
+				// 	this.setValue(this.rgba);
+				// } else {
+					this.setControl(index, this.site[index].left);
+				// }
+			},
+			/**
+			 * 设置 rgb 颜色
+			 */
+			setColor() {
+				const rgb = this.HSBToRGB(this.hsb);
+				this.rgba.r = rgb.r;
+				this.rgba.g = rgb.g;
+				this.rgba.b = rgb.b;
+			},
+			/**
+			 * 设置二进制颜色
+			 * @param {Object} rgb
+			 */
+			setValue(rgb) {
+				// this.hex = '#' + this.rgbToHex(rgb);
+				this.hex = this.getHexColor(rgb);
+				// console.log(this.hex)
+				if(this.background_state == true){
+					this.$emit('confirm', {
+						rgba: this.rgba,
+						hex: this.hex
+					})
+				}
+			},
+			//转化颜色 值为:rgba(194, 78, 78, 1) 转化为: #c24e4e
+			getHexColor(color) {
+			  // var values = color
+			  //   .replace(/rgba?\(/, '')
+			  //   .replace(/\)/, '')
+			  //   .replace(/[\s+]/g, '')
+			  //   .split(',')
+			  var a = parseFloat(color.a || 1),
+			    r = Math.floor(a * parseInt(color.r) + (1 - a) * 255),
+			    g = Math.floor(a * parseInt(color.g) + (1 - a) * 255),
+			    b = Math.floor(a * parseInt(color.b) + (1 - a) * 255)
+			  return '#' +
+			    ('0' + r.toString(16)).slice(-2) +
+			    ('0' + g.toString(16)).slice(-2) +
+			    ('0' + b.toString(16)).slice(-2)
+			},
+			setControl(index, x) {
+				const {
+					top,
+					left,
+					width,
+					height
+				} = this.position[index];
+				// if (index === 1) {
+				// 	this.hsb.h = parseInt((360 * x) / width);
+				// 	this.bgcolor = this.HSBToRGB({
+				// 		h: this.hsb.h,
+				// 		s: 100,
+				// 		b: 100
+				// 	});
+				// 	this.setColor()
+				// 	this.setValue(this.rgba);
+				// } else {
+					this.rgba.a =   (1 - 0.8 * (x / width)).toFixed(3);
+					this.setValue(this.rgba);
+				// }
+			},
+			/**
+			 * rgb 转 二进制 hex
+			 * @param {Object} rgb
+			 */
+			rgbToHex(rgb) {
+				let hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];
+				hex.map(function(str, i) {
+					if (str.length == 1) {
+						hex[i] = '0' + str;
+					}
+				});
+				return hex.join('');
+			},
+			setColorBySelect(getrgb) {
+				const {
+					r,
+					g,
+					b,
+					a
+				} = getrgb;
+				let rgb = {}
+				rgb = {
+					r: r ? parseInt(r) : 0,
+					g: g ? parseInt(g) : 0,
+					b: b ? parseInt(b) : 0,
+					a: a ? a : 0,
+				};
+				this.rgba = rgb;
+				this.hsb = this.rgbToHsb(rgb);
+				this.changeViewByHsb();
+			},
+			changeViewByHsb() {
+				const [a, b, c] = this.position;
+				this.site[0].left = parseInt(this.hsb.s * a.width / 100);
+				this.site[0].top = parseInt((100 - this.hsb.b) * a.height / 100);
+				this.setColor(this.hsb.h);
+				this.setValue(this.rgba);
+				this.bgcolor = this.HSBToRGB({
+					h: this.hsb.h,
+					s: 100,
+					b: 100
+				});
+				this.site[1].left = this.hsb.h / 360 * b.width;
+				// this.site[2].left = (1 - this.rgba.a) * c.width;
+				this.site[2].left = (1 -  this.rgba.a) / 0.8 * c.width
+				// console.log(this.site[2].left)
+				// (1 - 0.8 * (x100 / width400)).toFixed(1);
+			},
+			/**
+			 * hsb 转 rgb
+			 * @param {Object} 颜色模式  H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度
+			 */
+			HSBToRGB(hsb) {
+				let rgb = {};
+				let h = Math.round(hsb.h);
+				let s = Math.round((hsb.s * 255) / 100);
+				let v = Math.round((hsb.b * 255) / 100);
+				if (s == 0) {
+					rgb.r = rgb.g = rgb.b = v;
+				} else {
+					let t1 = v;
+					let t2 = ((255 - s) * v) / 255;
+					let t3 = ((t1 - t2) * (h % 60)) / 60;
+					if (h == 360) h = 0;
+					if (h < 60) {
+						rgb.r = t1;
+						rgb.b = t2;
+						rgb.g = t2 + t3;
+					} else if (h < 120) {
+						rgb.g = t1;
+						rgb.b = t2;
+						rgb.r = t1 - t3;
+					} else if (h < 180) {
+						rgb.g = t1;
+						rgb.r = t2;
+						rgb.b = t2 + t3;
+					} else if (h < 240) {
+						rgb.b = t1;
+						rgb.r = t2;
+						rgb.g = t1 - t3;
+					} else if (h < 300) {
+						rgb.b = t1;
+						rgb.g = t2;
+						rgb.r = t2 + t3;
+					} else if (h < 360) {
+						rgb.r = t1;
+						rgb.g = t2;
+						rgb.b = t1 - t3;
+					} else {
+						rgb.r = 0;
+						rgb.g = 0;
+						rgb.b = 0;
+					}
+				}
+				return {
+					r: Math.round(rgb.r),
+					g: Math.round(rgb.g),
+					b: Math.round(rgb.b)
+				};
+			},
+			rgbToHsb(rgb) {
+				let hsb = {
+					h: 0,
+					s: 0,
+					b: 0
+				};
+				let min = Math.min(rgb.r, rgb.g, rgb.b);
+				let max = Math.max(rgb.r, rgb.g, rgb.b);
+				let delta = max - min;
+				hsb.b = max;
+				hsb.s = max != 0 ? 255 * delta / max : 0;
+				if (hsb.s != 0) {
+					if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;
+					else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;
+					else hsb.h = 4 + (rgb.r - rgb.g) / delta;
+				} else hsb.h = -1;
+				hsb.h *= 60;
+				if (hsb.h < 0) hsb.h = 0;
+				hsb.s *= 100 / 255;
+				hsb.b *= 100 / 255;
+				return hsb;
+			},
+			getSelectorQuery() {
+				const views = uni.createSelectorQuery().in(this);
+				views
+					.selectAll('.boxs')
+					.boundingClientRect(data => {
+						if (!data || data.length === 0) {
+							setTimeout(() => this.getSelectorQuery(), 20)
+							return
+						}
+						this.position = data;
+						// this.site[0].top = data[0].height;
+						// this.site[0].left = 0;
+						// this.site[1].left = data[1].width;
+						// this.site[2].left = data[2].width;
+						this.setColorBySelect(this.rgba);
+					})
+					.exec();
+			}
+		},
+		watch: {
+			spareColor(newVal) {
+				this.colorList = newVal;
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	//隐藏滚动条
+	::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		color: transparent;
+		display: none;
+	}
+	
+	.t-wrapper {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		box-sizing: border-box;
+		z-index: 9999;
+	}
+
+	.t-box {
+		width: 100%;
+		position: absolute;
+		bottom: 0;
+		padding: 30upx 0;
+		padding-top: 0;
+		background: #262730;
+		transition: all 0.3s;
+		transform: translateY(100%);
+	}
+
+	.t-box.active {
+		transform: translateY(0%);
+	}
+
+	.t-header {
+		display: flex;
+		justify-content: space-between;
+		width: 100%;
+		height: 100upx;
+		border-bottom: 1px #eee solid;
+		box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);
+		background: #fff;
+	}
+
+	.t-header-button {
+		display: flex;
+		align-items: center;
+		width: 150upx;
+		height: 100upx;
+		font-size: 30upx;
+		color: #666;
+		padding-left: 20upx;
+	}
+
+	.t-header-button:last-child {
+		justify-content: flex-end;
+		padding-right: 20upx;
+	}
+
+	.t-mask {
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.6);
+		z-index: -1;
+		transition: all 0.3s;
+		opacity: 0;
+	}
+
+	.t-mask.active {
+		opacity: 1;
+	}
+
+	.t-color__box {
+		position: relative;
+		height: 400upx;
+		background: rgb(255, 0, 0);
+		overflow: hidden;
+		box-sizing: border-box;
+		margin: 0 20upx;
+		margin-top: 20upx;
+		box-sizing: border-box;
+	}
+
+	.t-background {
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0));
+	}
+
+	.t-color-mask {
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		width: 100%;
+		height: 400upx;
+		background: linear-gradient(to top, #000, rgba(0, 0, 0, 0));
+	}
+
+	.t-pointer {
+		position: absolute;
+		bottom: -8px;
+		left: -8px;
+		z-index: 2;
+		width: 15px;
+		height: 15px;
+		border: 1px #fff solid;
+		border-radius: 50%;
+	}
+
+	.t-show-color {
+		width: 100upx;
+		height: 50upx;
+	}
+
+	.t-control__box {
+		/* margin-top: 50upx;*/
+		margin-bottom: 50upx; 
+		width: 100%;
+		display: flex;
+		padding:0 20upx;
+		box-sizing: border-box;
+		align-items: center;
+	}
+
+	.t-control__color {
+		flex-shrink: 0;
+		width: 47upx;
+		height: 47upx;
+		border-radius: 50%;
+		// background-color: #fff;
+		// background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
+		// 	linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
+		// background-size: 36upx 36upx;
+		// background-position: 0 0, 18upx 18upx;
+		// border: 1px #eee solid;
+		overflow: hidden;
+	}
+
+	.t-control__color-content {
+		width: 100%;
+		height: 100%;
+	}
+
+	.t-control-box__item {
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		width: 100%;
+		padding: 0 20upx;
+	}
+
+	.t-controller {
+		position: relative;
+		width: 100%;
+		height: 10px;
+		// background-color: #fff;
+		// background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
+		// 	linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
+		// background-size: 32upx 32upx;
+		// background-position: 0 0, 16upx 16upx;
+		border-radius: 15upx;
+	}
+
+	.t-hue {
+		width: 100%;
+		height: 100%;
+		background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);
+	}
+
+	.t-transparency {
+		width: 100%;
+		height: 100%;
+		border-radius: 15upx;
+	}
+	.t-circle-active{
+		border: 1px solid #33B3D5 !important;
+		// box-sizing: border-box;
+		box-shadow: 0 0 2px 10px rgba(0, 0, 0, 0.1);
+	}
+	.t-circle {
+		position: absolute;
+		right: -12px;
+		top: -7px;
+		width: 24px;
+		height: 24px;
+		// box-sizing: border-box;
+		border-radius: 50%;
+		background: #FFFFFF;
+		// box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);
+		// border: 1px solid #86D1EA;
+		box-shadow: 0px 7px 22px 5px rgba(2, 11, 31, 0.35);
+		// &:before {
+		// 	position: absolute;
+		// 	top: 0;
+		// 	left: 0;
+		// 	right: 0;
+		// 	bottom: 0;
+		// 	margin: auto;
+		// 	display: block;
+		// 	width: 10px;
+		// 	height: 10px;
+		// 	border-radius: 50%;
+		// 	background: #33B3D5;
+		// 	content: '';
+		// }
+	}
+
+	.t-result__box {
+		margin-top: 20upx;
+		padding: 10upx;
+		width: 100%;
+		display: flex;
+		box-sizing: border-box;
+	}
+
+	.t-result__item {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		padding: 10upx;
+		width: 100%;
+		box-sizing: border-box;
+	}
+
+	.t-result__box-input {
+		padding: 10upx 0;
+		width: 100%;
+		font-size: 28upx;
+		box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1);
+		color: #999;
+		text-align: center;
+		background: #fff;
+	}
+
+	.t-result__box-text {
+		margin-top: 10upx;
+		font-size: 28upx;
+		line-height: 2;
+	}
+
+	.t-select {
+		flex-shrink: 0;
+		width: 150upx;
+		padding: 0 30upx;
+	}
+
+	.t-select .t-result__box-input {
+		border-radius: 10upx;
+		border: none;
+		color: #999;
+		box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.1);
+		background: #fff;
+	}
+
+	.t-select .t-result__box-input:active {
+		box-shadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.1);
+	}
+
+	.t-alternative {
+		display: flex;
+		flex-wrap: wrap;
+		/* justify-content: space-between; */
+		width: 100%;
+		padding-right: 10upx;
+		box-sizing: border-box;
+	}
+
+	.t-alternative__item {
+		margin-left: 12upx;
+		margin-top: 10upx;
+		// width: 60upx;
+		// height: 60upx;
+		// border-radius: 10upx;
+		width: 67upx;
+		height: 67upx;
+		border-radius: 50%;
+		
+		background-color: #fff;
+		background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
+			linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
+		background-size: 36upx 36upx;
+		background-position: 0 0, 18upx 18upx;
+		// border: 1px #eee solid;
+		overflow: hidden;
+	}
+
+	.t-alternative__item-content {
+		width: 67upx;
+		height: 67upx;
+		// background: rgba(255, 0, 0, 0.5);
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.t-alternative__item:active {
+		transition: all 0.3s;
+		transform: scale(1.1);
+	}
+</style>
diff --git a/components/toolbar/toolbar.vue b/components/toolbar/toolbar.vue
new file mode 100644
index 0000000..d0e2f38
--- /dev/null
+++ b/components/toolbar/toolbar.vue
@@ -0,0 +1,727 @@
+<template>
+	<view class="toolbar" :class="{'toolbar-black': theme === 'dark'}">
+		<view class="tool-section">
+			<view class="tool-item" v-for="(item, index) in toolArr" :key="index">
+				<block v-if="item.url === 'share'">
+					<button open-type="share" class="tool-btn">
+						<image class="icon" :src="item.select?item.selectIcon:item.icon" mode="aspectFit"></image>
+						<text class="title" :class="{'title-select': item.select}">{{item.title}}</text>
+					</button>
+				</block>
+				<block v-else>
+					<button @click="toolItemAction(index)" class="tool-btn">
+						<image class="icon" :src="item.select?item.selectIcon:item.icon" mode="aspectFit"></image>
+						<text class="title" :class="{'title-select': item.select}">{{item.title}}</text>
+					</button>
+				</block>
+			</view>
+		</view>
+		<view>
+			<!-- 颜色 -->
+			<scroll-view style="box-sizing: border-box; white-space: nowrap; margin: 10upx 0;" scroll-x scroll-with-animation >
+				<view style="text-align: center; display: inline-block;" class="t-alternative__item" v-for="(item,index) in colorList" :key="index">
+					<view style="width: 67upx;height: 67upx; display: flex; align-items: center; justify-content: center;" 
+					:style="{ backgroundColor: item.color}"
+					 @click="selectColor(item,index)">
+						<image v-if="index == selectColorIndex" src="../../static/mine/icon_confirm.png" mode="" 
+						style="width: 31upx; height: 22upx;"></image>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+		<view class="pen-section">
+			<view style="display: flex; align-items: center; justify-content: center;">
+				<!-- <view class="pen" :style="{backgroundColor: penColor, height: lineWidth}"></view>
+				<view class="triangle-right" 
+				:style="{'border-top': (lineValue / 2) + 'px solid transparent',
+				'border-left': lineValue + 'px solid' + penColor,
+				'border-bottom': (lineValue / 2) + 'px solid transparent',}"></view> -->
+				<view style="font-size: 25upx; margin-right: 16upx; color: #FFFFFF;">画笔大小</view>
+			</view>
+			<slider min="1" max="20" :value="lineValue" block-size="25" activeColor="#FFFFFF" class="pen-slider" @change="penWidthChange"/>
+			<!-- <view class="pen-txt">{{lineWidth}}</view> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			theme: {
+				type: String,
+				default () {
+					return 'light';
+				}
+			},
+			toolArr: {
+				type: Array,
+				default () {
+					return [
+						{
+							title: '清空',
+							icon: '../../static/png/tool_clear.png',
+							selectIcon: '../../static/png/tool_clear_s.png',
+							select: false,
+							url: 'clear'
+						}, {
+							title: '橡皮',
+							icon: '../../static/png/tool_eraser.png',
+							selectIcon: '../../static/png/tool_eraser_s.png',
+							select: false,
+							url: 'eraser'
+						}, {
+							title: '画笔',
+							icon: '../../static/png/tool_pen.png',
+							selectIcon: '../../static/png/tool_pen_s.png',
+							select: true,
+							url: 'pen'
+						}, {
+							title: '颜色',
+							icon: '../../static/png/tool_color.png',
+							selectIcon: '../../static/png/tool_color_s.png',
+							select: false,
+							url: 'color'
+						}, {
+							title: '保存',
+							icon: '../../static/png/tool_download.png',
+							selectIcon: '../../static/png/tool_download_s.png',
+							select: false,
+							url: 'save'
+						}, {
+							title: '矩形',
+							icon: '../../static/png/tool_rect.png',
+							selectIcon: '../../static/png/tool_rect_s.png',
+							select: false,
+							url: 'hollowRect'
+						}, {
+							title: '圆形',
+							icon: '../../static/png/tool_circle.png',
+							selectIcon: '../../static/png/tool_circle_s.png',
+							select: false,
+							url: 'hollowCircle'
+						}, {
+							title: '矩形',
+							icon: '../../static/png/tool_rect_solid.png',
+							selectIcon: '../../static/png/tool_rect_solid_s.png',
+							select: false,
+							url: 'rect'
+						}, {
+							title: '圆形',
+							icon: '../../static/png/tool_circle_solid.png',
+							selectIcon: '../../static/png/tool_circle_solid_s.png',
+							select: false,
+							url: 'circle'
+						}, {
+							title: '分享',
+							icon: '../../static/png/tool_share.png',
+							selectIcon: '../../static/png/tool_share_s.png',
+							select: false,
+							url: 'share'
+						}
+					]
+				}
+			},
+			penColor: {
+				type: String,
+				default () {
+					return '#000';
+				}
+			}
+		},
+		data() {
+			return {
+				lineWidth: '6px',
+				lineValue: 6,
+				colorList:[
+					{
+						color: '#000',
+						index: '01'
+					},{
+						color: '#7f2a3f',
+						index: '01'
+					}, {
+						color: '#e24187',
+						index: '03'
+					}, {
+						color: '#f5305d',
+						index: '04'
+					}, {
+						color: '#de4156',
+						index: '05'
+					}, {
+						color: '#fe42cd',
+						index: '06'
+					}, {
+						color: '#f48b9a',
+						index: '07'
+					}, {
+						color: '#ec8191',
+						index: '08'
+					}, {
+						color: '#f9aeb5',
+						index: '09'
+					}, {
+						color: '#f21d5f',
+						index: '10'
+					}, {
+						color: '#cc3739',
+						index: '11'
+					}, {
+						color: '#dd5047',
+						index: '12'
+					}, {
+						color: '#e24187',
+						index: '13'
+					}, {
+						color: '#fa6449',
+						index: '14'
+					}, {
+						color: '#e8495b',
+						index: '15'
+					}, {
+						color: '#fb7162',
+						index: '16'
+					}, {
+						color: '#f6afd1',
+						index: '17'
+					}, {
+						color: '#fbb6b9',
+						index: '18'
+					}, {
+						color: '#db6f27',
+						index: '21'
+					}, {
+						color: '#ed702e',
+						index: '22'
+					}, {
+						color: '#f99627',
+						index: '23'
+					}, {
+						color: '#eb8926',
+						index: '24'
+					}, {
+						color: '#edc3aa',
+						index: '25'
+					}, {
+						color: '#e1d8cf',
+						index: '26'
+					}, {
+						color: '#deebc5',
+						index: '27'
+					}, {
+						color: '#fccdc7',
+						index: '28'
+					}, {
+						color: '#dbbdd2',
+						index: '29'
+					}, {
+						color: '#e8a321',
+						index: '31'
+					}, {
+						color: '#db6f27',
+						index: '32'
+					}, {
+						color: '#edb74b',
+						index: '33'
+					}, {
+						color: '#e8b741',
+						index: '34'
+					}, {
+						color: '#fef052',
+						index: '35'
+					}, {
+						color: '#ffd684',
+						index: '36'
+					}, {
+						color: '#e2d958',
+						index: '37'
+					}, {
+						color: '#e2e5d0',
+						index: '38'
+					}, {
+						color: '#ba9431',
+						index: '41'
+					}, {
+						color: '#797f5d',
+						index: '42'
+					}, {
+						color: '#536d50',
+						index: '43'
+					}, {
+						color: '#d8b53f',
+						index: '44'
+					}, {
+						color: '#d4c172',
+						index: '45'
+					}, {
+						color: '#32b75c',
+						index: '46'
+					}, {
+						color: '#90D15B',
+						index: '47'
+					}, {
+						color: '#c5d52a',
+						index: '48'
+					}, {
+						color: '#e8e098',
+						index: '49'
+					}, {
+						color: '#1b6661',
+						index: '50'
+					}, {
+						color: '#3b4f4d',
+						index: '51'
+					}, {
+						color: '#336559',
+						index: '52'
+					}, {
+						color: '#01776e',
+						index: '53'
+					}, {
+						color: '#2e7662',
+						index: '54'
+					}, {
+						color: '#439877',
+						index: '55'
+					}, {
+						color: '#0ba066',
+						index: '56'
+					}, {
+						color: '#318488',
+						index: '57'
+					}, {
+						color: '#6fd3c9',
+						index: '58'
+					}, {
+						color: '#b9d3ac',
+						index: '59'
+					}, {
+						color: '#0e898e',
+						index: '61'
+					}, {
+						color: '#317194',
+						index: '62'
+					}, {
+						color: '#029bc7',
+						index: '63'
+					}, {
+						color: '#2a8ec9',
+						index: '64'
+					}, {
+						color: '#57c9d3',
+						index: '65'
+					}, {
+						color: '#65b3df',
+						index: '67'
+					}, {
+						color: '#8bd0d7',
+						index: '68'
+					}, {
+						color: '#4B4881',
+						index: '69'
+					}, {
+						color: '#77A1CB',
+						index: '70'
+					}, {
+						color: '#3051BB',
+						index: '71'
+					}, {
+						color: '#2E41A7',
+						index: '72'
+					}, {
+						color: '#704CAE',
+						index: '73'
+					}, {
+						color: '#385BD1',
+						index: '74'
+					}, {
+						color: '#E0DFED',
+						index: '75'
+					}, {
+						color: '#A6BDE9',
+						index: '76'
+					}, {
+						color: '#B3B9DD',
+						index: '77'
+					}, {
+						color: '#7942A8',
+						index: '81'
+					}, {
+						color: '#8F52BA',
+						index: '82'
+					}, {
+						color: '#9680C0',
+						index: '83'
+					}, {
+						color: '#CD82BB',
+						index: '84'
+					}, {
+						color: '#8E2A80',
+						index: '85'
+					}, {
+						color: '#E24CB0',
+						index: '86'
+					}, {
+						color: '#CC2A75',
+						index: '87'
+					}, {
+						color: '#ED89D2',
+						index: '88'
+					}, {
+						color: '#F562B6',
+						index: '89'
+					}, {
+						color: '#8B3B32',
+						index: '91'
+					}, {
+						color: '#593A35',
+						index: '92'
+					}, {
+						color: '#7A3C2D',
+						index: '93'
+					}, {
+						color: '#7D2E21',
+						index: '94'
+					}, {
+						color: '#935A47',
+						index: '95'
+					}, {
+						color: '#A05047',
+						index: '96'
+					}, {
+						color: '#E39476',
+						index: '97'
+					}, {
+						color: '#4E3F3C',
+						index: '98'
+					}, {
+						color: '#5A4939',
+						index: '99'
+					}, {
+						color: '#EDE8EC',
+						index: '100'
+					}, {
+						color: '#C0813A',
+						index: '101'
+					}, {
+						color: '#77432E',
+						index: '102'
+					}, {
+						color: '#C17748',
+						index: '103'
+					}, {
+						color: '#C7AC39',
+						index: '104'
+					}, {
+						color: '#DBA179',
+						index: '107'
+					}, {
+						color: '#D8D3D0',
+						index: '109'
+					}, {
+						color: '#091A22',
+						index: '120'
+					}, {
+						color: '#CA3A32',
+						index: '121'
+					}, {
+						color: '#FAAB60',
+						index: '122'
+					}, {
+						color: '#CADEAD',
+						index: '123'
+					}, {
+						color: '#C7D858',
+						index: '124'
+					}, {
+						color: '#F264D0',
+						index: '125'
+					}, {
+						color: '#F77ADC',
+						index: '126'
+					}, {
+						color: '#FAE7D9',
+						index: '131'
+					}, {
+						color: '#E6D9D1',
+						index: '132'
+					}, {
+						color: '#EBCDB1',
+						index: '133'
+					}, {
+						color: '#E2DCCC',
+						index: '134'
+					}, {
+						color: '#FAD9D2',
+						index: '135'
+					}, {
+						color: '#E1C2BD',
+						index: '136'
+					}, {
+						color: '#E5BBCF',
+						index: '137'
+					}, {
+						color: '#F7BACC',
+						index: '138'
+					}, {
+						color: '#E9CBC1',
+						index: '139'
+					}, {
+						color: '#EBB89F',
+						index: '140'
+					}, {
+						color: '#E6D09E',
+						index: '141'
+					}, {
+						color: '#E2B78D',
+						index: '142'
+					}, {
+						color: '#D1E4EB',
+						index: '143'
+					}, {
+						color: '#B9D9EE',
+						index: '144'
+					}, {
+						color: '#CFD0E2',
+						index: '145'
+					}, {
+						color: '#CECFF0',
+						index: '146'
+					}, {
+						color: '#D6C3E3',
+						index: '147'
+					}, {
+						color: '#E3F0C5',
+						index: '163'
+					}, {
+						color: '#DAD792',
+						index: '164'
+					}, {
+						color: '#D4D4BC',
+						index: '166'
+					}, {
+						color: '#C0D0AB',
+						index: '167'
+					}, {
+						color: '#D7C6A8',
+						index: '169'
+					}, {
+						color: '#D9E9E8',
+						index: '171'
+					}, {
+						color: '#B4E0C7',
+						index: '172'
+					}, {
+						color: '#D6E2BA',
+						index: '173'
+					}, {
+						color: '#E3E5D0',
+						index: '174'
+					}, {
+						color: '#C1D39A',
+						index: '175'
+					}, {
+						color: '#AFE4E6',
+						index: '178'
+					}, {
+						color: '#92DDE2',
+						index: '179'
+					}, {
+						color: '#DBE0E6',
+						index: '182'
+					}, {
+						color: '#8FBFF0',
+						index: '183'
+					}, {
+						color: '#9DCDE1',
+						index: '185'
+					}, {
+						color: '#BBC4BF',
+						index: '196'
+					}, {
+						color: '#E484A9',
+						index: '198'
+					}, {
+						color: '#BBC4BF',
+						index: 'GG3'
+					}, {
+						color: '#494A4C',
+						index: 'CG9'
+					}, {
+						color: '#C2CEDA',
+						index: 'BG1'
+					}, {
+						color: '#C1C3D3',
+						index: 'BG3'
+					}, {
+						color: '#8696A3',
+						index: 'BG5'
+					}, {
+						color: '#646A76',
+						index: 'BG7'
+					}, {
+						color: '#415361',
+						index: 'BG9'
+					}, {
+						color: '#DFDEE3',
+						index: 'WG.5'
+					}, {
+						color: '#CBC6CC',
+						index: 'WG1'
+					}, {
+						color: '#B6B0B2',
+						index: 'WG2'
+					}, {
+						color: '#C5BBBA',
+						index: 'WG3'
+					}, {
+						color: '#958A92',
+						index: 'WG4'
+					}, {
+						color: '#837477',
+						index: 'WG5'
+					}, {
+						color: '#8A7E7E',
+						index: 'WG6'
+					}, {
+						color: '#4D4342',
+						index: 'WG9'
+					}
+				],
+				selectColorIndex:0
+			}
+		},
+		methods: {
+			// 常用颜色选择
+			selectColor(color,index) {
+				this.selectColorIndex = index
+				this.$emit('colorPickTap', color);
+			},
+			toolItemAction (index) {
+				this.$emit('toolItemTap', index);
+			},
+			penWidthChange (e) {
+				// console.log('滑块滚动:' + JSON.stringify(e));
+				this.lineWidth = e.detail.value + 'px';
+				this.lineValue = e.detail.value;
+				this.$emit('penWidthChange', this.lineValue);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.toolbar {
+		background-color: #282932;
+		height: 264upx;
+		padding-bottom: 70upx;
+		
+		.tool-section {
+			display: flex;
+			flex-wrap: wrap;
+			height: 75upx;
+			justify-content: space-between;
+			
+			.tool-item {
+				width: 20%;
+				height: 100%;
+				
+				.tool-btn {
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					height: 100%;
+					width: 100%;
+					
+					.icon {
+						width: 26upx;
+						height: 27upx;
+					}
+					
+					.title {
+						font-size: 25upx;
+						margin-left: 8upx;
+						color: #FFFFFF;
+					}
+					
+					.title-select {
+						color: #F56364;
+					}
+				}
+			}
+		}
+		.pen-section {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			padding: 0 30upx;
+			height: 75upx;
+			width: calc(100% - 60upx);
+			overflow-x: hidden;
+			
+			// .pen {
+			// 	width: 80upx;
+			// 	border-radius: 5upx 0 0 5upx;
+			// }
+			// .triangle-right {
+			//     width: 0;
+			//     height: 0;
+			//     border-top: 50px solid transparent;
+			//     border-left: 100px solid red;
+			//     border-bottom: 50px solid transparent;
+			// }
+			.pen-slider {
+				width: 75%;
+				margin: auto;
+			}
+			// .pen-txt {
+			// 	font-size: 28upx;
+			// }
+		}
+	}
+	
+	.toolbar-black {
+		background-color: #202d1c;
+	}
+	
+	.t-alternative__item {
+		// margin-left: 12upx;
+		width: 67upx;
+		height: 67upx;
+		// border-radius: 50%;
+		overflow: hidden;
+	}
+	
+	.t-alternative__item-content {
+		width: 67upx;
+		height: 67upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	
+	.t-alternative__item:active {
+		transition: all 0.3s;
+		transform: scale(1.1);
+	}
+	wx-slider .wx-slider-handle-wrapper{
+		height:20rpx;
+	}
+	button {
+		padding: 0upx;
+		margin: 0upx;
+		border: none;
+		border-radius: 0upx;
+		box-sizing: border-box;
+		background-color: transparent;
+	}
+	
+	button.button-hover {
+		transform: translate(3rpx, 3rpx);
+		background-color: transparent;
+	}
+	
+	button::after {
+	  border: none
+	}
+</style>
diff --git a/components/uParse/src/components/wxParseAudio.vue b/components/uParse/src/components/wxParseAudio.vue
new file mode 100644
index 0000000..86df246
--- /dev/null
+++ b/components/uParse/src/components/wxParseAudio.vue
@@ -0,0 +1,27 @@
+<template>
+  <!--增加audio标签支持-->
+  <audio
+    :id="node.attr.id"
+    :class="node.classStr"
+    :style="node.styleStr"
+    :src="node.attr.src"
+    :loop="node.attr.loop"
+    :poster="node.attr.poster"
+    :name="node.attr.name"
+    :author="node.attr.author"
+    controls></audio>
+</template>
+
+<script>
+export default {
+  name: 'wxParseAudio',
+  props: {
+    node: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+};
+</script>
diff --git a/components/uParse/src/components/wxParseImg.vue b/components/uParse/src/components/wxParseImg.vue
new file mode 100644
index 0000000..0bd54ae
--- /dev/null
+++ b/components/uParse/src/components/wxParseImg.vue
@@ -0,0 +1,91 @@
+<template>
+	<image :mode="node.attr.mode" :lazy-load="node.attr.lazyLoad" :class="node.classStr || ''" :style="newStyleStr || node.styleStr || ''"
+	 :data-src="node.attr.src" :src="node.attr.src" @tap="wxParseImgTap" @load="wxParseImgLoad" 
+	 style="display:block;vertical-align:top;vertical-align:bottom;font-size:0;"/>
+</template>
+
+<script>
+	export default {
+		name: 'wxParseImg',
+		data() {
+			return {
+				newStyleStr: '',
+				preview: true,
+			};
+		},
+		props: {
+			node: {
+				type: Object,
+				default () {
+					return {};
+				},
+			},
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseImgTap(e) {
+				if (!this.preview) return;
+				const {
+					src
+				} = e.currentTarget.dataset;
+				if (!src) return;
+				this.uparse.preview(src, e);
+			},
+			// 图片视觉宽高计算函数区
+			wxParseImgLoad(e) {
+				const {
+					src
+				} = e.currentTarget.dataset;
+				if (!src) return;
+				const {
+					width,
+					height
+				} = e.mp.detail;
+				const recal = this.wxAutoImageCal(width, height);
+				const {
+					imageheight,
+					imageWidth
+				} = recal;
+				const {
+					padding,
+					mode
+				} = this.node.attr;
+				const {
+					styleStr
+				} = this.node;
+				const imageHeightStyle = mode === 'widthFix' ? '' : `height: ${imageheight}px;`;
+				this.newStyleStr = `${styleStr || ''}; ${imageHeightStyle || ''}; width:` + (!imageWidth || imageWidth === '100%' ? '100%;' : `${imageWidth}px;`) +`padding: 0 ${+padding}px;`;
+			},
+			// 计算视觉优先的图片宽高
+			wxAutoImageCal(originalWidth, originalHeight) {
+				// 获取图片的原始长宽
+				const {
+					padding
+				} = this.node.attr;
+				const windowWidth = this.node.$screen.width - (2 * padding);
+				const results = {};
+
+				if (originalWidth < 60 || originalHeight < 60) {
+					const {
+						src
+					} = this.node.attr;
+					this.uparse.removeImageUrl(src);
+					this.preview = false;
+				}
+
+				// 判断按照那种方式进行缩放
+				if (originalWidth > windowWidth) {
+					// 在图片width大于手机屏幕width时候
+					results.imageWidth = '100%';
+					results.imageheight = (windowWidth * (originalHeight / originalWidth));
+				} else {
+					// 否则展示原来的数据
+					results.imageWidth = originalWidth;
+					results.imageheight = originalHeight;
+				}
+
+				return results;
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate0.vue b/components/uParse/src/components/wxParseTemplate0.vue
new file mode 100644
index 0000000..5e34c1f
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate0.vue
@@ -0,0 +1,105 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--table类型-->
+			<block v-else-if="node.tag == 'table'">
+				<view :class="node.classStr" class="table" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate1';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate0',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;// TODO currentTarget才有dataset
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate1.vue b/components/uParse/src/components/wxParseTemplate1.vue
new file mode 100644
index 0000000..8a1e10a
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate1.vue
@@ -0,0 +1,96 @@
+<template>
+	<view :class="(node.tag == 'li' ? node.classStr : (node.node==='text'?'text':''))">
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<!-- <view :class="node.classStr" :style="node.styleStr"> -->
+				<view :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<!-- <text>\n</text> -->
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate2';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate1',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			},
+		},
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate10.vue b/components/uParse/src/components/wxParseTemplate10.vue
new file mode 100644
index 0000000..40f0d54
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate10.vue
@@ -0,0 +1,94 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate11';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate10',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate11.vue b/components/uParse/src/components/wxParseTemplate11.vue
new file mode 100644
index 0000000..81caa7f
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate11.vue
@@ -0,0 +1,84 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<!--button类型-->
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					{{node.text}}
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					{{node.text}}
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					{{node.text}}
+				</view>
+			</block>
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate11',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate2.vue b/components/uParse/src/components/wxParseTemplate2.vue
new file mode 100644
index 0000000..a48f1be
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate2.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate3';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate2',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate3.vue b/components/uParse/src/components/wxParseTemplate3.vue
new file mode 100644
index 0000000..90fc9bd
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate3.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate4';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate3',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate4.vue b/components/uParse/src/components/wxParseTemplate4.vue
new file mode 100644
index 0000000..af20eef
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate4.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate5';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate4',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate5.vue b/components/uParse/src/components/wxParseTemplate5.vue
new file mode 100644
index 0000000..0962239
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate5.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate6';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate5',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate6.vue b/components/uParse/src/components/wxParseTemplate6.vue
new file mode 100644
index 0000000..c322ab0
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate6.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate7';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate6',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate7.vue b/components/uParse/src/components/wxParseTemplate7.vue
new file mode 100644
index 0000000..591bcd6
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate7.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate8';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate7',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate8.vue b/components/uParse/src/components/wxParseTemplate8.vue
new file mode 100644
index 0000000..0ec0b3f
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate8.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate9';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate8',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseTemplate9.vue b/components/uParse/src/components/wxParseTemplate9.vue
new file mode 100644
index 0000000..ec799ac
--- /dev/null
+++ b/components/uParse/src/components/wxParseTemplate9.vue
@@ -0,0 +1,95 @@
+<template>
+	<view>
+		<!--判断是否是标签节点-->
+		<block v-if="node.node == 'element'">
+			<block v-if="node.tag == 'button'">
+				<button type="default" size="mini">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</button>
+			</block>
+
+			<!--li类型-->
+			<block v-else-if="node.tag == 'li'">
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--video类型-->
+			<block v-else-if="node.tag == 'video'">
+				<wx-parse-video :node="node" />
+			</block>
+
+			<!--audio类型-->
+			<block v-else-if="node.tag == 'audio'">
+				<wx-parse-audio :node="node" />
+			</block>
+
+			<!--img类型-->
+			<block v-else-if="node.tag == 'img'">
+				<wx-parse-img :node="node" />
+			</block>
+
+			<!--a类型-->
+			<block v-else-if="node.tag == 'a'">
+				<view @click="wxParseATap" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+			<!--br类型-->
+			<block v-else-if="node.tag == 'br'">
+				<text>\n</text>
+			</block>
+
+			<!--其他标签-->
+			<block v-else>
+				<view :class="node.classStr" :style="node.styleStr">
+					<block v-for="(node, index) of node.nodes" :key="index">
+						<wx-parse-template :node="node" />
+					</block>
+				</view>
+			</block>
+
+		</block>
+
+		<!--判断是否是文本节点-->
+		<block v-else-if="node.node == 'text'">{{node.text}}</block>
+	</view>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate10';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+
+	export default {
+		name: 'wxParseTemplate9',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+		},
+		inject: ['uparse'],
+		methods: {
+			wxParseATap(e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				this.uparse.navigate(href, e);
+			}
+		}
+	};
+</script>
diff --git a/components/uParse/src/components/wxParseVideo.vue b/components/uParse/src/components/wxParseVideo.vue
new file mode 100644
index 0000000..a952f58
--- /dev/null
+++ b/components/uParse/src/components/wxParseVideo.vue
@@ -0,0 +1,15 @@
+<template>
+  <!--增加video标签支持,并循环添加-->
+  <view :class="node.classStr" :style="node.styleStr">
+    <video :class="node.classStr" class="video-video" :src="node.attr.src"></video>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'wxParseVideo',
+  props: {
+    node: {},
+  },
+};
+</script>
diff --git a/components/uParse/src/libs/html2json.js b/components/uParse/src/libs/html2json.js
new file mode 100644
index 0000000..de1bdd4
--- /dev/null
+++ b/components/uParse/src/libs/html2json.js
@@ -0,0 +1,274 @@
+/**
+ * html2Json 改造来自: https://github.com/Jxck/html2json
+ *
+ *
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *               垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+import wxDiscode from './wxDiscode';
+import HTMLParser from './htmlparser';
+
+function makeMap(str) {
+	const obj = {};
+	const items = str.split(',');
+	for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+	return obj;
+}
+
+// Block Elements - HTML 5
+const block = makeMap(
+	'br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'
+);
+
+// Inline Elements - HTML 5
+const inline = makeMap(
+	'a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'
+);
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+function removeDOCTYPE(html) {
+	const isDocument = /<body.*>([^]*)<\/body>/.test(html);
+	return isDocument ? RegExp.$1 : html;
+}
+
+function trimHtml(html) {
+	return html
+		.replace(/<!--.*?-->/gi, '')
+		.replace(/\/\*.*?\*\//gi, '')
+		.replace(/[ ]+</gi, '<')
+		.replace(/<script[^]*<\/script>/gi, '')
+		.replace(/<style[^]*<\/style>/gi, '');
+}
+
+function getScreenInfo() {
+	const screen = {};
+	wx.getSystemInfo({
+		success: (res) => {
+			screen.width = res.windowWidth;
+			screen.height = res.windowHeight;
+		},
+	});
+	return screen;
+}
+
+function html2json(html, customHandler, imageProp, host) {
+	// 处理字符串
+	html = removeDOCTYPE(html);
+	html = trimHtml(html);
+	html = wxDiscode.strDiscode(html);
+	// 生成node节点
+	const bufArray = [];
+	const results = {
+		nodes: [],
+		imageUrls: [],
+	};
+
+	const screen = getScreenInfo();
+
+	function Node(tag) {
+		this.node = 'element';
+		this.tag = tag;
+
+		this.$screen = screen;
+	}
+
+	HTMLParser(html, {
+		start(tag, attrs, unary) {
+			// node for this element
+			const node = new Node(tag);
+
+			if (bufArray.length !== 0) {
+				const parent = bufArray[0];
+				if (parent.nodes === undefined) {
+					parent.nodes = [];
+				}
+			}
+
+			if (block[tag]) {
+				node.tagType = 'block';
+			} else if (inline[tag]) {
+				node.tagType = 'inline';
+			} else if (closeSelf[tag]) {
+				node.tagType = 'closeSelf';
+			}
+
+			node.attr = attrs.reduce((pre, attr) => {
+				const {
+					name
+				} = attr;
+				let {
+					value
+				} = attr;
+				if (name === 'class') {
+					node.classStr = value;
+				}
+				// has multi attibutes
+				// make it array of attribute
+				if (name === 'style') {
+					node.styleStr = value;
+				}
+				if (name === 'align') {
+					node.styleStr = node.styleStr || '';
+					node.styleStr = node.styleStr += 'text-align:' + value + ';';
+				}
+				if (value.match(/ /)) {
+					value = value.split(' ');
+				}
+
+				// if attr already exists
+				// merge it
+				if (pre[name]) {
+					if (Array.isArray(pre[name])) {
+						// already array, push to last
+						pre[name].push(value);
+					} else {
+						// single value, make it array
+						pre[name] = [pre[name], value];
+					}
+				} else {
+					// not exist, put it
+					pre[name] = value;
+				}
+
+				return pre;
+			}, {});
+
+			// 优化样式相关属性
+			if (node.classStr) {
+				node.classStr += ` ${node.tag}`;
+			} else {
+				node.classStr = node.tag;
+			}
+			if (node.tagType === 'inline') {
+				node.classStr += ' inline';
+			}
+
+			// 对img添加额外数据
+			if (node.tag === 'img') {
+				let imgUrl = node.attr.src;
+				imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);
+				Object.assign(node.attr, imageProp, {
+					src: imgUrl || '',
+				});
+				if (imgUrl) {
+					results.imageUrls.push(imgUrl);
+				}
+			}
+
+			// 处理a标签属性
+			if (node.tag === 'a') {
+				node.attr.href = node.attr.href || '';
+			}
+
+			// 处理font标签样式属性
+			if (node.tag === 'font') {
+				const fontSize = [
+					'x-small',
+					'small',
+					'medium',
+					'large',
+					'x-large',
+					'xx-large',
+					'-webkit-xxx-large',
+				];
+				const styleAttrs = {
+					color: 'color',
+					face: 'font-family',
+					size: 'font-size',
+				};
+				if (!node.styleStr) node.styleStr = '';
+				Object.keys(styleAttrs).forEach((key) => {
+					if (node.attr[key]) {
+						const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
+						node.styleStr += `${styleAttrs[key]}: ${value};`;
+					}
+				});
+			}
+
+			// 临时记录source资源
+			if (node.tag === 'source') {
+				results.source = node.attr.src;
+			}
+
+			if (customHandler.start) {
+				customHandler.start(node, results);
+			}
+
+			if (unary) {
+				// if this tag doesn't have end tag
+				// like <img src="hoge.png"/>
+				// add to parents
+				const parent = bufArray[0] || results;
+				if (parent.nodes === undefined) {
+					parent.nodes = [];
+				}
+				parent.nodes.push(node);
+			} else {
+				bufArray.unshift(node);
+			}
+		},
+		end(tag) {
+			// merge into parent tag
+			const node = bufArray.shift();
+			if (node.tag !== tag) {
+				console.error('invalid state: mismatch end tag');
+			}
+
+			// 当有缓存source资源时于于video补上src资源
+			if (node.tag === 'video' && results.source) {
+				node.attr.src = results.source;
+				delete results.source;
+			}
+
+			if (customHandler.end) {
+				customHandler.end(node, results);
+			}
+
+			if (bufArray.length === 0) {
+				results.nodes.push(node);
+			} else {
+				const parent = bufArray[0];
+				if (!parent.nodes) {
+					parent.nodes = [];
+				}
+				parent.nodes.push(node);
+			}
+		},
+		chars(text) {
+			if (!text.trim()) return;
+
+			const node = {
+				node: 'text',
+				text,
+			};
+
+			if (customHandler.chars) {
+				customHandler.chars(node, results);
+			}
+
+			if (bufArray.length === 0) {
+				results.nodes.push(node);
+			} else {
+				const parent = bufArray[0];
+				if (parent.nodes === undefined) {
+					parent.nodes = [];
+				}
+				parent.nodes.push(node);
+			}
+		},
+	});
+
+	return results;
+}
+
+export default html2json;
diff --git a/components/uParse/src/libs/htmlparser.js b/components/uParse/src/libs/htmlparser.js
new file mode 100644
index 0000000..2939da3
--- /dev/null
+++ b/components/uParse/src/libs/htmlparser.js
@@ -0,0 +1,156 @@
+/**
+ *
+ * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
+ *
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *               垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+// Regular Expressions for parsing tags and attributes
+
+const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
+
+function makeMap(str) {
+  const obj = {};
+  const items = str.split(',');
+  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+  return obj;
+}
+
+// Empty Elements - HTML 5
+const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
+
+// Block Elements - HTML 5
+const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+// Inline Elements - HTML 5
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+// Attributes that have their values filled in disabled="disabled"
+const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
+
+function HTMLParser(html, handler) {
+  let index;
+  let chars;
+  let match;
+  let last = html;
+  const stack = [];
+
+  stack.last = () => stack[stack.length - 1];
+
+  function parseEndTag(tag, tagName) {
+    // If no tag name is provided, clean shop
+    let pos;
+    if (!tagName) {
+      pos = 0;
+    } else {
+      // Find the closest opened tag of the same type
+      tagName = tagName.toLowerCase();
+      for (pos = stack.length - 1; pos >= 0; pos -= 1) {
+        if (stack[pos] === tagName) break;
+      }
+    }
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (let i = stack.length - 1; i >= pos; i -= 1) {
+        if (handler.end) handler.end(stack[i]);
+      }
+
+      // Remove the open elements from the stack
+      stack.length = pos;
+    }
+  }
+
+  function parseStartTag(tag, tagName, rest, unary) {
+    tagName = tagName.toLowerCase();
+
+    if (block[tagName]) {
+      while (stack.last() && inline[stack.last()]) {
+        parseEndTag('', stack.last());
+      }
+    }
+
+    if (closeSelf[tagName] && stack.last() === tagName) {
+      parseEndTag('', tagName);
+    }
+
+    unary = empty[tagName] || !!unary;
+
+    if (!unary) stack.push(tagName);
+
+    if (handler.start) {
+      const attrs = [];
+
+      rest.replace(attr, function genAttr(matches, name) {
+        const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
+
+        attrs.push({
+          name,
+          value,
+          escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // "
+        });
+      });
+
+      if (handler.start) {
+        handler.start(tagName, attrs, unary);
+      }
+    }
+  }
+
+  while (html) {
+    chars = true;
+
+    if (html.indexOf('</') === 0) {
+      match = html.match(endTag);
+
+      if (match) {
+        html = html.substring(match[0].length);
+        match[0].replace(endTag, parseEndTag);
+        chars = false;
+      }
+
+      // start tag
+    } else if (html.indexOf('<') === 0) {
+      match = html.match(startTag);
+
+      if (match) {
+        html = html.substring(match[0].length);
+        match[0].replace(startTag, parseStartTag);
+        chars = false;
+      }
+    }
+
+    if (chars) {
+      index = html.indexOf('<');
+      let text = '';
+      while (index === 0) {
+        text += '<';
+        html = html.substring(1);
+        index = html.indexOf('<');
+      }
+      text += index < 0 ? html : html.substring(0, index);
+      html = index < 0 ? '' : html.substring(index);
+
+      if (handler.chars) handler.chars(text);
+    }
+
+    if (html === last) throw new Error(`Parse Error: ${html}`);
+    last = html;
+  }
+
+  // Clean up any remaining tags
+  parseEndTag();
+}
+
+export default HTMLParser;
diff --git a/components/uParse/src/libs/wxDiscode.js b/components/uParse/src/libs/wxDiscode.js
new file mode 100644
index 0000000..a7a36a6
--- /dev/null
+++ b/components/uParse/src/libs/wxDiscode.js
@@ -0,0 +1,195 @@
+// HTML 支持的数学符号
+function strNumDiscode(str) {
+  str = str.replace(/&forall;/g, '∀');
+  str = str.replace(/&part;/g, '∂');
+  str = str.replace(/&exist;/g, '∃');
+  str = str.replace(/&empty;/g, '∅');
+  str = str.replace(/&nabla;/g, '∇');
+  str = str.replace(/&isin;/g, '∈');
+  str = str.replace(/&notin;/g, '∉');
+  str = str.replace(/&ni;/g, '∋');
+  str = str.replace(/&prod;/g, '∏');
+  str = str.replace(/&sum;/g, '∑');
+  str = str.replace(/&minus;/g, '−');
+  str = str.replace(/&lowast;/g, '∗');
+  str = str.replace(/&radic;/g, '√');
+  str = str.replace(/&prop;/g, '∝');
+  str = str.replace(/&infin;/g, '∞');
+  str = str.replace(/&ang;/g, '∠');
+  str = str.replace(/&and;/g, '∧');
+  str = str.replace(/&or;/g, '∨');
+  str = str.replace(/&cap;/g, '∩');
+  str = str.replace(/&cup;/g, '∪');
+  str = str.replace(/&int;/g, '∫');
+  str = str.replace(/&there4;/g, '∴');
+  str = str.replace(/&sim;/g, '∼');
+  str = str.replace(/&cong;/g, '≅');
+  str = str.replace(/&asymp;/g, '≈');
+  str = str.replace(/&ne;/g, '≠');
+  str = str.replace(/&le;/g, '≤');
+  str = str.replace(/&ge;/g, '≥');
+  str = str.replace(/&sub;/g, '⊂');
+  str = str.replace(/&sup;/g, '⊃');
+  str = str.replace(/&nsub;/g, '⊄');
+  str = str.replace(/&sube;/g, '⊆');
+  str = str.replace(/&supe;/g, '⊇');
+  str = str.replace(/&oplus;/g, '⊕');
+  str = str.replace(/&otimes;/g, '⊗');
+  str = str.replace(/&perp;/g, '⊥');
+  str = str.replace(/&sdot;/g, '⋅');
+  return str;
+}
+
+// HTML 支持的希腊字母
+function strGreeceDiscode(str) {
+  str = str.replace(/&Alpha;/g, 'Α');
+  str = str.replace(/&Beta;/g, 'Β');
+  str = str.replace(/&Gamma;/g, 'Γ');
+  str = str.replace(/&Delta;/g, 'Δ');
+  str = str.replace(/&Epsilon;/g, 'Ε');
+  str = str.replace(/&Zeta;/g, 'Ζ');
+  str = str.replace(/&Eta;/g, 'Η');
+  str = str.replace(/&Theta;/g, 'Θ');
+  str = str.replace(/&Iota;/g, 'Ι');
+  str = str.replace(/&Kappa;/g, 'Κ');
+  str = str.replace(/&Lambda;/g, 'Λ');
+  str = str.replace(/&Mu;/g, 'Μ');
+  str = str.replace(/&Nu;/g, 'Ν');
+  str = str.replace(/&Xi;/g, 'Ν');
+  str = str.replace(/&Omicron;/g, 'Ο');
+  str = str.replace(/&Pi;/g, 'Π');
+  str = str.replace(/&Rho;/g, 'Ρ');
+  str = str.replace(/&Sigma;/g, 'Σ');
+  str = str.replace(/&Tau;/g, 'Τ');
+  str = str.replace(/&Upsilon;/g, 'Υ');
+  str = str.replace(/&Phi;/g, 'Φ');
+  str = str.replace(/&Chi;/g, 'Χ');
+  str = str.replace(/&Psi;/g, 'Ψ');
+  str = str.replace(/&Omega;/g, 'Ω');
+
+  str = str.replace(/&alpha;/g, 'α');
+  str = str.replace(/&beta;/g, 'β');
+  str = str.replace(/&gamma;/g, 'γ');
+  str = str.replace(/&delta;/g, 'δ');
+  str = str.replace(/&epsilon;/g, 'ε');
+  str = str.replace(/&zeta;/g, 'ζ');
+  str = str.replace(/&eta;/g, 'η');
+  str = str.replace(/&theta;/g, 'θ');
+  str = str.replace(/&iota;/g, 'ι');
+  str = str.replace(/&kappa;/g, 'κ');
+  str = str.replace(/&lambda;/g, 'λ');
+  str = str.replace(/&mu;/g, 'μ');
+  str = str.replace(/&nu;/g, 'ν');
+  str = str.replace(/&xi;/g, 'ξ');
+  str = str.replace(/&omicron;/g, 'ο');
+  str = str.replace(/&pi;/g, 'π');
+  str = str.replace(/&rho;/g, 'ρ');
+  str = str.replace(/&sigmaf;/g, 'ς');
+  str = str.replace(/&sigma;/g, 'σ');
+  str = str.replace(/&tau;/g, 'τ');
+  str = str.replace(/&upsilon;/g, 'υ');
+  str = str.replace(/&phi;/g, 'φ');
+  str = str.replace(/&chi;/g, 'χ');
+  str = str.replace(/&psi;/g, 'ψ');
+  str = str.replace(/&omega;/g, 'ω');
+  str = str.replace(/&thetasym;/g, 'ϑ');
+  str = str.replace(/&upsih;/g, 'ϒ');
+  str = str.replace(/&piv;/g, 'ϖ');
+  str = str.replace(/&middot;/g, '·');
+  return str;
+}
+
+function strcharacterDiscode(str) {
+  // 加入常用解析
+  str = str.replace(/&nbsp;/g, ' ');
+  str = str.replace(/&ensp;/g, ' ');
+  str = str.replace(/&emsp;/g, ' ');
+  str = str.replace(/&quot;/g, "'");
+  str = str.replace(/&amp;/g, '&');
+  str = str.replace(/&lt;/g, '<');
+  str = str.replace(/&gt;/g, '>');
+  str = str.replace(/&#8226;/g, '•');
+
+  return str;
+}
+
+// HTML 支持的其他实体
+function strOtherDiscode(str) {
+  str = str.replace(/&OElig;/g, 'Œ');
+  str = str.replace(/&oelig;/g, 'œ');
+  str = str.replace(/&Scaron;/g, 'Š');
+  str = str.replace(/&scaron;/g, 'š');
+  str = str.replace(/&Yuml;/g, 'Ÿ');
+  str = str.replace(/&fnof;/g, 'ƒ');
+  str = str.replace(/&circ;/g, 'ˆ');
+  str = str.replace(/&tilde;/g, '˜');
+  str = str.replace(/&ensp;/g, '');
+  str = str.replace(/&emsp;/g, '');
+  str = str.replace(/&thinsp;/g, '');
+  str = str.replace(/&zwnj;/g, '');
+  str = str.replace(/&zwj;/g, '');
+  str = str.replace(/&lrm;/g, '');
+  str = str.replace(/&rlm;/g, '');
+  str = str.replace(/&ndash;/g, '–');
+  str = str.replace(/&mdash;/g, '—');
+  str = str.replace(/&lsquo;/g, '‘');
+  str = str.replace(/&rsquo;/g, '’');
+  str = str.replace(/&sbquo;/g, '‚');
+  str = str.replace(/&ldquo;/g, '“');
+  str = str.replace(/&rdquo;/g, '”');
+  str = str.replace(/&bdquo;/g, '„');
+  str = str.replace(/&dagger;/g, '†');
+  str = str.replace(/&Dagger;/g, '‡');
+  str = str.replace(/&bull;/g, '•');
+  str = str.replace(/&hellip;/g, '…');
+  str = str.replace(/&permil;/g, '‰');
+  str = str.replace(/&prime;/g, '′');
+  str = str.replace(/&Prime;/g, '″');
+  str = str.replace(/&lsaquo;/g, '‹');
+  str = str.replace(/&rsaquo;/g, '›');
+  str = str.replace(/&oline;/g, '‾');
+  str = str.replace(/&euro;/g, '€');
+  str = str.replace(/&trade;/g, '™');
+
+  str = str.replace(/&larr;/g, '←');
+  str = str.replace(/&uarr;/g, '↑');
+  str = str.replace(/&rarr;/g, '→');
+  str = str.replace(/&darr;/g, '↓');
+  str = str.replace(/&harr;/g, '↔');
+  str = str.replace(/&crarr;/g, '↵');
+  str = str.replace(/&lceil;/g, '⌈');
+  str = str.replace(/&rceil;/g, '⌉');
+
+  str = str.replace(/&lfloor;/g, '⌊');
+  str = str.replace(/&rfloor;/g, '⌋');
+  str = str.replace(/&loz;/g, '◊');
+  str = str.replace(/&spades;/g, '♠');
+  str = str.replace(/&clubs;/g, '♣');
+  str = str.replace(/&hearts;/g, '♥');
+
+  str = str.replace(/&diams;/g, '♦');
+  str = str.replace(/&#39;/g, "'");
+  return str;
+}
+
+function strDiscode(str) {
+  str = strNumDiscode(str);
+  str = strGreeceDiscode(str);
+  str = strcharacterDiscode(str);
+  str = strOtherDiscode(str);
+  return str;
+}
+
+function urlToHttpUrl(url, domain) {
+  if (/^\/\//.test(url)) {
+    return `https:${url}`;
+  } else if (/^\//.test(url)) {
+    return `https://${domain}${url}`;
+  }
+  return url;
+}
+
+export default {
+  strDiscode,
+  urlToHttpUrl,
+};
diff --git a/components/uParse/src/wxParse.css b/components/uParse/src/wxParse.css
new file mode 100644
index 0000000..691993a
--- /dev/null
+++ b/components/uParse/src/wxParse.css
@@ -0,0 +1,232 @@
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *         垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+.wxParse {
+  width: 100%;
+  font-family: Helvetica, sans-serif;
+  font-size: 30upx;
+  color: #666;
+  line-height: 1.8;
+}
+
+.wxParse view {
+  word-break: hyphenate;
+}
+
+.wxParse .inline {
+  display: inline;
+  margin: 0;
+  padding: 0;
+}
+
+.wxParse .div {
+  margin: 0;
+  padding: 0;
+}
+
+.wxParse .h1 .text {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+.wxParse .h2 .text {
+  font-size: 1.5em;
+  margin: 0.83em 0;
+}
+.wxParse .h3 .text {
+  font-size: 1.17em;
+  margin: 1em 0;
+}
+.wxParse .h4 .text {
+  margin: 1.33em 0;
+}
+.wxParse .h5 .text {
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+.wxParse .h6 .text {
+  font-size: 0.67em;
+  margin: 2.33em 0;
+}
+
+.wxParse .h1 .text,
+.wxParse .h2 .text,
+.wxParse .h3 .text,
+.wxParse .h4 .text,
+.wxParse .h5 .text,
+.wxParse .h6 .text,
+.wxParse .b,
+.wxParse .strong {
+  font-weight: bolder;
+}
+
+
+.wxParse .p {
+  margin: 1em 0;
+}
+
+.wxParse .i,
+.wxParse .cite,
+.wxParse .em,
+.wxParse .var,
+.wxParse .address {
+  font-style: italic;
+}
+
+.wxParse .pre,
+.wxParse .tt,
+.wxParse .code,
+.wxParse .kbd,
+.wxParse .samp {
+  font-family: monospace;
+}
+.wxParse .pre {
+  overflow: auto;
+  background: #f5f5f5;
+  padding: 16upx;
+  white-space: pre;
+  margin: 1em 0upx;
+}
+.wxParse .code {
+  display: inline;
+  background: #f5f5f5;
+}
+
+.wxParse .big {
+  font-size: 1.17em;
+}
+
+.wxParse .small,
+.wxParse .sub,
+.wxParse .sup {
+  font-size: 0.83em;
+}
+
+.wxParse .sub {
+  vertical-align: sub;
+}
+.wxParse .sup {
+  vertical-align: super;
+}
+
+.wxParse .s,
+.wxParse .strike,
+.wxParse .del {
+  text-decoration: line-through;
+}
+
+.wxParse .strong,
+.wxParse .s {
+  display: inline;
+}
+
+.wxParse .a {
+  color: deepskyblue;
+}
+
+.wxParse .video {
+  text-align: center;
+  margin: 22upx 0;
+}
+
+.wxParse .video-video {
+  width: 100%;
+}
+
+.wxParse .img {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  max-width: 100%;
+  overflow: hidden;
+}
+
+.wxParse .blockquote {
+  margin: 10upx 0;
+  padding: 22upx 0 22upx 22upx;
+  font-family: Courier, Calibri, "宋体";
+  background: #f5f5f5;
+  border-left: 6upx solid #dbdbdb;
+}
+.wxParse .blockquote .p {
+  margin: 0;
+}
+
+.wxParse .ul, .wxParse .ol {
+  display: block;
+  margin: 1em 0;
+  padding-left: 33upx;
+}
+.wxParse .ol {
+  list-style-type: disc;
+}
+.wxParse .ol {
+  list-style-type: decimal;
+}
+.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+
+.wxParse .ol>.li,.wxParse .ul>.li {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+.wxParse .ul .ul, .wxParse .ol .ul {
+  list-style-type: circle;
+}
+.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul {
+    list-style-type: square;
+}
+
+.wxParse .u {
+  text-decoration: underline;
+}
+.wxParse .hide {
+  display: none;
+}
+.wxParse .del {
+  display: inline;
+}
+.wxParse .figure {
+  overflow: hidden;
+}
+
+.wxParse .table {
+  width: 100%;
+}
+.wxParse .thead, .wxParse .tfoot, .wxParse .tr {
+  display: flex;
+  flex-direction: row;
+}
+.wxParse .tr {
+  width:100%;
+  display: flex;
+  border-right: 2upx solid #e0e0e0;
+  border-bottom: 2upx solid #e0e0e0;
+}
+.wxParse .th,
+.wxParse .td {
+  display: flex;
+  width: 1276upx;
+  overflow: auto;
+  flex: 1;
+  padding: 11upx;
+  border-left: 2upx solid #e0e0e0;
+}
+.wxParse .td:last {
+  border-top: 2upx solid #e0e0e0;
+}
+.wxParse .th {
+  background: #f0f0f0;
+  border-top: 2upx solid #e0e0e0;
+}
diff --git a/components/uParse/src/wxParse.vue b/components/uParse/src/wxParse.vue
new file mode 100644
index 0000000..0af913b
--- /dev/null
+++ b/components/uParse/src/wxParse.vue
@@ -0,0 +1,126 @@
+<!--**
+ * forked from:https://github.com/F-loat/mpvue-wxParse
+ *
+ * github地址: https://github.com/dcloudio/uParse
+ *
+ * for: uni-app框架下 富文本解析
+ */-->
+
+<template>
+	<!--基础元素-->
+	<view class="wxParse" :class="className" v-if="!loading">
+	  <view v-for="(node,index) of nodes" :key="index">
+		<wxParseTemplate :node="node" />
+	  </view>
+	</view>
+</template>
+
+<script>
+import HtmlToJson from './libs/html2json';
+import wxParseTemplate from './components/wxParseTemplate0';
+
+export default {
+  name: 'wxParse',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false,
+    },
+    className: {
+      type: String,
+      default: '',
+    },
+    content: {
+      type: String,
+      default: '',
+    },
+    noData: {
+      type: String,
+      default: '<div style="color: red;">数据不能为空</div>',
+    },
+    startHandler: {
+      type: Function,
+      default() {
+        return (node) => {
+          node.attr.class = null;
+          node.attr.style = null;
+        };
+      },
+    },
+    endHandler: {
+      type: Function,
+      default: null,
+    },
+    charsHandler: {
+      type: Function,
+      default: null,
+    },
+    imageProp: {
+      type: Object,
+      default() {
+        return {
+          mode: 'aspectFit',
+          padding: 0,
+          lazyLoad: false,
+          domain: '',
+        };
+      },
+    },
+  },
+	provide() {
+		return {
+			uparse: this
+		}
+	},
+  components: {
+    wxParseTemplate,
+  },
+  data() {
+    return {
+      imageUrls: []
+    };
+  },
+  computed: {
+    nodes() {
+      const {
+        content,
+        noData,
+        imageProp,
+        startHandler,
+        endHandler,
+        charsHandler,
+      } = this;
+      const parseData = content || noData;
+      const customHandler = {
+        start: startHandler,
+        end: endHandler,
+        chars: charsHandler,
+      };
+      const results = HtmlToJson(parseData, customHandler, imageProp, this);
+      this.imageUrls = results.imageUrls;
+	  console.log(results.nodes)
+      return results.nodes;
+    },
+  },
+  methods: {
+    navigate(href, $event) {
+      this.$emit('navigate', href, $event);
+    },
+    preview(src, $event) {
+      if (!this.imageUrls.length) return;
+      wx.previewImage({
+        current: src,
+        urls: this.imageUrls,
+      });
+      this.$emit('preview', src, $event);
+    },
+    removeImageUrl(src) {
+      const { imageUrls } = this;
+      imageUrls.splice(imageUrls.indexOf(src), 1);
+    },
+  },
+};
+</script>
+<style>
+	
+</style>
diff --git a/components/uni-badge/uni-badge.vue b/components/uni-badge/uni-badge.vue
new file mode 100644
index 0000000..0224ea4
--- /dev/null
+++ b/components/uni-badge/uni-badge.vue
@@ -0,0 +1,99 @@
+<template>
+	<text class="uni-badge" v-if="text" :class="inverted ? 'uni-badge-' + type + ' uni-badge--' + size + ' uni-badge-inverted' : 'uni-badge-' + type + ' uni-badge--' + size" @click="onClick()">{{text}}</text>
+</template>
+
+<script>
+	export default {
+		name: 'uni-badge',
+		props: {
+			type: {
+				type: String,
+				default: 'default'
+			},
+			inverted: {
+				type: Boolean,
+				default: false
+			},
+			text: {
+				type: String,
+				default: ''
+			},
+			size: { //small.normal
+				type: String,
+				default: 'normal'
+			}
+		},
+		methods: {
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-badge {
+		font-family: 'Helvetica Neue', Helvetica, sans-serif;
+		box-sizing: border-box;
+		font-size: 12px;
+		line-height: 1;
+		display: inline-block;
+		padding: 3px 6px;
+		color: #333;
+		border-radius: 100px;
+		background-color: #f1f1f1
+	}
+
+	.uni-badge.uni-badge-inverted {
+		padding: 0 5px 0 0;
+		color: #999;
+		background-color: transparent
+	}
+
+	.uni-badge-primary {
+		color: #fff;
+		background-color: #007aff
+	}
+
+	.uni-badge-primary.uni-badge-inverted {
+		color: #007aff;
+		background-color: transparent
+	}
+
+	.uni-badge-success {
+		color: #fff;
+		background-color: #4cd964
+	}
+
+	.uni-badge-success.uni-badge-inverted {
+		color: #4cd964;
+		background-color: transparent
+	}
+
+	.uni-badge-warning {
+		color: #fff;
+		background-color: #f0ad4e
+	}
+
+	.uni-badge-warning.uni-badge-inverted {
+		color: #f0ad4e;
+		background-color: transparent
+	}
+
+	.uni-badge-error {
+		color: #fff;
+		background-color: #dd524d
+	}
+
+	.uni-badge-error.uni-badge-inverted {
+		color: #dd524d;
+		background-color: transparent
+	}
+
+	.uni-badge--small {
+		transform: scale(.8);
+		transform-origin: center center
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-calendar/calendar.js b/components/uni-calendar/calendar.js
new file mode 100644
index 0000000..b8d7d6f
--- /dev/null
+++ b/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
diff --git a/components/uni-calendar/uni-calendar-item.vue b/components/uni-calendar/uni-calendar-item.vue
new file mode 100644
index 0000000..c66a58d
--- /dev/null
+++ b/components/uni-calendar/uni-calendar-item.vue
@@ -0,0 +1,170 @@
+<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--before-checked':weeks.beforeMultiple,
+		'uni-calendar-item--multiple': weeks.multiple,
+		'uni-calendar-item--after-checked':weeks.afterMultiple,
+		}"
+	 @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--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'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--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				}">今天</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--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'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--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'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;
+	}
+	.uni-calendar-item--before-checked {
+		background-color: #ff5a5f;
+		color: #fff;
+	}
+	.uni-calendar-item--after-checked {
+		background-color: #ff5a5f;
+		color: #fff;
+	}
+</style>
diff --git a/components/uni-calendar/uni-calendar.vue b/components/uni-calendar/uni-calendar.vue
new file mode 100644
index 0000000..e0e0d90
--- /dev/null
+++ b/components/uni-calendar/uni-calendar.vue
@@ -0,0 +1,505 @@
+<template>
+	<view class="uni-calendar">
+		<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" style="color:#E72C31 ;">取消</text>
+				</view>
+				<view class="uni-calendar__header-btn-box" @click="confirm">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width" style="color: #5CE6B5;">确定</text>
+				</view>
+			</view>
+			<view class="uni-calendar__header">
+				<view class="uni-calendar__header-btn-box" @click.stop="pre">
+					<view class="uni-calendar__header-btn uni-calendar--left"></view>
+				</view>
+				<picker mode="date" :value="date" fields="month" @change="bindDateChange">
+					<text class="uni-calendar__header-text">{{ (nowDate.year||'') +'年'+( nowDate.month||'') +'月'}}</text>
+				</picker>
+				<view class="uni-calendar__header-btn-box" @click.stop="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">
+						<calendar-item :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Calendar from './util.js';
+	import calendarItem from './uni-calendar-item.vue'
+	/**
+	 * Calendar 日历
+	 * @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=56
+	 * @property {String} date 自定义当前时间,默认为今天
+	 * @property {Boolean} lunar 显示农历
+	 * @property {String} startDate 日期选择范围-开始日期
+	 * @property {String} endDate 日期选择范围-结束日期
+	 * @property {Boolean} range 范围选择
+	 * @property {Boolean} insert = [true|false] 插入模式,默认为false
+	 * 	@value true 弹窗模式
+	 * 	@value false 插入模式
+	 * @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容
+	 * @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
+	 * @property {Boolean} showMonth 是否选择月份为背景
+	 * @event {Function} change 日期改变,`insert :ture` 时生效
+	 * @event {Function} confirm 确认选择`insert :false` 时生效
+	 * @event {Function} monthSwitch 切换月份时触发
+	 * @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
+	 */
+	export default {
+		components: {
+			calendarItem
+		},
+		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
+			},
+			clearDate: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				show: false,
+				weeks: [],
+				calendar: {},
+				nowDate: '',
+				aniMaskShow: false
+			}
+		},
+		watch: {
+			date(newVal) {
+				this.cale.setDate(newVal)
+				this.init(this.cale.selectDate.fullDate)
+			},
+			startDate(val){
+				this.cale.resetSatrtDate(val)
+			},
+			endDate(val){
+				this.cale.resetEndDate(val)
+			},
+			selected(newVal) {
+				this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
+				this.weeks = this.cale.weeks
+			}
+		},
+		created() {
+			// 获取日历方法实例
+			this.cale = new Calendar({
+				// date: new Date(),
+				selected: this.selected,
+				startDate: this.startDate,
+				endDate: this.endDate,
+				range: this.range,
+			})
+			// 选中某一天
+			this.cale.setDate(this.date)
+			this.init(this.cale.selectDate.fullDate)
+			// this.setDay
+		},
+		methods: {
+			// 取消穿透
+			clean() {},
+			bindDateChange(e) {
+				const value = e.detail.value + '-1'
+				console.log(this.cale.getDate(value));
+				this.cale.setDate(value)
+				this.init(value)
+			},
+			/**
+			 * 初始化日期显示
+			 * @param {Object} date
+			 */
+			init(date) {
+				this.weeks = this.cale.weeks
+				this.nowDate = this.calendar = this.cale.getInfo(date)
+			},
+			/**
+			 * 打开日历弹窗
+			 */
+			open() {
+				// 弹窗模式并且清理数据
+				if (this.clearDate && !this.insert) {
+					this.cale.cleanMultipleStatus()
+					this.cale.setDate(this.date)
+					this.init(this.cale.selectDate.fullDate)
+				}
+				this.show = true
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.aniMaskShow = true
+					}, 50)
+				})
+			},
+			/**
+			 * 关闭日历弹窗
+			 */
+			close() {
+				this.aniMaskShow = false
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false
+						this.$emit('close')
+					}, 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)
+				})
+			},
+			/**
+			 * 派发事件
+			 * @param {Object} name
+			 */
+			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 || {}
+				})
+			},
+			/**
+			 * 选择天触发
+			 * @param {Object} weeks
+			 */
+			choiceDate(weeks) {
+				if (weeks.disable) return
+				this.calendar = weeks
+				// 设置多选
+				this.cale.setMultiple(this.calendar.fullDate)
+				this.weeks = this.cale.weeks
+				this.change()
+			},
+			/**
+			 * 回到今天
+			 */
+			backtoday() {
+				console.log(this.cale.getDate(new Date()).fullDate);
+				let date = this.cale.getDate(new Date()).fullDate
+				this.cale.setDate(date)
+				this.init(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()
+			},
+			/**
+			 * 设置日期
+			 * @param {Object} date
+			 */
+			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>
diff --git a/components/uni-calendar/util.js b/components/uni-calendar/util.js
new file mode 100644
index 0000000..37f4432
--- /dev/null
+++ b/components/uni-calendar/util.js
@@ -0,0 +1,352 @@
+import CALENDAR from './calendar.js'
+
+class Calendar {
+	constructor({
+		date,
+		selected,
+		startDate,
+		endDate,
+		range
+	} = {}) {
+		// 当前日期
+		this.date = this.getDate(new Date()) // 当前初入日期
+		// 打点信息
+		this.selected = selected || [];
+		// 范围开始
+		this.startDate = startDate
+		// 范围结束
+		this.endDate = endDate
+		this.range = range
+		// 多选状态
+		this.cleanMultipleStatus()
+		// 每周日期
+		this.weeks = {}
+		// this._getWeek(this.date.fullDate)
+	}
+	/**
+	 * 设置日期
+	 * @param {Object} date
+	 */
+	setDate(date) {
+		this.selectDate = this.getDate(date)
+		this._getWeek(this.selectDate.fullDate)
+	}
+
+	/**
+	 * 清理多选状态
+	 */
+	cleanMultipleStatus() {
+		this.multipleStatus = {
+			before: '',
+			after: '',
+			data: []
+		}
+	}
+
+	/**
+	 * 重置开始日期
+	 */
+	resetSatrtDate(startDate) {
+		// 范围开始
+		this.startDate = startDate
+
+	}
+
+	/**
+	 * 重置结束日期
+	 */
+	resetEndDate(endDate) {
+		// 范围结束
+		this.endDate = endDate
+	}
+
+	/**
+	 * 获取任意时间
+	 */
+	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,
+				beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate),
+				afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate),
+				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
+	 */
+	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 = []
+		} 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
diff --git a/components/uni-card/uni-card.vue b/components/uni-card/uni-card.vue
new file mode 100644
index 0000000..d2ed513
--- /dev/null
+++ b/components/uni-card/uni-card.vue
@@ -0,0 +1,139 @@
+<template>
+	<view class="uni-card" :class="isFull === true || isFull === 'true' ? 'uni-card--full' : ''" @click="onClick">
+		<view class="uni-card__header" v-if="title">
+			<view class="uni-card__header-extra-img-view" v-if="thumbnail">
+				<image class="uni-card__header-extra-img" :src="thumbnail"></image>
+			</view>
+			<view class="uni-card__header-title-text">{{title}}</view>
+			<view class="uni-card__header-extra-text" v-if="extra">{{extra}}</view>
+		</view>
+		<view class="uni-card__content uni-card__content--pd">
+			<slot />
+		</view>
+		<view class="uni-card__footer" v-if="note">{{note}}</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "uni-card",
+		props: {
+			title: String, //标题
+			extra: String, //扩展信息
+			note: String, //Tips
+			thumbnail: String, //缩略图
+			isFull: { //内容区域是否通栏
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		methods: {
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-card {
+		margin-left: 24upx;
+		margin-right: 24upx;
+		background: #fff;
+		box-shadow: none;
+		position: relative;
+		display: flex;
+		flex-direction: column
+	}
+
+	.uni-card:after {
+		content: '';
+		position: absolute;
+		transform-origin: center;
+		box-sizing: border-box;
+		pointer-events: none;
+		top: -50%;
+		left: -50%;
+		right: -50%;
+		bottom: -50%;
+		border: 1px solid #c8c7cc;
+		border-radius: 12upx;
+		transform: scale(.5)
+	}
+
+	.uni-card__footer,
+	.uni-card__header {
+		position: relative;
+		display: flex;
+		flex-direction: row;
+		padding: 16upx;
+		align-items: center
+	}
+
+	.uni-card__header:after {
+		position: absolute;
+		bottom: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+
+	.uni-card__header-title {
+		flex: 1;
+		margin-right: 16upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		align-items: center
+	}
+
+	.uni-card__header-title-text {
+		font-size: 32upx;
+		flex: 1;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		overflow: hidden
+	}
+
+	.uni-card__header-extra-img-view {
+		display: flex
+	}
+
+	.uni-card__header-extra-img {
+		height: 40upx;
+		width: 40upx;
+		margin-right: 16upx
+	}
+
+	.uni-card__header-extra-text {
+		flex: 0 0 auto;
+		width: 30%;
+		margin-left: 16upx;
+		font-size: 28upx;
+		text-align: right;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		overflow: hidden
+	}
+
+	.uni-card__content--pd {
+		padding: 16upx
+	}
+
+	.uni-card__footer {
+		justify-content: space-between;
+		color: #999;
+		font-size: 24upx;
+		padding-top: 0
+	}
+
+	.uni-card--full {
+		margin: 0
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-collapse-item/uni-collapse-item.vue b/components/uni-collapse-item/uni-collapse-item.vue
new file mode 100644
index 0000000..a525666
--- /dev/null
+++ b/components/uni-collapse-item/uni-collapse-item.vue
@@ -0,0 +1,217 @@
+<template>
+	<view :class="['uni-collapse-cell',{'uni-collapse-cell--disabled':disabled,'uni-collapse-cell--open':isOpen}]" :hover-class="disabled ? '' : 'uni-collapse-cell--hover'">
+		<view class="uni-collapse-cell__title" @click="onClick">
+			<view class="uni-collapse-cell__title-extra" v-if="thumb">
+				<image class="uni-collapse-cell__title-img" :src="thumb"></image>
+			</view>
+			<view class="uni-collapse-cell__title-inner">
+				<view class="uni-collapse-cell__title-text">{{title}}</view>
+			</view>
+			<view class="uni-collapse-cell__title-arrow" :class="{'uni-active':isOpen,'uni-collapse-cell--animation':showAnimation===true}">
+				<uni-icon color="#bbb" size="20" type="arrowdown"></uni-icon>
+			</view>
+		</view>
+		<view class="uni-collapse-cell__content" :class="{'uni-collapse-cell--animation':showAnimation===true}" :style="{height:isOpen ? height : '0px'}">
+			<view :id="elId">
+				<slot />
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcon from '../uni-icon/uni-icon.vue'
+	export default {
+		name: 'uni-collapse-item',
+		components: {
+			uniIcon
+		},
+		props: {
+			title: { //列表标题
+				type: String,
+				default: ''
+			},
+			name: { //唯一标识符
+				type: [Number, String],
+				default: 0
+			},
+			disabled: { //是否禁用
+				type: [Boolean, String],
+				default: false
+			},
+			showAnimation: { //是否显示动画
+				type: Boolean,
+				default: false
+			},
+			open: { //是否展开
+				type: [Boolean, String],
+				default: false
+			},
+			thumb: { //缩略图
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+			return {
+				isOpen: false,
+				height: 'auto',
+				elId: elId
+			};
+		},
+		watch: {
+			open(val) {
+				this.isOpen = val
+			}
+		},
+		inject: ['collapse'],
+		created() {
+			this.isOpen = this.open
+			this.nameSync = this.name ? this.name : this.collapse.childrens.length
+			this.collapse.childrens.push(this)
+			if (String(this.collapse.accordion) === 'true') {
+				if (this.isOpen) {
+					let lastEl = this.collapse.childrens[this.collapse.childrens.length - 2]
+					if (lastEl) {
+						this.collapse.childrens[this.collapse.childrens.length - 2].isOpen = false
+					}
+				}
+			}
+		},
+		// #ifdef H5
+		mounted() {
+			this.getSize()
+		},
+		// #endif
+		// #ifndef H5
+		onReady() {
+			this.getSize()
+		},
+		// #endif
+		methods: {
+			getSize() {
+				if (this.showAnimation) {
+					uni.createSelectorQuery().in(this).select(`#${this.elId}`).boundingClientRect().exec((ret) => {
+						this.height = ret[0].height + 'px'
+					});
+				}
+			},
+			onClick() {
+				if (this.disabled) {
+					return
+				}
+				if (String(this.collapse.accordion) === 'true') {
+					this.collapse.childrens.forEach(vm => {
+						if (vm === this) {
+							return
+						}
+						vm.isOpen = false
+					})
+				}
+				this.isOpen = !this.isOpen
+				this.collapse.onChange && this.collapse.onChange()
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-collapse-cell {
+		position: relative
+	}
+
+	.uni-collapse-cell--hover {
+		background-color: #f1f1f1
+	}
+
+	.uni-collapse-cell--open {
+		background-color: #f1f1f1
+	}
+
+	.uni-collapse-cell--disabled {
+		opacity: .3
+	}
+
+	.uni-collapse-cell--animation {
+		transition: all .3s
+	}
+
+	.uni-collapse-cell:after {
+		position: absolute;
+		z-index: 3;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+
+	.uni-collapse-cell__title {
+		padding: 24upx 30upx;
+		width: 100%;
+		box-sizing: border-box;
+		flex: 1;
+		position: relative;
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center
+	}
+
+	.uni-collapse-cell__title-extra {
+		margin-right: 18upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center
+	}
+
+	.uni-collapse-cell__title-img {
+		height: 52upx;
+		width: 52upx
+	}
+
+	.uni-collapse-cell__title-arrow {
+		width: 20px;
+		height: 20px;
+		transform: rotate(0);
+		transform-origin: center center
+	}
+
+	.uni-collapse-cell__title-arrow.uni-active {
+		transform: rotate(-180deg)
+	}
+
+	.uni-collapse-cell__title-inner {
+		flex: 1;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column
+	}
+
+	.uni-collapse-cell__title-text {
+		font-size: 32upx;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		color: inherit;
+		line-height: 1.5;
+		overflow: hidden
+	}
+
+	.uni-collapse-cell__content {
+		position: relative;
+		width: 100%;
+		overflow: hidden;
+		background: #fff
+	}
+
+	.uni-collapse-cell__content view {
+		font-size: 28upx
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-collapse/uni-collapse.vue b/components/uni-collapse/uni-collapse.vue
new file mode 100644
index 0000000..5ea42b2
--- /dev/null
+++ b/components/uni-collapse/uni-collapse.vue
@@ -0,0 +1,75 @@
+<template>
+	<view class="uni-collapse">
+		<slot></slot>
+	</view>
+</template>
+<script>
+	export default {
+		name: 'uni-collapse',
+		props: {
+			accordion: { //是否开启手风琴效果
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		data() {
+			return {}
+		},
+		provide() {
+			return {
+				collapse: this
+			}
+		},
+		created() {
+			this.childrens = []
+		},
+		methods: {
+			onChange() {
+				let activeItem = []
+				this.childrens.forEach((vm, index) => {
+					if (vm.isOpen) {
+						activeItem.push(vm.nameSync)
+					}
+				})
+				this.$emit('change', activeItem)
+			}
+		}
+	}
+</script>
+<style>
+	@charset "UTF-8";
+
+	.uni-collapse {
+		background-color: #fff;
+		position: relative;
+		width: 100%;
+		display: flex;
+		flex-direction: column
+	}
+
+	.uni-collapse:after {
+		position: absolute;
+		z-index: 10;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+
+	.uni-collapse:before {
+		position: absolute;
+		z-index: 10;
+		right: 0;
+		top: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-countdown/uni-countdown.vue b/components/uni-countdown/uni-countdown.vue
new file mode 100644
index 0000000..d474351
--- /dev/null
+++ b/components/uni-countdown/uni-countdown.vue
@@ -0,0 +1,117 @@
+<template>
+	<view class="uni-countdown">
+		<view v-if="showDay" class="uni-countdown__number" :style="{borderColor:borderColor, color:color, background:backgroundColor}">{{d}}</view>
+		<view v-if="showDay" class="uni-countdown__splitor" :style="{color:splitorColor}">天</view>
+		<view class="uni-countdown__number" :style="{borderColor:borderColor, color:color, background:backgroundColor}">{{h}}</view>
+		<view class="uni-countdown__splitor" :style="{color:splitorColor}">{{showColon ? ':' : '时'}}</view>
+		<view class="uni-countdown__number" :style="{borderColor:borderColor, color:color, background:backgroundColor}">{{i}}</view>
+		<view class="uni-countdown__splitor" :style="{color:splitorColor}">{{showColon ? ':' : '分'}}</view>
+		<view class="uni-countdown__number" :style="{borderColor:borderColor, color:color, background:backgroundColor}">{{s}}</view>
+		<view v-if="!showColon" class="uni-countdown__splitor" :style="{color:splitorColor}">秒</view>
+	</view>
+</template>
+<script>
+	export default {
+		name: "uni-countdown",
+		props: {
+			showColon: {
+				type: Boolean,
+				default: true
+			},
+			backgroundColor: {
+				type: String,
+				default: "inherit"
+			},
+			borderColor: {
+				type: String,
+				default: "#000000"
+			},
+			color: {
+				type: String,
+				value: "#000000"
+			},
+			splitorColor: {
+				type: String,
+				default: "#000000"
+			},
+			dateTime: {
+				type: String,
+				default: new Date()._format('yyyy/MM/dd')
+			}
+		},
+		data() {
+			return {
+				timer: null,
+				d: '00',
+				h: '00',
+				i: '00',
+				s: '00',
+				ms: 0,
+				leftTime: 0,
+				seconds: 0,
+				showDay: true
+			}
+		},
+		created: function(e) {
+			this.countDown()
+			this.timer = setInterval(() => {
+				this.seconds--
+				if (this.seconds < 0) {
+					this.timeUp()
+					return
+				}
+				this.countDown()
+			}, 1000)
+		},
+		beforeDestroy() {
+			clearInterval(this.timer)
+		},
+		methods: {
+			timeUp() {
+				clearInterval(this.timer)
+				this.$emit('timeup')
+			},
+			countDown() {
+				let [day, hour, minute, second, millisecond] = [0, 0, 0, 0, 0]
+				if (this.dateTime) {
+					this.seconds = new Date(this.dateTime).getTime() - new Date().getTime()
+					day = Math.floor(this.seconds / (1000 * 60 * 60 * 24))
+					hour = Math.floor(this.seconds / (1000 * 60 * 60)) - (day * 24)
+					minute = Math.floor(this.seconds / (1000 * 60)) - (day * 24 * 60) - (hour * 60)
+					second = Math.floor(this.seconds / 1000) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
+				} else this.timeUp()
+				if (day && day < 10) day = '0' + day
+				else if (day == 0) this.showDay = false
+				if (hour < 10) hour = '0' + hour
+				if (minute < 10) minute = '0' + minute
+				if (second < 10) second = '0' + second
+				this.d = day
+				this.h = hour
+				this.i = minute
+				this.s = second
+			}
+		}
+	}
+</script>
+<style>
+	@charset "UTF-8";
+
+	.uni-countdown {
+		padding: 2upx 0;
+		display: inline-flex;
+		flex-wrap: nowrap;
+		justify-content: center
+	}
+
+	.uni-countdown__splitor {
+		justify-content: center;
+		line-height: 44upx;
+		padding: 0 10upx
+	}
+
+	.uni-countdown__number {
+		line-height: 44upx;
+		justify-content: center;
+		height: 44upx;
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-drawer/uni-drawer.vue b/components/uni-drawer/uni-drawer.vue
new file mode 100644
index 0000000..c776704
--- /dev/null
+++ b/components/uni-drawer/uni-drawer.vue
@@ -0,0 +1,138 @@
+<template>
+	<view v-if="visibleSync" class="uni-drawer" @touchmove.stop.prevent="moveHandle" :class="{'uni-drawer--visible':showDrawer,'uni-drawer--right':rightMode}">
+		<view class="uni-drawer__mask" @tap="close"></view>
+		<view class="uni-drawer__content">
+			<slot></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'uni-drawer',
+		props: {
+			/**
+			 * 显示状态
+			 */
+			visible: {
+				type: Boolean,
+				default: false
+			},
+			/**
+			 * 显示模式(左、右),只在初始化生效
+			 */
+			mode: String,
+			/**
+			 * 蒙层显示状态
+			 */
+			mask: {
+				type: [Boolean, String],
+				default: true
+			}
+		},
+		data() {
+			return {
+				visibleSync: false,
+				showDrawer: false,
+				rightMode: false,
+				closeTimer: null,
+				watchTimer: null
+			}
+		},
+		watch: {
+			visible(val) {
+				clearTimeout(this.watchTimer)
+				setTimeout(() => {
+					this.showDrawer = val
+				}, 100)
+				if (this.visibleSync) {
+					clearTimeout(this.closeTimer)
+				}
+				if (val) {
+					this.visibleSync = val
+				} else {
+					this.watchTimer = setTimeout(() => {
+						this.visibleSync = val
+					}, 300)
+				}
+			}
+		},
+		created() {
+			this.visibleSync = this.visible
+			setTimeout(() => {
+				this.showDrawer = this.visible
+			}, 100)
+			this.rightMode = this.mode === 'right'
+		},
+		methods: {
+			close() {
+				this.showDrawer = false
+				this.closeTimer = setTimeout(() => {
+					this.visibleSync = false
+					this.$emit('close')
+				}, 200)
+			},
+			moveHandle() {}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-drawer {
+		display: block;
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		overflow: hidden;
+		visibility: hidden;
+		z-index: 10001;
+		height: 100%
+	}
+
+	.uni-drawer.uni-drawer--right .uni-drawer__content {
+		left: auto;
+		right: 0;
+		transform: translatex(100%)
+	}
+
+	.uni-drawer.uni-drawer--visible {
+		visibility: visible
+	}
+
+	.uni-drawer.uni-drawer--visible .uni-drawer__content {
+		transform: translatex(0)
+	}
+
+	.uni-drawer.uni-drawer--visible .uni-drawer__mask {
+		display: block;
+		opacity: 1
+	}
+
+	.uni-drawer__mask {
+		display: block;
+		opacity: 0;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		background: rgba(0, 0, 0, .4);
+		transition: opacity .3s
+	}
+
+	.uni-drawer__content {
+		display: block;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 61.8%;
+		height: 100%;
+		background: #fff;
+		transition: all .3s ease-out;
+		transform: translatex(-100%)
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-fab/uni-fab.vue b/components/uni-fab/uni-fab.vue
new file mode 100644
index 0000000..78bac7f
--- /dev/null
+++ b/components/uni-fab/uni-fab.vue
@@ -0,0 +1,433 @@
+<template>
+	<view>
+		<view v-if="popMenu && (leftBottom||rightBottom||leftTop||rightTop)" :class="{
+        'uni-fab--leftBottom': leftBottom,
+        'uni-fab--rightBottom': rightBottom,
+        'uni-fab--leftTop': leftTop,
+        'uni-fab--rightTop': rightTop
+      }"
+		 class="uni-fab">
+			<view :class="{
+          'uni-fab__content--left': horizontal === 'left',
+          'uni-fab__content--right': horizontal === 'right',
+          'uni-fab__content--flexDirection': direction === 'vertical',
+          'uni-fab__content--flexDirectionStart': flexDirectionStart,
+          'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
+		  'uni-fab__content--other-platform': !isAndroidNvue
+        }"
+			 :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }" class="uni-fab__content"
+			 elevation="5">
+				<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
+				<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }" class="uni-fab__item"
+				 @click="_onItemClick(index, item)">
+					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image" mode="widthFix" />
+					<text class="uni-fab__item-text" :style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
+				</view>
+				<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
+			</view>
+		</view>
+		<view :class="{
+		  'uni-fab__circle--leftBottom': leftBottom,
+		  'uni-fab__circle--rightBottom': rightBottom,
+		  'uni-fab__circle--leftTop': leftTop,
+		  'uni-fab__circle--rightTop': rightTop,
+		  'uni-fab__content--other-platform': !isAndroidNvue
+		}"
+		 class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor }" @click="_onClick">
+			<view class="fab-circle-v" :class="{'uni-fab__plus--active': isShow}"></view>
+			<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow}"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	let platform = 'other'
+	// #ifdef APP-NVUE
+	platform = uni.getSystemInfoSync().platform
+	// #endif
+
+	/**
+	 * Fab 悬浮按钮
+	 * @description 点击可展开一个图形按钮菜单
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=144
+	 * @property {Object} pattern 可选样式配置项
+	 * @property {Object} horizontal = [left | right] 水平对齐方式
+	 * 	@value left 左对齐
+	 * 	@value right 右对齐
+	 * @property {Object} vertical = [bottom | top] 垂直对齐方式
+	 * 	@value bottom 下对齐
+	 * 	@value top 上对齐
+	 * @property {Object} direction = [horizontal | vertical] 展开菜单显示方式
+	 * 	@value horizontal 水平显示
+	 * 	@value vertical 垂直显示
+	 * @property {Array} content 展开菜单内容配置项
+	 * @property {Boolean} popMenu 是否使用弹出菜单
+	 * @event {Function} trigger 展开菜单点击事件,返回点击信息
+	 * @event {Function} fabClick 悬浮按钮点击事件
+	 */
+	export default {
+		name: 'UniFab',
+		props: {
+			pattern: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			horizontal: {
+				type: String,
+				default: 'left'
+			},
+			vertical: {
+				type: String,
+				default: 'bottom'
+			},
+			direction: {
+				type: String,
+				default: 'horizontal'
+			},
+			content: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			show: {
+				type: Boolean,
+				default: false
+			},
+			popMenu: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				fabShow: false,
+				isShow: false,
+				isAndroidNvue: platform === 'android',
+				styles: {
+					color: '#3c3e49',
+					selectedColor: '#007AFF',
+					backgroundColor: '#fff',
+					buttonColor: '#3c3e49'
+				}
+			}
+		},
+		computed: {
+			contentWidth(e) {
+				return (this.content.length + 1) * 55 + 10 + 'px'
+			},
+			contentWidthMin() {
+				return 55 + 'px'
+			},
+			// 动态计算宽度
+			boxWidth() {
+				return this.getPosition(3, 'horizontal')
+			},
+			// 动态计算高度
+			boxHeight() {
+				return this.getPosition(3, 'vertical')
+			},
+			// 计算左下位置
+			leftBottom() {
+				return this.getPosition(0, 'left', 'bottom')
+			},
+			// 计算右下位置
+			rightBottom() {
+				return this.getPosition(0, 'right', 'bottom')
+			},
+			// 计算左上位置
+			leftTop() {
+				return this.getPosition(0, 'left', 'top')
+			},
+			rightTop() {
+				return this.getPosition(0, 'right', 'top')
+			},
+			flexDirectionStart() {
+				return this.getPosition(1, 'vertical', 'top')
+			},
+			flexDirectionEnd() {
+				return this.getPosition(1, 'vertical', 'bottom')
+			},
+			horizontalLeft() {
+				return this.getPosition(2, 'horizontal', 'left')
+			},
+			horizontalRight() {
+				return this.getPosition(2, 'horizontal', 'right')
+			}
+		},
+		watch: {
+			pattern(newValue, oldValue) {
+				//console.log(JSON.stringify(newValue))
+				this.styles = Object.assign({}, this.styles, newValue)
+			}
+		},
+		created() {
+			this.isShow = this.show
+			if (this.top === 0) {
+				this.fabShow = true
+			}
+			// 初始化样式
+			this.styles = Object.assign({}, this.styles, this.pattern)
+		},
+		methods: {
+			_onClick() {
+				this.$emit('fabClick')
+				if (!this.popMenu) {
+					return
+				}
+				this.isShow = !this.isShow
+			},
+			open() {
+				this.isShow = true
+			},
+			close() {
+				this.isShow = false
+			},
+			/**
+			 * 按钮点击事件
+			 */
+			_onItemClick(index, item) {
+				this.$emit('trigger', {
+					index,
+					item
+				})
+			},
+			/**
+			 * 获取 位置信息
+			 */
+			getPosition(types, paramA, paramB) {
+				if (types === 0) {
+					return this.horizontal === paramA && this.vertical === paramB
+				} else if (types === 1) {
+					return this.direction === paramA && this.vertical === paramB
+				} else if (types === 2) {
+					return this.direction === paramA && this.horizontal === paramB
+				} else {
+					return this.isShow && this.direction === paramA ? this.contentWidth : this.contentWidthMin
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-fab {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		z-index: 10;
+	}
+
+	.uni-fab--active {
+		opacity: 1;
+	}
+
+	.uni-fab--leftBottom {
+		left: 5px;
+		bottom: 20px;
+		/* #ifdef H5 */
+		bottom: calc(20px + var(--window-bottom));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab--leftTop {
+		left: 5px;
+		top: 30px;
+		/* #ifdef H5 */
+		top: calc(30px + var(--window-top));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab--rightBottom {
+		right: 5px;
+		bottom: 20px;
+		/* #ifdef H5 */
+		bottom: calc(20px + var(--window-bottom));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab--rightTop {
+		right: 5px;
+		top: 30px;
+		/* #ifdef H5 */
+		top: calc(30px + var(--window-top));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab__circle {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		width: 55px;
+		height: 55px;
+		background-color: #3c3e49;
+		border-radius: 55px;
+		z-index: 11;
+	}
+
+	.uni-fab__circle--leftBottom {
+		left: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--leftTop {
+		left: 15px;
+		top: 40px;
+		/* #ifdef H5 */
+		top: calc(40px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightBottom {
+		right: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightTop {
+		right: 15px;
+		top: 40px;
+		/* #ifdef H5 */
+		top: calc(40px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--left {
+		left: 0;
+	}
+
+	.uni-fab__circle--right {
+		right: 0;
+	}
+
+	.uni-fab__circle--top {
+		top: 0;
+	}
+
+	.uni-fab__circle--bottom {
+		bottom: 0;
+	}
+
+	.uni-fab__plus {
+		font-weight: bold;
+	}
+
+	.fab-circle-v {
+		position: absolute;
+		width: 3px;
+		height: 31px;
+		left: 26px;
+		top: 12px;
+		background-color: white;
+		transform: rotate(0deg);
+		transition: transform 0.3s;
+	}
+
+	.fab-circle-h {
+		position: absolute;
+		width: 31px;
+		height: 3px;
+		left: 12px;
+		top: 26px;
+		background-color: white;
+		transform: rotate(0deg);
+		transition: transform 0.3s;
+	}
+
+	.uni-fab__plus--active {
+		transform: rotate(135deg);
+	}
+
+	.uni-fab__content {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		border-radius: 55px;
+		overflow: hidden;
+		transition-property: width, height;
+		transition-duration: 0.2s;
+		width: 55px;
+		border-color: #DDDDDD;
+		border-width: 1rpx;
+		border-style: solid;
+	}
+
+	.uni-fab__content--other-platform {
+		border-width: 0px;
+		box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.2);
+	}
+
+	.uni-fab__content--left {
+		justify-content: flex-start;
+	}
+
+	.uni-fab__content--right {
+		justify-content: flex-end;
+	}
+
+	.uni-fab__content--flexDirection {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.uni-fab__content--flexDirectionStart {
+		flex-direction: column;
+		justify-content: flex-start;
+	}
+
+	.uni-fab__content--flexDirectionEnd {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.uni-fab__item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 55px;
+		height: 55px;
+		opacity: 0;
+		transition: opacity 0.2s;
+	}
+
+	.uni-fab__item--active {
+		opacity: 1;
+	}
+
+	.uni-fab__item-image {
+		width: 25px;
+		height: 25px;
+		margin-bottom: 3px;
+	}
+
+	.uni-fab__item-text {
+		color: #FFFFFF;
+		font-size: 12px;
+	}
+
+	.uni-fab__item--first {
+		width: 55px;
+	}
+</style>
diff --git a/components/uni-grid/uni-grid.vue b/components/uni-grid/uni-grid.vue
new file mode 100644
index 0000000..948347d
--- /dev/null
+++ b/components/uni-grid/uni-grid.vue
@@ -0,0 +1,203 @@
+<template>
+	<view class="uni-grid" :class="{'uni-grid-no-border':!showBorder,'uni-grid-no-out-border':showBorder && !showOutBorder}">
+		<view class="uni-grid__flex" v-for="(items,i) in gridGroup" :key="i">
+			<view class="uni-grid-item" hover-class="uni-grid-item-hover" :hover-start-time="20" :hover-stay-time="70" v-for="(item,index) in items" :key="index" :class="[index == columnNum ? 'uni-grid-item-last' : '','uni-grid-item-' + type]" @click="onClick(i,index)" :style="{visibility:item.seize ? 'hidden' : 'inherit'}">
+				<view class="uni-grid-item__content" v-if="!item.seize">
+					<image class="uni-grid-item-image" :src="item.image"></image>
+					<text class="uni-grid-item-text">{{item.text}}</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "uni-grid",
+		props: {
+			options: Array,
+			type: { //布局格式,长方形oblong,正方形square
+				type: String,
+				default: 'square'
+			},
+			columnNum: { //每一行有多少个
+				type: [Number, String],
+				default: 3
+			},
+			showOutBorder: { //显示外边框
+				type: [Boolean, String],
+				default: true
+			},
+			showBorder: { //是否显示border,如果为false,showOutBorder无效
+				type: [Boolean, String],
+				default: true
+			}
+		},
+		data() {
+			return {}
+		},
+		created() {
+			this.columnNumber = this.gridGroup[0].length
+		},
+		computed: {
+			gridGroup() {
+				let group = []
+				let groupItem = []
+				this.options && this.options.forEach((item, index) => {
+					groupItem.push(item)
+					if (index % this.columnNum === this.columnNum - 1) {
+						group.push(groupItem)
+						groupItem = []
+					}
+				})
+				if (groupItem.length > 0) {
+					if (this.columnNum > groupItem.length) {
+						for (let i = 0, length = groupItem.length; i < this.columnNum - length; i++) {
+							groupItem.push({
+								seize: true
+							})
+						}
+					}
+					group.push(groupItem)
+				}
+				groupItem = null
+				return group
+			}
+		},
+		methods: {
+			onClick(index, num) {
+				this.$emit('click', {
+					index: index * this.columnNumber + num
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-grid {
+		position: relative;
+		display: flex;
+		flex-direction: column
+	}
+
+	.uni-grid__flex {
+		display: flex;
+		flex-direction: row
+	}
+
+	.uni-grid-item {
+		display: flex;
+		position: relative;
+		flex-direction: column;
+		flex: 1
+	}
+
+	.uni-grid-item:before {
+		display: block;
+		content: " ";
+		padding-bottom: 100%
+	}
+
+	.uni-grid-item:after {
+		content: '';
+		position: absolute;
+		z-index: 1;
+		transform-origin: center;
+		box-sizing: border-box;
+		top: -50%;
+		left: -50%;
+		right: -50%;
+		bottom: -50%;
+		border-color: #c8c7cc;
+		border-style: solid;
+		border-width: 1px;
+		-webkit-transform: scale(.5);
+		transform: scale(.5);
+		border-top-width: 0;
+		border-left-width: 0
+	}
+
+	.uni-grid-item__content {
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center
+	}
+
+	.uni-grid-item-text {
+		font-size: 32upx;
+		color: #333;
+		margin-top: 12upx
+	}
+
+	.uni-grid-item-hover {
+		background-color: #f1f1f1
+	}
+
+	.uni-grid-item-image {
+		width: 80upx;
+		height: 80upx
+	}
+
+	.uni-grid .uni-grid__flex:first-child .uni-grid-item:after {
+		border-top-width: 1px
+	}
+
+	.uni-grid .uni-grid__flex .uni-grid-item:first-child:after {
+		border-left-width: 1px
+	}
+
+	.uni-grid.uni-grid-no-out-border .uni-grid__flex:first-child .uni-grid-item:after {
+		border-top-width: 0
+	}
+
+	.uni-grid.uni-grid-no-out-border .uni-grid__flex:last-child .uni-grid-item:after {
+		border-bottom-width: 0
+	}
+
+	.uni-grid.uni-grid-no-out-border .uni-grid__flex .uni-grid-item:first-child:after {
+		border-left-width: 0
+	}
+
+	.uni-grid.uni-grid-no-out-border .uni-grid__flex .uni-grid-item:last-child:after {
+		border-right-width: 0
+	}
+
+	.uni-grid.uni-grid-no-border .uni-grid-item:after {
+		border-width: 0
+	}
+
+	.uni-grid.uni-grid-no-border .uni-grid__flex:first-child .uni-grid-item:after {
+		border-top-width: 0
+	}
+
+	.uni-grid.uni-grid-no-border .uni-grid__flex .uni-grid-item:first-child:after {
+		border-left-width: 0
+	}
+
+	.uni-grid-item-oblong.uni-grid-item:before {
+		padding-bottom: 60%
+	}
+
+	.uni-grid-item-oblong .uni-grid-item__content {
+		flex-direction: row
+	}
+
+	.uni-grid-item-oblong .uni-grid-item-image {
+		width: 52upx;
+		height: 52upx
+	}
+
+	.uni-grid-item-oblong .uni-grid-item-text {
+		margin-top: 0;
+		margin-left: 12upx
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-icon/uni-icon.vue b/components/uni-icon/uni-icon.vue
new file mode 100644
index 0000000..8f1fc99
--- /dev/null
+++ b/components/uni-icon/uni-icon.vue
@@ -0,0 +1,419 @@
+<template>
+	<view class="uni-icon" :class="'uni-icon-' + type" :style="{ color: color, 'font-size': size + 'px' }" @click="_onClick"></view>
+</template>
+
+<script>
+	export default {
+		name: 'uni-icon',
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: [Number, String],
+				default: 16
+			}
+		},
+		methods: {
+			_onClick() {
+				this.$emit('click');
+			}
+		}
+	};
+</script>
+
+<style>
+	@font-face {
+		font-family: uniicons;
+		font-weight: normal;
+		font-style: normal;
+		src: url(data:font/truetype;charset=utf-8;base64,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PDgtsDEssAAWILAJI0IgICBGI0ewACsjYTgtsDIssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDMssAAWILAJQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDQsIyAuRrACJUZSWCA8WS6xJAEUKy2wNSwjIC5GsAIlRlBYIDxZLrEkARQrLbA2LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEkARQrLbA3LLAuKyMgLkawAiVGUlggPFkusSQBFCstsDgssC8riiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSQBFCuwBEMusCQrLbA5LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEkARQrLbA6LLEJBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuw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AVkBWgFbAVwBXQd1bmlFMTAwB3VuaUUxMDEHdW5pRTEwMgd1bmlFMTMwB3VuaUUxMzEHdW5pRTEzMgd1bmlFMjAwB3VuaUUyMDEHdW5pRTIwMgd1bmlFMjAzB3VuaUUyMzAHdW5pRTIzMQd1bmlFMjMyB3VuaUUyMzMHdW5pRTI2MAd1bmlFMjYxB3VuaUUyNjIHdW5pRTI2Mwd1bmlFMjY0B3VuaUUzMDAHdW5pRTMwMQd1bmlFMzAyB3VuaUUzMDMHdW5pRTMzMgd1bmlFMzMzB3VuaUUzNjAHdW5pRTM2Mwd1bmlFMzY0B3VuaUU0MDAHdW5pRTQwMQd1bmlFNDAyB3VuaUU0MDMHdW5pRTQwNAd1bmlFNDA1B3VuaUU0MDYHdW5pRTQwNwd1bmlFNDA4B3VuaUU0MDkHdW5pRTQxMAd1bmlFNDExB3VuaUU0MTMHdW5pRTQzNAd1bmlFNDM3B3VuaUU0MzgHdW5pRTQzOQd1bmlFNDQwB3VuaUU0NDEHdW5pRTQ0Mgd1bmlFNDQzB3VuaUU0NjAHdW5pRTQ2MQd1bmlFNDYyB3VuaUU0NjMHdW5pRTQ2NAd1bmlFNDY1B3VuaUU0NjYHdW5pRTQ2OAd1bmlFNDcwB3VuaUU0NzEHdW5pRTQ3Mgd1bmlFNTAwB3VuaUU1MDEHdW5pRTUwMgd1bmlFNTAzB3VuaUU1MDQHdW5pRTUwNQd1bmlFNTA2B3VuaUU1MDcHdW5pRTUwOAd1bmlFNTMwB3VuaUU1MzIHdW5pRTUzNAd1bmlFNTM1B3VuaUU1MzcHdW5pRTU2MAd1bmlFNTYyB3VuaUU1NjMHdW5pRTU2NQd1bmlFNTY3B3VuaUU1NjgHdW5pRTU4MAd1bmlFNTgxB3VuaUU1ODIHdW5pRTU4Mwd1bmlFNTg0B3VuaUU1ODUHdW5pRTU4Ngd1bmlFNTg3B3VuaUU1ODgHdW5pRTU4OQRFdXJvBEV1cm8AAQAB//8ADwABAAAADAAAABYAAAACAAEAAQBfAAEABAAAAAIAAAAAAAAAAQAAAADVpCcIAAAAANJrTZkAAAAA2DhhuQ==) format('truetype');
+	}
+
+	/* uni-icon {
+		line-height: 1;
+	} */
+
+	.uni-icon {
+		font-family: uniicons;
+		font-weight: normal;
+		font-style: normal;
+		line-height: 1;
+		display: inline-block;
+		text-decoration: none;
+		-webkit-font-smoothing: antialiased;
+	}
+
+	.uni-icon.uni-active {
+		color: #007aff;
+	}
+
+	.uni-icon-contact:before {
+		content: '\e100';
+	}
+
+	.uni-icon-person:before {
+		content: '\e101';
+	}
+
+	.uni-icon-personadd:before {
+		content: '\e102';
+	}
+
+	.uni-icon-contact-filled:before {
+		content: '\e130';
+	}
+
+	.uni-icon-person-filled:before {
+		content: '\e131';
+	}
+
+	.uni-icon-personadd-filled:before {
+		content: '\e132';
+	}
+
+	.uni-icon-phone:before {
+		content: '\e200';
+	}
+
+	.uni-icon-email:before {
+		content: '\e201';
+	}
+
+	.uni-icon-chatbubble:before {
+		content: '\e202';
+	}
+
+	.uni-icon-chatboxes:before {
+		content: '\e203';
+	}
+
+	.uni-icon-phone-filled:before {
+		content: '\e230';
+	}
+
+	.uni-icon-email-filled:before {
+		content: '\e231';
+	}
+
+	.uni-icon-chatbubble-filled:before {
+		content: '\e232';
+	}
+
+	.uni-icon-chatboxes-filled:before {
+		content: '\e233';
+	}
+
+	.uni-icon-weibo:before {
+		content: '\e260';
+	}
+
+	.uni-icon-weixin:before {
+		content: '\e261';
+	}
+
+	.uni-icon-pengyouquan:before {
+		content: '\e262';
+	}
+
+	.uni-icon-chat:before {
+		content: '\e263';
+	}
+
+	.uni-icon-qq:before {
+		content: '\e264';
+	}
+
+	.uni-icon-videocam:before {
+		content: '\e300';
+	}
+
+	.uni-icon-camera:before {
+		content: '\e301';
+	}
+
+	.uni-icon-mic:before {
+		content: '\e302';
+	}
+
+	.uni-icon-location:before {
+		content: '\e303';
+	}
+
+	.uni-icon-mic-filled:before,
+	.uni-icon-speech:before {
+		content: '\e332';
+	}
+
+	.uni-icon-location-filled:before {
+		content: '\e333';
+	}
+
+	.uni-icon-micoff:before {
+		content: '\e360';
+	}
+
+	.uni-icon-image:before {
+		content: '\e363';
+	}
+
+	.uni-icon-map:before {
+		content: '\e364';
+	}
+
+	.uni-icon-compose:before {
+		content: '\e400';
+	}
+
+	.uni-icon-trash:before {
+		content: '\e401';
+	}
+
+	.uni-icon-upload:before {
+		content: '\e402';
+	}
+
+	.uni-icon-download:before {
+		content: '\e403';
+	}
+
+	.uni-icon-close:before {
+		content: '\e404';
+	}
+
+	.uni-icon-redo:before {
+		content: '\e405';
+	}
+
+	.uni-icon-undo:before {
+		content: '\e406';
+	}
+
+	.uni-icon-refresh:before {
+		content: '\e407';
+	}
+
+	.uni-icon-star:before {
+		content: '\e408';
+	}
+
+	.uni-icon-plus:before {
+		content: '\e409';
+	}
+
+	.uni-icon-minus:before {
+		content: '\e410';
+	}
+
+	.uni-icon-circle:before,
+	.uni-icon-checkbox:before {
+		content: '\e411';
+	}
+
+	.uni-icon-close-filled:before,
+	.uni-icon-clear:before {
+		content: '\e434';
+	}
+
+	.uni-icon-refresh-filled:before {
+		content: '\e437';
+	}
+
+	.uni-icon-star-filled:before {
+		content: '\e438';
+	}
+
+	.uni-icon-plus-filled:before {
+		content: '\e439';
+	}
+
+	.uni-icon-minus-filled:before {
+		content: '\e440';
+	}
+
+	.uni-icon-circle-filled:before {
+		content: '\e441';
+	}
+
+	.uni-icon-checkbox-filled:before {
+		content: '\e442';
+	}
+
+	.uni-icon-closeempty:before {
+		content: '\e460';
+	}
+
+	.uni-icon-refreshempty:before {
+		content: '\e461';
+	}
+
+	.uni-icon-reload:before {
+		content: '\e462';
+	}
+
+	.uni-icon-starhalf:before {
+		content: '\e463';
+	}
+
+	.uni-icon-spinner:before {
+		content: '\e464';
+	}
+
+	.uni-icon-spinner-cycle:before {
+		content: '\e465';
+	}
+
+	.uni-icon-search:before {
+		content: '\e466';
+	}
+
+	.uni-icon-plusempty:before {
+		content: '\e468';
+	}
+
+	.uni-icon-forward:before {
+		content: '\e470';
+	}
+
+	.uni-icon-back:before,
+	.uni-icon-left-nav:before {
+		content: '\e471';
+	}
+
+	.uni-icon-checkmarkempty:before {
+		content: '\e472';
+	}
+
+	.uni-icon-home:before {
+		content: '\e500';
+	}
+
+	.uni-icon-navigate:before {
+		content: '\e501';
+	}
+
+	.uni-icon-gear:before {
+		content: '\e502';
+	}
+
+	.uni-icon-paperplane:before {
+		content: '\e503';
+	}
+
+	.uni-icon-info:before {
+		content: '\e504';
+	}
+
+	.uni-icon-help:before {
+		content: '\e505';
+	}
+
+	.uni-icon-locked:before {
+		content: '\e506';
+	}
+
+	.uni-icon-more:before {
+		content: '\e507';
+	}
+
+	.uni-icon-flag:before {
+		content: '\e508';
+	}
+
+	.uni-icon-home-filled:before {
+		content: '\e530';
+	}
+
+	.uni-icon-gear-filled:before {
+		content: '\e532';
+	}
+
+	.uni-icon-info-filled:before {
+		content: '\e534';
+	}
+
+	.uni-icon-help-filled:before {
+		content: '\e535';
+	}
+
+	.uni-icon-more-filled:before {
+		content: '\e537';
+	}
+
+	.uni-icon-settings:before {
+		content: '\e560';
+	}
+
+	.uni-icon-list:before {
+		content: '\e562';
+	}
+
+	.uni-icon-bars:before {
+		content: '\e563';
+	}
+
+	.uni-icon-loop:before {
+		content: '\e565';
+	}
+
+	.uni-icon-paperclip:before {
+		content: '\e567';
+	}
+
+	.uni-icon-eye:before {
+		content: '\e568';
+	}
+
+	.uni-icon-arrowup:before {
+		content: '\e580';
+	}
+
+	.uni-icon-arrowdown:before {
+		content: '\e581';
+	}
+
+	.uni-icon-arrowleft:before {
+		content: '\e582';
+	}
+
+	.uni-icon-arrowright:before {
+		content: '\e583';
+	}
+
+	.uni-icon-arrowthinup:before {
+		content: '\e584';
+	}
+
+	.uni-icon-arrowthindown:before {
+		content: '\e585';
+	}
+
+	.uni-icon-arrowthinleft:before {
+		content: '\e586';
+	}
+
+	.uni-icon-arrowthinright:before {
+		content: '\e587';
+	}
+
+	.uni-icon-pulldown:before {
+		content: '\e588';
+	}
+
+	.uni-icon-closefill:before {
+		content: '\e589';
+	}
+
+	.uni-icon-sound:before {
+		content: '\e590';
+	}
+
+	.uni-icon-scan:before {
+		content: '\e612';
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-icons/uni-icons.vue b/components/uni-icons/uni-icons.vue
new file mode 100644
index 0000000..6d6ef78
--- /dev/null
+++ b/components/uni-icons/uni-icons.vue
@@ -0,0 +1,425 @@
+<template>
+  <view
+    :class="'uni-icon-' + type"
+    :style="{ color: color, 'font-size': size + 'px' }"
+    class="uni-icon"
+    @click="_onClick"
+  />
+</template>
+
+<script>
+export default {
+  name: 'UniIcons',
+  props: {
+    type: {
+      type: String,
+      default: ''
+    },
+    color: {
+      type: String,
+      default: '#333333'
+    },
+    size: {
+      type: [Number, String],
+      default: 16
+    }
+  },
+  methods: {
+    _onClick () {
+      this.$emit('click')
+    }
+  }
+}
+</script>
+
+<style>
+@font-face {
+	font-family: uniicons;
+	font-weight: normal;
+	font-style: normal;
+	src: url(data:font/truetype;charset=utf-8;base64,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PDgtsDEssAAWILAJI0IgICBGI0ewACsjYTgtsDIssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDMssAAWILAJQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDQsIyAuRrACJUZSWCA8WS6xJAEUKy2wNSwjIC5GsAIlRlBYIDxZLrEkARQrLbA2LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEkARQrLbA3LLAuKyMgLkawAiVGUlggPFkusSQBFCstsDgssC8riiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSQBFCuwBEMusCQrLbA5LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEkARQrLbA6LLEJBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuw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AVkBWgFbAVwBXQd1bmlFMTAwB3VuaUUxMDEHdW5pRTEwMgd1bmlFMTMwB3VuaUUxMzEHdW5pRTEzMgd1bmlFMjAwB3VuaUUyMDEHdW5pRTIwMgd1bmlFMjAzB3VuaUUyMzAHdW5pRTIzMQd1bmlFMjMyB3VuaUUyMzMHdW5pRTI2MAd1bmlFMjYxB3VuaUUyNjIHdW5pRTI2Mwd1bmlFMjY0B3VuaUUzMDAHdW5pRTMwMQd1bmlFMzAyB3VuaUUzMDMHdW5pRTMzMgd1bmlFMzMzB3VuaUUzNjAHdW5pRTM2Mwd1bmlFMzY0B3VuaUU0MDAHdW5pRTQwMQd1bmlFNDAyB3VuaUU0MDMHdW5pRTQwNAd1bmlFNDA1B3VuaUU0MDYHdW5pRTQwNwd1bmlFNDA4B3VuaUU0MDkHdW5pRTQxMAd1bmlFNDExB3VuaUU0MTMHdW5pRTQzNAd1bmlFNDM3B3VuaUU0MzgHdW5pRTQzOQd1bmlFNDQwB3VuaUU0NDEHdW5pRTQ0Mgd1bmlFNDQzB3VuaUU0NjAHdW5pRTQ2MQd1bmlFNDYyB3VuaUU0NjMHdW5pRTQ2NAd1bmlFNDY1B3VuaUU0NjYHdW5pRTQ2OAd1bmlFNDcwB3VuaUU0NzEHdW5pRTQ3Mgd1bmlFNTAwB3VuaUU1MDEHdW5pRTUwMgd1bmlFNTAzB3VuaUU1MDQHdW5pRTUwNQd1bmlFNTA2B3VuaUU1MDcHdW5pRTUwOAd1bmlFNTMwB3VuaUU1MzIHdW5pRTUzNAd1bmlFNTM1B3VuaUU1MzcHdW5pRTU2MAd1bmlFNTYyB3VuaUU1NjMHdW5pRTU2NQd1bmlFNTY3B3VuaUU1NjgHdW5pRTU4MAd1bmlFNTgxB3VuaUU1ODIHdW5pRTU4Mwd1bmlFNTg0B3VuaUU1ODUHdW5pRTU4Ngd1bmlFNTg3B3VuaUU1ODgHdW5pRTU4OQRFdXJvBEV1cm8AAQAB//8ADwABAAAADAAAABYAAAACAAEAAQBfAAEABAAAAAIAAAAAAAAAAQAAAADVpCcIAAAAANJrTZkAAAAA2DhhuQ==)
+		format('truetype');
+}
+
+.uni-icon-wrapper {
+	line-height: 1;
+}
+
+.uni-icon {
+	font-family: uniicons;
+	font-weight: normal;
+	font-style: normal;
+	line-height: 1;
+	display: inline-block;
+	text-decoration: none;
+	-webkit-font-smoothing: antialiased;
+}
+
+.uni-icon.uni-active {
+	color: #007aff;
+}
+
+.uni-icon-contact:before {
+	content: '\e100';
+}
+
+.uni-icon-person:before {
+	content: '\e101';
+}
+
+.uni-icon-personadd:before {
+	content: '\e102';
+}
+
+.uni-icon-contact-filled:before {
+	content: '\e130';
+}
+
+.uni-icon-person-filled:before {
+	content: '\e131';
+}
+
+.uni-icon-personadd-filled:before {
+	content: '\e132';
+}
+
+.uni-icon-phone:before {
+	content: '\e200';
+}
+
+.uni-icon-email:before {
+	content: '\e201';
+}
+
+.uni-icon-chatbubble:before {
+	content: '\e202';
+}
+
+.uni-icon-chatboxes:before {
+	content: '\e203';
+}
+
+.uni-icon-phone-filled:before {
+	content: '\e230';
+}
+
+.uni-icon-email-filled:before {
+	content: '\e231';
+}
+
+.uni-icon-chatbubble-filled:before {
+	content: '\e232';
+}
+
+.uni-icon-chatboxes-filled:before {
+	content: '\e233';
+}
+
+.uni-icon-weibo:before {
+	content: '\e260';
+}
+
+.uni-icon-weixin:before {
+	content: '\e261';
+}
+
+.uni-icon-pengyouquan:before {
+	content: '\e262';
+}
+
+.uni-icon-chat:before {
+	content: '\e263';
+}
+
+.uni-icon-qq:before {
+	content: '\e264';
+}
+
+.uni-icon-videocam:before {
+	content: '\e300';
+}
+
+.uni-icon-camera:before {
+	content: '\e301';
+}
+
+.uni-icon-mic:before {
+	content: '\e302';
+}
+
+.uni-icon-location:before {
+	content: '\e303';
+}
+
+.uni-icon-mic-filled:before,
+.uni-icon-speech:before {
+	content: '\e332';
+}
+
+.uni-icon-location-filled:before {
+	content: '\e333';
+}
+
+.uni-icon-micoff:before {
+	content: '\e360';
+}
+
+.uni-icon-image:before {
+	content: '\e363';
+}
+
+.uni-icon-map:before {
+	content: '\e364';
+}
+
+.uni-icon-compose:before {
+	content: '\e400';
+}
+
+.uni-icon-trash:before {
+	content: '\e401';
+}
+
+.uni-icon-upload:before {
+	content: '\e402';
+}
+
+.uni-icon-download:before {
+	content: '\e403';
+}
+
+.uni-icon-close:before {
+	content: '\e404';
+}
+
+.uni-icon-redo:before {
+	content: '\e405';
+}
+
+.uni-icon-undo:before {
+	content: '\e406';
+}
+
+.uni-icon-refresh:before {
+	content: '\e407';
+}
+
+.uni-icon-star:before {
+	content: '\e408';
+}
+
+.uni-icon-plus:before {
+	content: '\e409';
+}
+
+.uni-icon-minus:before {
+	content: '\e410';
+}
+
+.uni-icon-circle:before,
+.uni-icon-checkbox:before {
+	content: '\e411';
+}
+
+.uni-icon-close-filled:before,
+.uni-icon-clear:before {
+	content: '\e434';
+}
+
+.uni-icon-refresh-filled:before {
+	content: '\e437';
+}
+
+.uni-icon-star-filled:before {
+	content: '\e438';
+}
+
+.uni-icon-plus-filled:before {
+	content: '\e439';
+}
+
+.uni-icon-minus-filled:before {
+	content: '\e440';
+}
+
+.uni-icon-circle-filled:before {
+	content: '\e441';
+}
+
+.uni-icon-checkbox-filled:before {
+	content: '\e442';
+}
+
+.uni-icon-closeempty:before {
+	content: '\e460';
+}
+
+.uni-icon-refreshempty:before {
+	content: '\e461';
+}
+
+.uni-icon-reload:before {
+	content: '\e462';
+}
+
+.uni-icon-starhalf:before {
+	content: '\e463';
+}
+
+.uni-icon-spinner:before {
+	content: '\e464';
+}
+
+.uni-icon-spinner-cycle:before {
+	content: '\e465';
+}
+
+.uni-icon-search:before {
+	content: '\e466';
+}
+
+.uni-icon-plusempty:before {
+	content: '\e468';
+}
+
+.uni-icon-forward:before {
+	content: '\e470';
+}
+
+.uni-icon-back:before,
+.uni-icon-left-nav:before {
+	content: '\e471';
+}
+
+.uni-icon-checkmarkempty:before {
+	content: '\e472';
+}
+
+.uni-icon-home:before {
+	content: '\e500';
+}
+
+.uni-icon-navigate:before {
+	content: '\e501';
+}
+
+.uni-icon-gear:before {
+	content: '\e502';
+}
+
+.uni-icon-paperplane:before {
+	content: '\e503';
+}
+
+.uni-icon-info:before {
+	content: '\e504';
+}
+
+.uni-icon-help:before {
+	content: '\e505';
+}
+
+.uni-icon-locked:before {
+	content: '\e506';
+}
+
+.uni-icon-more:before {
+	content: '\e507';
+}
+
+.uni-icon-flag:before {
+	content: '\e508';
+}
+
+.uni-icon-home-filled:before {
+	content: '\e530';
+}
+
+.uni-icon-gear-filled:before {
+	content: '\e532';
+}
+
+.uni-icon-info-filled:before {
+	content: '\e534';
+}
+
+.uni-icon-help-filled:before {
+	content: '\e535';
+}
+
+.uni-icon-more-filled:before {
+	content: '\e537';
+}
+
+.uni-icon-settings:before {
+	content: '\e560';
+}
+
+.uni-icon-list:before {
+	content: '\e562';
+}
+
+.uni-icon-bars:before {
+	content: '\e563';
+}
+
+.uni-icon-loop:before {
+	content: '\e565';
+}
+
+.uni-icon-paperclip:before {
+	content: '\e567';
+}
+
+.uni-icon-eye:before {
+	content: '\e568';
+}
+
+.uni-icon-arrowup:before {
+	content: '\e580';
+}
+
+.uni-icon-arrowdown:before {
+	content: '\e581';
+}
+
+.uni-icon-arrowleft:before {
+	content: '\e582';
+}
+
+.uni-icon-arrowright:before {
+	content: '\e583';
+}
+
+.uni-icon-arrowthinup:before {
+	content: '\e584';
+}
+
+.uni-icon-arrowthindown:before {
+	content: '\e585';
+}
+
+.uni-icon-arrowthinleft:before {
+	content: '\e586';
+}
+
+.uni-icon-arrowthinright:before {
+	content: '\e587';
+}
+
+.uni-icon-pulldown:before {
+	content: '\e588';
+}
+
+.uni-icon-closefill:before {
+	content: '\e589';
+}
+
+.uni-icon-sound:before {
+	content: '\e590';
+}
+
+.uni-icon-scan:before {
+	content: '\e612';
+}
+</style>
diff --git a/components/uni-list-item/uni-list-item.vue b/components/uni-list-item/uni-list-item.vue
new file mode 100644
index 0000000..9fb7d55
--- /dev/null
+++ b/components/uni-list-item/uni-list-item.vue
@@ -0,0 +1,193 @@
+<template>
+	<view class="uni-list-item" :class="[disabled === true || disabled === 'true' ? 'uni-list-item--disabled' : '']" :hover-class="disabled === true || disabled === 'true' || showSwitch === true || showSwitch === 'true' ? '' : 'uni-list-item--hover'" @click="onClick">
+		<view class="uni-list-item__container">
+			<view class="uni-list-item__icon" v-if="thumb">
+				<image class="uni-list-item__icon-img" :src="thumb"></image>
+			</view>
+			<view class="uni-list-item__icon" v-else-if="showExtraIcon === true || showExtraIcon === 'true'">
+				<uni-icon :color="extraIcon.color" :size="extraIcon.size" :type="extraIcon.type"></uni-icon>
+			</view>
+			<view class="uni-list-item__content">
+				<view class="uni-list-item__content-title">{{title}}</view>
+				<view class="uni-list-item__content-note" v-if="note">{{note}}</view>
+			</view>
+			<view class="uni-list-item__extra" v-if="showBadge === true || showBadge === 'true' || showArrow === true || showArrow === 'true'||showSwitch === true || showSwitch === 'true'">
+				<uni-badge v-if="showBadge === true || showBadge === 'true'" :type="badgeType" :text="badgeText"></uni-badge>
+				<switch v-if="showSwitch === true || showSwitch === 'true'" :disabled='disabled' :checked="switchChecked" @change="onSwitchChange" />
+				<uni-icon v-if="showArrow === true || showArrow === 'true'" color="#bbb" size="20" type="arrowright"></uni-icon>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcon from '../uni-icon/uni-icon.vue'
+	import uniBadge from '../uni-badge/uni-badge.vue'
+	export default {
+		name: 'uni-list-item',
+		components: {
+			uniIcon,
+			uniBadge
+		},
+		data() {
+			return {
+
+			};
+		},
+		props: {
+			title: {
+				type: String,
+				default: ''
+			}, //列表标题
+			note: {
+				type: String,
+				default: ''
+			}, //列表描述
+			disabled: { //是否禁用
+				type: [Boolean, String],
+				default: false
+			},
+			showArrow: { //是否显示箭头
+				type: [Boolean, String],
+				default: true
+			},
+			showBadge: { //是否显示数字角标
+				type: [Boolean, String],
+				default: false
+			},
+			showSwitch: { //是否显示Switch
+				type: [Boolean, String],
+				default: false
+			},
+			switchChecked: { //Switch是否被选中
+				type: [Boolean, String],
+				default: false
+			},
+			badgeText: String, //badge内容
+			badgeType: { //badge类型
+				type: String,
+				default: 'success'
+			},
+			thumb: String, //缩略图
+			showExtraIcon: { //是否显示扩展图标
+				type: [Boolean, String],
+				default: false
+			},
+			extraIcon: {
+				type: Object,
+				default () {
+					return {
+						type: 'contact',
+						color: '#000000',
+						size: 20
+					};
+				}
+			}
+		},
+		methods: {
+			onClick() {
+				this.$emit('click')
+			},
+			onSwitchChange(e) {
+				this.$emit('switchChange', e.detail)
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-list-item {
+		font-size: 32upx;
+		position: relative;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		align-items: center
+	}
+
+	.uni-list-item--disabled {
+		opacity: .3
+	}
+
+	.uni-list-item--hover {
+		background-color: #f1f1f1
+	}
+
+	.uni-list-item__container {
+		padding: 24upx 30upx;
+		width: 100%;
+		box-sizing: border-box;
+		flex: 1;
+		position: relative;
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center
+	}
+
+	.uni-list-item__container:after {
+		position: absolute;
+		z-index: 3;
+		right: 0;
+		bottom: 0;
+		left: 30upx;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+
+	.uni-list-item__content {
+		flex: 1;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column
+	}
+
+	.uni-list-item__content-title {
+		font-size: 32upx;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		color: inherit;
+		line-height: 1.5;
+		overflow: hidden
+	}
+
+	.uni-list-item__content-note {
+		color: #999;
+		font-size: 28upx;
+		white-space: normal;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 2;
+		overflow: hidden
+	}
+
+	.uni-list-item__extra {
+		width: 25%;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-end;
+		align-items: center
+	}
+
+	.uni-list-item__icon {
+		margin-right: 18upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center
+	}
+
+	.uni-list-item__icon-img {
+		height: 52upx;
+		width: 52upx
+	}
+
+	.uni-list>.uni-list-item:last-child .uni-list-item-container:after {
+		height: 0
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-list/uni-list.vue b/components/uni-list/uni-list.vue
new file mode 100644
index 0000000..db4f9fd
--- /dev/null
+++ b/components/uni-list/uni-list.vue
@@ -0,0 +1,47 @@
+<template>
+	<view class="uni-list">
+		<slot></slot>
+	</view>
+</template>
+<script>
+	export default {
+		name: 'uni-list'
+	}
+</script>
+<style>
+	@charset "UTF-8";
+
+	.uni-list {
+		background-color: #fff;
+		position: relative;
+		width: 100%;
+		display: flex;
+		flex-direction: column
+	}
+
+	.uni-list:after {
+		position: absolute;
+		z-index: 10;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+
+	.uni-list:before {
+		position: absolute;
+		z-index: 10;
+		right: 0;
+		top: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: #c8c7cc
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-load-more/uni-load-more.vue b/components/uni-load-more/uni-load-more.vue
new file mode 100644
index 0000000..6c43365
--- /dev/null
+++ b/components/uni-load-more/uni-load-more.vue
@@ -0,0 +1,194 @@
+<template>
+	<view class="uni-load-more">
+		<view class="uni-load-more__img" v-show="status === 'loading' && showIcon">
+			<view class="load1">
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+			</view>
+			<view class="load2">
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+			</view>
+			<view class="load3">
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+				<view :style="{background:color}"></view>
+			</view>
+		</view>
+		<text class="uni-load-more__text" :style="{color:color}">{{status === 'more' ? contentText.contentdown : (status === 'loading' ? contentText.contentrefresh : contentText.contentnomore)}}</text>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "uni-load-more",
+		props: {
+			status: {
+				//上拉的状态:more-loading前;loading-loading中;noMore-没有更多了
+				type: String,
+				default: 'more'
+			},
+			showIcon: {
+				type: Boolean,
+				default: true
+			},
+			color: {
+				type: String,
+				default: "#777777"
+			},
+			contentText: {
+				type: Object,
+				default () {
+					return {
+						contentdown: "上拉显示更多",
+						contentrefresh: "正在加载...",
+						contentnomore: "没有更多数据了"
+					};
+				}
+			}
+		},
+		data() {
+			return {}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-load-more {
+		display: flex;
+		flex-direction: row;
+		height: 80upx;
+		align-items: center;
+		justify-content: center
+	}
+
+	.uni-load-more__text {
+		font-size: 28upx;
+		color: #999
+	}
+
+	.uni-load-more__img {
+		height: 24px;
+		width: 24px;
+		margin-right: 10px
+	}
+
+	.uni-load-more__img>view {
+		position: absolute
+	}
+
+	.uni-load-more__img>view view {
+		width: 6px;
+		height: 2px;
+		border-top-left-radius: 1px;
+		border-bottom-left-radius: 1px;
+		background: #999;
+		position: absolute;
+		opacity: .2;
+		transform-origin: 50%;
+		animation: load 1.56s ease infinite
+	}
+
+	.uni-load-more__img>view view:nth-child(1) {
+		transform: rotate(90deg);
+		top: 2px;
+		left: 9px
+	}
+
+	.uni-load-more__img>view view:nth-child(2) {
+		transform: rotate(180deg);
+		top: 11px;
+		right: 0
+	}
+
+	.uni-load-more__img>view view:nth-child(3) {
+		transform: rotate(270deg);
+		bottom: 2px;
+		left: 9px
+	}
+
+	.uni-load-more__img>view view:nth-child(4) {
+		top: 11px;
+		left: 0
+	}
+
+	.load1,
+	.load2,
+	.load3 {
+		height: 24px;
+		width: 24px
+	}
+
+	.load2 {
+		transform: rotate(30deg)
+	}
+
+	.load3 {
+		transform: rotate(60deg)
+	}
+
+	.load1 view:nth-child(1) {
+		animation-delay: 0s
+	}
+
+	.load2 view:nth-child(1) {
+		animation-delay: .13s
+	}
+
+	.load3 view:nth-child(1) {
+		animation-delay: .26s
+	}
+
+	.load1 view:nth-child(2) {
+		animation-delay: .39s
+	}
+
+	.load2 view:nth-child(2) {
+		animation-delay: .52s
+	}
+
+	.load3 view:nth-child(2) {
+		animation-delay: .65s
+	}
+
+	.load1 view:nth-child(3) {
+		animation-delay: .78s
+	}
+
+	.load2 view:nth-child(3) {
+		animation-delay: .91s
+	}
+
+	.load3 view:nth-child(3) {
+		animation-delay: 1.04s
+	}
+
+	.load1 view:nth-child(4) {
+		animation-delay: 1.17s
+	}
+
+	.load2 view:nth-child(4) {
+		animation-delay: 1.3s
+	}
+
+	.load3 view:nth-child(4) {
+		animation-delay: 1.43s
+	}
+
+	@-webkit-keyframes load {
+		0% {
+			opacity: 1
+		}
+
+		100% {
+			opacity: .2
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-notice-bar/uni-notice-bar.vue b/components/uni-notice-bar/uni-notice-bar.vue
new file mode 100644
index 0000000..ec997b8
--- /dev/null
+++ b/components/uni-notice-bar/uni-notice-bar.vue
@@ -0,0 +1,258 @@
+<template>
+  <view
+    v-if="show"
+    :style="{ backgroundColor: backgroundColor, color: color }"
+    class="uni-noticebar"
+    @click="onClick">
+    <view
+      v-if="showClose === 'true' || showClose === true"
+      class="uni-noticebar__close"><uni-icons
+        type="closefill"
+        size="12" /></view>
+    <view
+      :class="{ 'uni-noticebar--flex': scrollable || single || moreText }"
+      class="uni-noticebar__content">
+      <view
+        v-if="showIcon === 'true' || showIcon === true"
+        :style="{ backgroundColor: backgroundColor, color: color }"
+        class="uni-noticebar__content-icon">
+        <uni-icons
+          :color="color"
+          type="sound"
+          size="14" />
+      </view>
+      <view
+        :class="{ 'uni-noticebar--scrollable': scrollable, 'uni-noticebar--single': !scrollable && (single || moreText) }"
+        class="uni-noticebar__content-text">
+        <view
+          :id="elId"
+          :style="{ animation: animation, '-webkit-animation': animation }"
+          class="uni-noticebar__content-inner">{{ text }}</view>
+      </view>
+      <view
+        v-if="showGetMore === 'true' || showGetMore === true"
+        :style="{ width: moreText ? '180upx' : '20px' }"
+        class="uni-noticebar__content-more"
+        @click="clickMore">
+        <view
+          v-if="moreText"
+          class="uni-noticebar__content-more-text">{{ moreText }}</view>
+        <uni-icons
+          type="arrowright"
+          size="14" />
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import uniIcons from '../uni-icons/uni-icons.vue'
+export default {
+  name: 'UniNoticeBar',
+  components: {
+    uniIcons
+  },
+  props: {
+    text: {
+      type: String,
+      default: ''
+    },
+    moreText: {
+      type: String,
+      default: ''
+    },
+    backgroundColor: {
+      type: String,
+      default: '#fffbe8'
+    },
+    speed: {
+      // 默认1s滚动100px
+      type: [String, Number],
+      default: 100
+    },
+    color: {
+      type: String,
+      default: '#de8c17'
+    },
+    single: {
+      // 是否单行
+      type: [String, Boolean],
+      default: false
+    },
+    scrollable: {
+      // 是否滚动,添加后控制单行效果取消
+      type: [String, Boolean],
+      default: false
+    },
+    showIcon: {
+      // 是否显示左侧icon
+      type: [String, Boolean],
+      default: false
+    },
+    showGetMore: {
+      // 是否显示右侧查看更多
+      type: [String, Boolean],
+      default: false
+    },
+    showClose: {
+      // 是否显示左侧关闭按钮
+      type: [String, Boolean],
+      default: false
+    }
+  },
+  data () {
+    const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+    return {
+      elId: elId,
+      show: true,
+      animation: ''
+    }
+  },
+  watch: {
+    text (newValue, oldValue) {
+      this.$nextTick(() => {
+        setTimeout(this.setAnimation, 200)
+      })
+    }
+  },
+  // #ifdef H5
+  mounted () {
+    this.setAnimation()
+  },
+  // #endif
+  // #ifndef H5
+  onReady () {
+    this.setAnimation()
+  },
+  // #endif
+  methods: {
+    clickMore () {
+      this.$emit('getmore')
+    },
+    onClick (e) {
+      let clientX = e.touches ? (e.touches[0] ? e.touches[0].clientX : e.changedTouches[0].clientX) : e.detail.clientX
+      if (uni.upx2px(48) + 12 > clientX && String(this.showClose) === 'true') {
+        this.show = false
+        this.$emit('close')
+      }
+      this.$emit('click')
+    },
+    setAnimation () {
+      if (this.scrollable === false || this.scrollable === 'false') {
+        return
+      }
+      // #ifdef MP-TOUTIAO
+      setTimeout(() => {
+        uni.createSelectorQuery()
+          .in(this)
+          .select(`#${this.elId}`)
+          .boundingClientRect()
+          .exec(ret => {
+            this.animation = `notice ${ret[0].width / this.speed}s linear infinite both`
+          })
+      }, 200)
+      // #endif
+      // #ifndef MP-TOUTIAO
+      uni.createSelectorQuery()
+        .in(this)
+        .select(`#${this.elId}`)
+        .boundingClientRect()
+        .exec(ret => {
+          this.animation = `notice ${ret[0].width / this.speed}s linear infinite both`
+        })
+      // #endif
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+@mixin flex-row-center {
+	display: flex;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+
+.uni-noticebar {
+	padding: 12upx 24upx;
+	font-size: $uni-font-size-sm;
+	line-height: 1.5;
+	margin-bottom: 20upx;
+	@include flex-row-center;
+	justify-content: left;
+
+	&__close {
+		color: $uni-text-color-grey;
+		margin-right: 24upx;
+		@include flex-row-center;
+	}
+
+	&__content {
+		flex: 1;
+		overflow: hidden;
+
+		&.uni-noticebar--flex {
+			flex: 1;
+			display: flex;
+			flex-direction: row;
+		}
+
+		&-icon {
+			display: inline-block;
+			z-index: 1;
+			padding-right: 12upx;
+		}
+
+		&-more {
+			width: 180upx;
+			@include flex-row-center;
+			justify-content: flex-end;
+			word-break: keep-all;
+			margin-left: 10upx;
+			color: $uni-text-color-grey;
+
+			&-text {
+				font-size: $uni-font-size-sm;
+				white-space: nowrap;
+			}
+		}
+
+		&-text {
+			word-break: break-all;
+			line-height: 1.5;
+			display: inline;
+
+			&.uni-noticebar--single {
+				text-overflow: ellipsis;
+				white-space: nowrap;
+				overflow: hidden;
+			}
+
+			&.uni-noticebar--scrollable {
+				flex: 1;
+				display: block;
+				overflow: hidden;
+
+				.uni-noticebar__content-inner {
+					padding-left: 100%;
+					white-space: nowrap;
+					display: inline-block;
+					transform: translateZ(0);
+				}
+			}
+		}
+
+		&-inner {
+			font-size: $uni-font-size-sm;
+			display: inline;
+		}
+	}
+}
+
+@keyframes notice {
+	100% {
+		transform: translate3d(-100%, 0, 0);
+	}
+}
+</style>
diff --git a/components/uni-number-box/uni-number-box.vue b/components/uni-number-box/uni-number-box.vue
new file mode 100644
index 0000000..f27c06f
--- /dev/null
+++ b/components/uni-number-box/uni-number-box.vue
@@ -0,0 +1,167 @@
+<template>
+	<view class="uni-numbox">
+		<view class="uni-numbox__minus" :class="{'uni-numbox--disabled': inputValue <= min || disabled}" @click="_calcValue('minus')">-</view>
+		<input class="uni-numbox__value" type="number" :disabled="disabled" v-model="inputValue" @blur="_onBlur">
+		<view class="uni-numbox__plus" :class="{'uni-numbox--disabled': inputValue >= max || disabled}" @click="_calcValue('plus')">+</view>
+	</view>
+</template>
+<script>
+	export default {
+		name: 'uni-number-box',
+		props: {
+			value: {
+				type: [Number, String],
+				default: 1
+			},
+			min: {
+				type: Number,
+				default: 0
+			},
+			max: {
+				type: Number,
+				default: 100
+			},
+			step: {
+				type: Number,
+				default: 1
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				inputValue: 0
+			}
+		},
+		watch: {
+			value(val) {
+				this.inputValue = +val;
+			},
+			inputValue(newVal, oldVal) {
+				if (+newVal !== +oldVal) {
+					this.$emit('change', newVal);
+				}
+			}
+		},
+		methods: {
+			_calcValue(type) {
+				if (this.disabled) {
+					return
+				}
+				const scale = this._getDecimalScale()
+				let value = this.inputValue * scale
+				let step = this.step * scale
+				if (type === 'minus') {
+					value -= step
+				} else if (type === 'plus') {
+					value += step
+				}
+				if (value < this.min || value > this.max) {
+					return
+				}
+				this.inputValue = value / scale;
+			},
+			_getDecimalScale() {
+				let scale = 1
+				// 浮点型
+				if (~~this.step !== this.step) {
+					scale = Math.pow(10, (this.step + '').split('.')[1].length)
+				}
+				return scale
+			},
+			_onBlur(event) {
+				let value = event.detail.value
+				if (!value) {
+					this.inputValue = 0
+					return
+				}
+				value = +value;
+				if (value > this.max) {
+					value = this.max
+				} else if (value < this.min) {
+					value = this.min
+				}
+				this.inputValue = value
+			}
+		},
+		created() {
+			this.inputValue = +this.value;
+		}
+	}
+</script>
+<style>
+	@charset "UTF-8";
+
+	.uni-numbox {
+		display: inline-flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		height: 70upx;
+		position: relative
+	}
+
+	.uni-numbox:after {
+		content: '';
+		position: absolute;
+		transform-origin: center;
+		box-sizing: border-box;
+		pointer-events: none;
+		top: -50%;
+		left: -50%;
+		right: -50%;
+		bottom: -50%;
+		border: 1px solid #c8c7cc;
+		border-radius: 12upx;
+		transform: scale(.5)
+	}
+
+	.uni-numbox__minus,
+	.uni-numbox__plus {
+		margin: 0;
+		background-color: #f8f8f8;
+		width: 70upx;
+		font-size: 40upx;
+		height: 100%;
+		line-height: 70upx;
+		text-align: center;
+		display: inline-flex;
+		align-items: center;
+		justify-content: center;
+		color: #333;
+		position: relative
+	}
+
+	.uni-numbox__value {
+		position: relative;
+		background-color: #fff;
+		width: 80upx;
+		height: 100%;
+		text-align: center;
+		padding: 0
+	}
+
+	.uni-numbox__value:after {
+		content: '';
+		position: absolute;
+		transform-origin: center;
+		box-sizing: border-box;
+		pointer-events: none;
+		top: -50%;
+		left: -50%;
+		right: -50%;
+		bottom: -50%;
+		border-style: solid;
+		border-color: #c8c7cc;
+		border-left-width: 1px;
+		border-right-width: 1px;
+		border-top-width: 0;
+		border-bottom-width: 0;
+		transform: scale(.5)
+	}
+
+	.uni-numbox--disabled {
+		color: silver
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-pagination/uni-pagination.vue b/components/uni-pagination/uni-pagination.vue
new file mode 100644
index 0000000..ff98598
--- /dev/null
+++ b/components/uni-pagination/uni-pagination.vue
@@ -0,0 +1,183 @@
+<template>
+	<view class="uni-pagination">
+		<view class="uni-pagination__btns">
+			<view @click="clickLeft" :class="['uni-pagination__btn',{'uni-pagination--disabled':currentIndex === 1}]" :hover-class="currentIndex === 1 ? '' : 'uni-pagination--hover'" :hover-start-time="20" :hover-stay-time="70">
+				<template v-if="showIcon===true || showIcon === 'true'">
+					<uni-icon color="#000" size="20" type="arrowleft"></uni-icon>
+				</template>
+				<template v-else>
+					{{prevText}}
+				</template>
+			</view>
+			<view @click="clickRight" :class="['uni-pagination__btn',{'uni-pagination--disabled':currentIndex === maxPage}]" :hover-class="currentIndex === maxPage ? '' : 'uni-pagination--hover'" :hover-start-time="20" :hover-stay-time="70">
+				<template v-if="showIcon===true || showIcon === 'true'">
+					<uni-icon color="#000" size="20" type="arrowright"></uni-icon>
+				</template>
+				<template v-else>
+					{{nextText}}
+				</template>
+			</view>
+		</view>
+		<view class="uni-pagination__num">
+			<text class="uni-pagination__num-current">{{currentIndex}}</text>/{{maxPage}}
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcon from '../uni-icon/uni-icon.vue'
+	export default {
+		name: 'uni-pagination',
+		components: {
+			uniIcon
+		},
+		props: {
+			prevText: {
+				type: String,
+				default: '上一页'
+			},
+			nextText: {
+				type: String,
+				default: '下一页'
+			},
+			current: {
+				type: [Number, String],
+				default: 1
+			},
+			total: { //数据总量
+				type: [Number, String],
+				default: 0
+			},
+			pageSize: { //每页数据量
+				type: [Number, String],
+				default: 10
+			},
+			showIcon: { //是否以 icon 形式展示按钮
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		watch: {
+			current(val) {
+				this.currentIndex = +val
+			}
+		},
+		data() {
+			return {
+				currentIndex: 1
+			}
+		},
+		computed: {
+			maxPage() {
+				let maxPage = 1
+				let total = Number(this.total)
+				let pageSize = Number(this.pageSize)
+				if (total && pageSize) {
+					maxPage = Math.ceil(total / pageSize)
+				}
+				return maxPage
+			}
+		},
+		methods: {
+			clickLeft() {
+				if (Number(this.currentIndex) === 1) {
+					return
+				}
+				this.currentIndex -= 1
+				this.change('prev')
+			},
+			clickRight() {
+				if (Number(this.currentIndex) === this.maxPage) {
+					return
+				}
+				this.currentIndex += 1
+				this.change('next')
+			},
+			change(e) {
+				this.$emit('change', {
+					type: e,
+					current: this.currentIndex
+				})
+			}
+		},
+		created() {
+			this.currentIndex = +this.current;
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-pagination {
+		width: 100%;
+		box-sizing: border-box;
+		padding: 0 40upx;
+		position: relative;
+		overflow: hidden;
+		display: flex;
+		flex-direction: row
+	}
+
+	.uni-pagination__btns {
+		flex: 1;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		flex-direction: row
+	}
+
+	.uni-pagination__btn {
+		width: 120upx;
+		height: 60upx;
+		padding: 0 16upx;
+		line-height: 60upx;
+		font-size: 28upx;
+		box-sizing: border-box;
+		position: relative;
+		background-color: #f8f8f8;
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center
+	}
+
+	.uni-pagination__btn:after {
+		content: "";
+		width: 200%;
+		height: 200%;
+		position: absolute;
+		top: 0;
+		left: 0;
+		border: 1px solid #c8c7cc;
+		transform: scale(.5);
+		transform-origin: 0 0;
+		box-sizing: border-box;
+		border-radius: 12upx
+	}
+
+	.uni-pagination__num {
+		width: 100upx;
+		height: 60upx;
+		line-height: 60upx;
+		font-size: 28upx;
+		color: #333;
+		position: absolute;
+		left: 50%;
+		top: 0;
+		transform: translateX(-50%)
+	}
+
+	.uni-pagination__num-current {
+		color: #007aff
+	}
+
+	.uni-pagination--disabled {
+		opacity: .3
+	}
+
+	.uni-pagination--hover {
+		color: rgba(0, 0, 0, .6);
+		background-color: #f1f1f1
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-popup/uni-popup.vue b/components/uni-popup/uni-popup.vue
new file mode 100644
index 0000000..b36fb3c
--- /dev/null
+++ b/components/uni-popup/uni-popup.vue
@@ -0,0 +1,190 @@
+<template>
+	<view class="full-width">
+		<view class="uni-mask" v-show="show" :style="{ top: offsetTop + 'px' }" @click="hide" @touchmove.stop.prevent="moveHandle"></view>
+		<view class="uni-popup" :class="'uni-popup-' + position + ' ' + 'uni-popup-' + mode" v-show="show">
+			{{ msg }}
+			<slot></slot>
+			<view v-if="position === 'middle' && mode === 'insert'" class=" uni-icon uni-icon-close" :class="{
+					'uni-close-bottom': buttonMode === 'bottom',
+					'uni-close-right': buttonMode === 'right'
+				}" @click="closeMask"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'uni-popup',
+		props: {
+			/**
+			 * 页面显示
+			 */
+			show: {
+				type: Boolean,
+				default: false
+			},
+			/**
+			 * 对齐方式
+			 */
+			position: {
+				type: String,
+				//top - 顶部, middle - 居中, bottom - 底部
+				default: 'middle'
+			},
+			/**
+			 * 显示模式
+			 */
+			mode: {
+				type: String,
+				default: 'insert'
+			},
+			/**
+			 * 额外信息
+			 */
+			msg: {
+				type: String,
+				default: ''
+			},
+			/**
+			 * h5遮罩是否到顶
+			 */
+			h5Top: {
+				type: Boolean,
+				default: false
+			},
+			buttonMode: {
+				type: String,
+				default: 'bottom'
+			}
+		},
+		data() {
+			return {
+				offsetTop: 0
+			};
+		},
+		watch: {
+			h5Top(newVal) {
+				if (newVal) {
+					this.offsetTop = 44;
+				} else {
+					this.offsetTop = 0;
+				}
+			}
+		},
+		methods: {
+			hide() {
+				if (this.mode === 'insert' && this.position === 'middle') return;
+				this.$emit('hidePopup');
+			},
+			closeMask() {
+				if (this.mode === 'insert') {
+					this.$emit('hidePopup');
+				}
+			},
+			moveHandle() {}
+		},
+		created() {
+			let offsetTop = 0;
+			//#ifdef H5
+			if (!this.h5Top) {
+				offsetTop = 44;
+			} else {
+				offsetTop = 0;
+			}
+			//#endif
+			this.offsetTop = offsetTop;
+		}
+	};
+</script>
+<style>
+	.uni-mask {
+		position: fixed;
+		z-index: 998;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		background-color: rgba(0, 0, 0, 0.3);
+	}
+
+	.uni-popup {
+		position: absolute;
+		z-index: 999;
+		background-color: #ffffff;
+	}
+
+	.uni-popup-middle {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
+
+	.uni-popup-middle.uni-popup-insert {
+		min-height: 380upx;
+		max-height: 80%;
+		transform: translate(-50%, -65%);
+		background: none;
+		box-shadow: none;
+	}
+
+	.uni-popup-middle.uni-popup-fixed {
+		border-radius: 10upx;
+		padding: 30upx;
+	}
+
+	.uni-close-bottom,
+	.uni-close-right {
+		position: absolute;
+		bottom: -180upx;
+		text-align: center;
+		border-radius: 50%;
+		color: #f5f5f5;
+		font-size: 60upx;
+		font-weight: bold;
+		opacity: 0.8;
+		z-index: -1;
+	}
+
+	.uni-close-bottom {
+		margin: auto;
+		left: 0;
+		right: 0;
+	}
+
+	.uni-close-right {
+		right: -60upx;
+		top: -80upx;
+	}
+
+	.uni-close-bottom:after {
+		content: '';
+		position: absolute;
+		width: 0px;
+		border: 1px #f5f5f5 solid;
+		top: -200upx;
+		bottom: 56upx;
+		left: 50%;
+		transform: translate(-50%, -0%);
+		opacity: 0.8;
+	}
+
+	.uni-popup-top {
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100upx;
+		line-height: 100upx;
+		text-align: center;
+	}
+
+	.uni-popup-bottom {
+		left: 0;
+		bottom: 0;
+		width: 100%;
+		min-height: 100upx;
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-rate/uni-rate.vue b/components/uni-rate/uni-rate.vue
new file mode 100644
index 0000000..53686a1
--- /dev/null
+++ b/components/uni-rate/uni-rate.vue
@@ -0,0 +1,131 @@
+<template>
+	<view class="uni-rate">
+		<view class="uni-rate-icon" v-for="(star, index) in stars" :key="index" :style="{ marginLeft: margin + 'px' }" @click="_onClick(index)">
+			<uni-icon :size="size" :color="color" :type="isFill ? 'star-filled' : 'star'"></uni-icon>
+			<view class="uni-rate-icon-on" :style="{ width: star.activeWitch }">
+				<uni-icon :size="size" :color="activeColor" type="star-filled"></uni-icon>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcon from '../uni-icon/uni-icon.vue';
+	export default {
+		name: 'uni-rate',
+		components: {
+			uniIcon
+		},
+		props: {
+			isFill: {
+				//星星的类型,是否镂空
+				type: [Boolean, String],
+				default: true
+			},
+			color: {
+				//星星的颜色
+				type: String,
+				default: '#ececec'
+			},
+			activeColor: {
+				//星星选中状态颜色
+				type: String,
+				default: '#ffca3e'
+			},
+			size: {
+				//星星的大小
+				type: [Number, String],
+				default: 24
+			},
+			value: {
+				//当前评分
+				type: [Number, String],
+				default: 0
+			},
+			max: {
+				//最大评分
+				type: [Number, String],
+				default: 5
+			},
+			margin: {
+				//星星的间距
+				type: [Number, String],
+				default: 0
+			},
+			disabled: {
+				//是否可点击
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		data() {
+			return {
+				valueSync: ''
+			};
+		},
+		computed: {
+			stars() {
+				const value = Number(this.valueSync) ? Number(this.valueSync) : 0;
+				const starList = [];
+				const floorValue = Math.floor(value);
+				const ceilValue = Math.ceil(value);
+				for (let i = 0; i < this.max; i++) {
+					if (floorValue > i) {
+						starList.push({
+							activeWitch: '100%'
+						});
+					} else if (ceilValue - 1 === i) {
+						starList.push({
+							activeWitch: (value - floorValue) * 100 + '%'
+						});
+					} else {
+						starList.push({
+							activeWitch: '0'
+						});
+					}
+				}
+				return starList;
+			}
+		},
+		methods: {
+			_onClick(index) {
+				if (this.disabled) {
+					return;
+				}
+				this.valueSync = index + 1;
+				this.$emit('change', {
+					value: this.valueSync
+				});
+			}
+		},
+		created() {
+			this.valueSync = this.value;
+		}
+	};
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-rate {
+		line-height: 0;
+		font-size: 0;
+		display: flex;
+		flex-direction: row
+	}
+
+	.uni-rate-icon {
+		position: relative;
+		line-height: 0;
+		font-size: 0;
+		display: inline-block
+	}
+
+	.uni-rate-icon-on {
+		line-height: 1;
+		position: absolute;
+		top: 0;
+		left: 0;
+		overflow: hidden
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-status-bar/uni-status-bar.vue b/components/uni-status-bar/uni-status-bar.vue
new file mode 100644
index 0000000..06f57a3
--- /dev/null
+++ b/components/uni-status-bar/uni-status-bar.vue
@@ -0,0 +1,26 @@
+<template>
+	<view class="uni-status-bar" :style="{ height: statusBarHeight }">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	var statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px';
+	export default {
+		name: 'uni-status-bar',
+		data() {
+			return {
+				statusBarHeight: statusBarHeight
+			};
+		}
+	};
+</script>
+
+<style>
+	.uni-status-bar {
+		display: block;
+		width: 100%;
+		height: 20px;
+		height: var(--status-bar-height);
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-steps/uni-steps.vue b/components/uni-steps/uni-steps.vue
new file mode 100644
index 0000000..573ffee
--- /dev/null
+++ b/components/uni-steps/uni-steps.vue
@@ -0,0 +1,218 @@
+<template>
+	<view class="uni-steps">
+		<view class="uni-steps-items" :class="'uni-steps-' + direction">
+			<view class="uni-steps-item" v-for="(item,index) in options" :key="index" :class="{'uni-steps-process':index === active,'uni-steps-finish':index < active}">
+				<view class="uni-steps-item-title-container" :style="{color:index === active ? activeColor : ''}">
+					<view class="uni-steps-item-title">{{ item.title }}</view>
+					<view class="uni-steps-item-desc" v-if="item.desc">{{ item.desc}}</view>
+				</view>
+				<view class="uni-steps-item-circle-container">
+					<view class="uni-steps-item-circle" v-if="index !== active" :style="{backgroundColor:index < active ? activeColor : ''}"></view>
+					<uni-icon v-else type="checkbox-filled" size="14" :color="activeColor"></uni-icon>
+				</view>
+				<view class="uni-steps-item-line" v-if="index !== options.length-1" :style="{backgroundColor:index < active ? activeColor : ''}"></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcon from '../uni-icon/uni-icon.vue'
+	export default {
+		name: "uni-steps",
+		components: {
+			uniIcon
+		},
+		props: {
+			direction: { //排列方向 row column
+				type: String,
+				default: 'row'
+			},
+			activeColor: { //激活状态颜色
+				type: String,
+				default: '#1aad19'
+			},
+			active: { //当前步骤
+				type: Number,
+				default: 0
+			},
+			options: Array //数据
+		},
+		data() {
+			return {}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-steps {
+		width: 100%;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+		overflow: hidden;
+		position: relative
+	}
+
+	.uni-steps-items {
+		position: relative;
+		display: flex;
+		flex-direction: row;
+		margin: 10px;
+		box-sizing: border-box;
+		overflow: hidden
+	}
+
+	.uni-steps-items.uni-steps-column {
+		margin: 10px 0;
+		padding-left: 31px;
+		flex-direction: column
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item:after {
+		content: ' ';
+		position: absolute;
+		height: 1px;
+		width: 100%;
+		bottom: 9px;
+		left: 0;
+		background-color: #ebedf0;
+		transform: scaleY(.5)
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item:last-child {
+		position: relative
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item:last-child:after {
+		height: 0
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item:last-child .uni-steps-item-title-container {
+		text-align: left
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item:last-child .uni-steps-item-circle-container {
+		left: -17px;
+		right: auto
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item-title-container {
+		transform: none;
+		display: block;
+		line-height: 36upx
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item-title {
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		overflow: hidden
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item-desc {
+		white-space: normal;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 2;
+		overflow: hidden
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item-circle-container {
+		left: -17px;
+		top: -1px;
+		bottom: auto;
+		padding: 8px 0;
+		z-index: 1
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item-line {
+		height: 100%;
+		width: 1px;
+		left: -15px;
+		top: -1px;
+		bottom: auto
+	}
+
+	.uni-steps-items.uni-steps-column .uni-steps-item.uni-steps-process .uni-steps-item-circle-container {
+		bottom: auto;
+		left: -21px
+	}
+
+	.uni-steps-item {
+		flex: 1;
+		position: relative;
+		padding-bottom: 18px
+	}
+
+	.uni-steps-item-title-container {
+		text-align: left;
+		margin-left: 3px;
+		display: inline-block;
+		transform: translateX(-50%);
+		color: #999
+	}
+
+	.uni-steps-item-title {
+		font-size: 28upx
+	}
+
+	.uni-steps-item-desc {
+		font-size: 24upx
+	}
+
+	.uni-steps-item:first-child .uni-steps-item-title-container {
+		transform: none;
+		margin-left: 0
+	}
+
+	.uni-steps-item:last-child {
+		position: absolute;
+		right: 0
+	}
+
+	.uni-steps-item:last-child .uni-steps-item-title-container {
+		transform: none;
+		text-align: right
+	}
+
+	.uni-steps-item:last-child .uni-steps-item-circle-container {
+		left: auto;
+		right: -8px
+	}
+
+	.uni-steps-item-circle-container {
+		position: absolute;
+		bottom: 8px;
+		left: -8px;
+		padding: 0 8px;
+		background-color: #fff;
+		z-index: 1
+	}
+
+	.uni-steps-item-circle {
+		width: 5px;
+		height: 5px;
+		background-color: #999;
+		border-radius: 50%
+	}
+
+	.uni-steps-item-line {
+		background-color: #ebedf0;
+		position: absolute;
+		bottom: 10px;
+		left: 0;
+		width: 100%;
+		height: 1px
+	}
+
+	.uni-steps-item.uni-steps-finish .uni-steps-item-title-container {
+		color: #333
+	}
+
+	.uni-steps-item.uni-steps-process .uni-steps-item-circle-container {
+		bottom: 3px;
+		display: flex
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-swipe-action/uni-swipe-action.vue b/components/uni-swipe-action/uni-swipe-action.vue
new file mode 100644
index 0000000..d4b481a
--- /dev/null
+++ b/components/uni-swipe-action/uni-swipe-action.vue
@@ -0,0 +1,233 @@
+<template>
+	<view class="uni-swipe-action">
+		<view class="uni-swipe-action__container" :class="{'uni-swipe-action--show':isShowBtn}" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @touchcancel="touchEnd" @click="bindClickCont" :style="{'transform':transformX,'-webkit-transform':transformX}">
+			<view class="uni-swipe-action__content">
+				<slot></slot>
+			</view>
+			<view class="uni-swipe-action__btn-group" :id="elId">
+				<div v-for="(item,index) in options" :key="index" class="uni-swipe-action--btn" :style="{backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '28rpx',borderRadius: item.style && item.style.borderRadius ? item.style.borderRadius : '1rpx'}" @click="bindClickBtn(item,index)">
+					{{item.text}}
+				</div>
+			</view>
+		</view>
+		<view class="uni-swipe-action__mask" v-if="isShowBtn" @click="close" @touchmove.stop.prevent="close"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'uni-swipe-action',
+		props: {
+			isDrag: {
+				type: Boolean,
+				default: false
+			},
+			isOpened: {
+				type: Boolean,
+				default: false
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			autoClose: {
+				type: Boolean,
+				default: true
+			},
+			options: Array
+		},
+		watch: {
+			isOpened(newValue, oldValue) {
+				this.isShowBtn = newValue ? true : false;
+				this.endMove();
+			}
+		},
+		data() {
+			const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+			return {
+				elId: elId,
+				isShowBtn: false,
+				transformX: 'translateX(0px)'
+			}
+		},
+		created() {
+			this.direction = ''
+			this.startX = 0
+			this.startY = 0
+			this.btnGroupWidth = 0
+			this.isMoving = false
+			this.startTime = 0
+		},
+		// #ifdef H5
+		mounted() {
+			this.getSize()
+		},
+		// #endif
+		// #ifndef H5
+		onReady() {
+			this.getSize()
+		},
+		// #endif
+		methods: {
+			getSize() {
+				uni.createSelectorQuery().in(this).select(`#${this.elId}`).boundingClientRect().exec((ret) => {
+					this.btnGroupWidth = ret[0].width;
+				});
+				if (this.isOpened === true) {
+					this.isShowBtn = true;
+					this.endMove();
+				}
+			},
+			bindClickBtn(item, index) {
+				this.$emit('click', {
+					text: item.text,
+					style: item.style,
+					index: index
+				})
+			},
+			bindClickCont(e) {
+				if (this.isShowBtn && this.autoClose === true) {
+					this.isShowBtn = false;
+					this.endMove();
+				}
+			},
+			touchStart(event) {
+				this.startTime = event.timeStamp;
+				this.startX = event.touches[0].pageX;
+				this.startY = event.touches[0].pageY;
+			},
+			touchMove(event) {
+				if (this.direction === 'Y' || this.disabled === true) {
+					return;
+				}
+				var moveY = event.touches[0].pageY - this.startY,
+					moveX = event.touches[0].pageX - this.startX;
+				if (!this.isMoving && Math.abs(moveY) > Math.abs(moveX)) { //纵向滑动
+					this.direction = 'Y';
+					return;
+				}
+				this.direction = moveX > 0 ? 'right' : 'left';
+				this.isMoving = true;
+				if (this.isDrag) {
+					let movedLength = this.isShowBtn ? -this.btnGroupWidth : 0;
+					if (movedLength + moveX >= 0) {
+						this.transformX = `translateX(0px)`;
+						return;
+					}
+					if (-movedLength - moveX >= this.btnGroupWidth) {
+						this.transformX = `translateX(${-this.btnGroupWidth}px)`;
+						return;
+					}
+					if (movedLength - moveX > 0) {
+						this.transformX = `translateX(${moveX}px)`;
+					} else {
+						if (moveX >= -this.btnGroupWidth) {
+							this.transformX = `translateX(${moveX - this.btnGroupWidth}px)`;
+						}
+					}
+				}
+			},
+			touchEnd(event) {
+				this.isMoving = false;
+				if (this.direction !== 'right' && this.direction !== 'left') {
+					this.direction = '';
+					return;
+				}
+				if (this.isDrag) {
+					let movedLength = Math.abs(Number(this.transformX.slice(11, -3)));
+					let movedTime = event.timeStamp - this.startTime;
+					this.isShowBtn = movedLength >= this.btnGroupWidth / 2 ? true : false;
+					if (50 < movedTime && movedTime < 300 && movedLength > 20) { //在这个时间里面,且滑动了一定的距离
+						if (this.direction == 'right') {
+							this.isShowBtn = false
+						} else {
+							this.isShowBtn = true
+						}
+					}
+				} else {
+					if (this.direction == 'right') {
+						this.isShowBtn = false
+					} else {
+						this.isShowBtn = true
+					}
+				}
+
+				this.endMove()
+			},
+			endMove() {
+				if (this.direction === 'Y' || this.disabled === true) {
+					this.direction = '';
+					return;
+				}
+				if (this.isShowBtn) {
+					this.transformX = `translateX(${-this.btnGroupWidth}px)`;
+					this.$emit('opened');
+				} else {
+					this.transformX = 'translateX(0px)';
+					this.$emit('closed');
+				}
+				this.direction = '';
+			},
+			close() {
+				this.isShowBtn = false
+				this.endMove()
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-swipe-action {
+		width: 100%;
+		overflow: hidden
+	}
+
+	.uni-swipe-action__container {
+		position: relative;
+		color: #FF9900;
+		/* background-color: #fff; */
+		width: 200%;
+		display: flex;
+		flex-direction: row;
+		flex-wrap: wrap;
+		transition: transform 350ms cubic-bezier(.165, .84, .44, 1)
+	}
+
+	.uni-swipe-action__content {
+		width: 50%
+	}
+
+	.uni-swipe-action__btn-group {
+		display: flex;
+		flex-direction: row
+	}
+
+	.uni-swipe-action--show {
+		position: relative;
+		z-index: 1000
+	}
+
+	.uni-swipe-action--btn {
+		padding: 0 32upx;
+		color: #fff;
+		background-color: #c7c6cd;
+		font-size: 28upx;
+		display: inline-flex;
+		text-align: center;
+		flex-direction: row;
+		align-items: center
+	}
+
+	.uni-swipe-action__mask {
+		display: block;
+		opacity: 0;
+		position: fixed;
+		z-index: 999;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-swiper-dot/uni-swiper-dot.vue b/components/uni-swiper-dot/uni-swiper-dot.vue
new file mode 100644
index 0000000..64083b5
--- /dev/null
+++ b/components/uni-swiper-dot/uni-swiper-dot.vue
@@ -0,0 +1,158 @@
+<template>
+	<view class="uni-swiper__warp">
+		<slot></slot>
+		<view v-if="mode === 'default'" class="uni-swiper__dots-box" :style="{'bottom':dots.bottom + 'px'}">
+			<view class="uni-swiper__dots-item" v-for="(item,index) in info" :style="{
+				 'width': dots.width + 'px','height':dots.height +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}" :key="index"></view>
+		</view>
+		<view v-if="mode === 'long'" class="uni-swiper__dots-box" :style="{'bottom':dots.bottom + 'px'}">
+			<view class="uni-swiper__dots-item " v-for="(item,index) in info" :class="[index === current&&'uni-swiper__dots-long']" :style="{
+				 'width':(index === current? dots.width*3:dots.width ) + 'px','height':dots.height +'px' ,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}" :key="index"></view>
+		</view>
+		<view v-if="mode === 'nav'" class="uni-swiper__dots-box uni-swiper__dots-nav" :style="{'background-color':dotsStyles.backgroundColor}">
+			<view class="uni-swiper__dots-nav-item" :style="{'color':dotsStyles.color}">{{(current+1)+"/"+info.length}}
+				{{info[current][field]}}</view>
+		</view>
+		<view v-if="mode === 'indexes'" class="uni-swiper__dots-box" :style="{'bottom':dots.bottom + 'px'}">
+			<view class="uni-swiper__dots-item uni-swiper__dots-indexes" v-for="(item,index) in info" :style="{
+				 'width':dots.width + 'px','height':dots.height +'px' ,'color':index === current?dots.selectedColor:dots.color,'background-color':index !== current?dots.backgroundColor:dots.selectedBackgroundColor,'border':index !==current ? dots.border:dots.selectedBorder}" :key="index">{{index+1}}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'uni-swiper-dot',
+		props: {
+			info: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			current: {
+				info: Number,
+				default: 0
+			},
+			dotsStyles: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 类型 :default(默认) indexes long nav
+			mode: {
+				type: String,
+				default: 'default'
+			},
+			// 只在 nav 模式下生效,变量名称
+			field: {
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				dots: {
+					width: 8,
+					height: 8,
+					bottom: 10,
+					color: '#fff',
+					backgroundColor: 'rgba(0, 0, 0, .3)',
+					border: '1px rgba(0, 0, 0, .3) solid',
+					selectedBackgroundColor: '#333',
+					selectedBorder: '1px rgba(0, 0, 0, .9) solid'
+				}
+			};
+		},
+		created() {
+			if (this.mode === 'indexes') {
+				this.dots.width = 20
+				this.dots.height = 20
+			}
+			this.dots = Object.assign(this.dots, this.dotsStyles)
+		},
+		watch: {
+			dotsStyles(newVal) {
+				this.dots = Object.assign(this.dots, this.dotsStyles)
+			},
+			mode(newVal) {
+				if (newVal === 'indexes') {
+					this.dots.width = 20
+					this.dots.height = 20
+				} else {
+					this.dots.width = 8
+					this.dots.height = 8
+				}
+			}
+
+		}
+	}
+</script>
+
+<style>
+	.uni-swiper__warp {
+		position: relative;
+		width: 100%;
+		box-sizing: border-box;
+		overflow: hidden;
+	}
+
+	.uni-swiper__dots-box {
+		position: absolute;
+		bottom: 20upx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		box-sizing: box-sizing;
+		width: 100%;
+	}
+
+	.uni-swiper__dots-item {
+		flex-shrink: 0;
+		width: 16upx;
+		border-radius: 50%;
+		margin-left: 12upx;
+		background: rgba(0, 0, 0, .3);
+		transition: all 0.2s linear;
+	}
+
+	.uni-swiper__dots-item:first-child {
+		margin: 0;
+	}
+
+	.uni-swiper__dots-default {
+		border-radius: 50%;
+	}
+
+	.uni-swiper__dots-long {
+		border-radius: 100upx;
+	}
+
+	.uni-swiper__dots-nav {
+		bottom: 0;
+		height: 80upx;
+		justify-content: flex-start;
+		background: rgba(0, 0, 0, 0.2);
+		box-sizing: box-sizing;
+		overflow: hidden;
+	}
+
+	.uni-swiper__dots-nav-item {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		font-size: 28upx;
+		color: #fff;
+		box-sizing: box-sizing;
+		margin: 0 30upx;
+	}
+
+	.uni-swiper__dots-indexes {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		color: #fff;
+		font-size: 24upx;
+	}
+</style>
\ No newline at end of file
diff --git a/components/uni-tag/uni-tag.vue b/components/uni-tag/uni-tag.vue
new file mode 100644
index 0000000..46bda64
--- /dev/null
+++ b/components/uni-tag/uni-tag.vue
@@ -0,0 +1,135 @@
+<template>
+	<view class="uni-tag" v-if="text" :class="[disabled === true || disabled === 'true' ? 'uni-tag--disabled' : '',inverted === true || inverted === 'true' ? 'uni-tag--inverted' : '',circle === true || circle === 'true' ? 'uni-tag--circle' : '',mark === true || mark === 'true' ? 'uni-tag--mark' : '','uni-tag--'+size,'uni-tag--'+type]" @click="onClick()">{{text}}</view>
+</template>
+
+<script>
+	export default {
+		name: 'uni-tag',
+		props: {
+			type: { //标签类型default、primary、success、warning、danger、royal
+				type: String,
+				default: 'default'
+			},
+			size: { //标签大小 normal, small
+				type: String,
+				default: 'normal'
+			},
+			text: String, //标签内容
+			disabled: { //是否为禁用状态
+				type: [String, Boolean],
+				defalut: false
+			},
+			inverted: { //是否为空心
+				type: [String, Boolean],
+				defalut: false
+			},
+			circle: { //是否为圆角样式
+				type: [String, Boolean],
+				defalut: false
+			},
+			mark: { //是否为标记样式
+				type: [String, Boolean],
+				defalut: false
+			}
+		},
+		methods: {
+			onClick() {
+				if (this.disabled === true || this.disabled === 'true') {
+					return;
+				}
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style>
+	@charset "UTF-8";
+
+	.uni-tag {
+		box-sizing: border-box;
+		padding: 0 32upx;
+		height: 60upx;
+		line-height: calc(60upx - 2px);
+		font-size: 28upx;
+		display: inline-flex;
+		align-items: center;
+		color: #333;
+		border-radius: 6upx;
+		background-color: #f8f8f8;
+		border: 1px solid #f8f8f8
+	}
+
+	.uni-tag--circle {
+		border-radius: 30upx
+	}
+
+	.uni-tag--mark {
+		border-radius: 0 30upx 30upx 0
+	}
+
+	.uni-tag--disabled {
+		opacity: .5
+	}
+
+	.uni-tag--small {
+		height: 40upx;
+		padding: 0 16upx;
+		line-height: calc(40upx - 2px);
+		font-size: 24upx
+	}
+
+	.uni-tag--primary {
+		color: #fff;
+		background-color: #007aff;
+		border: 1px solid #007aff
+	}
+
+	.uni-tag--primary.uni-tag--inverted {
+		color: #007aff;
+		background-color: #fff;
+		border: 1px solid #007aff
+	}
+
+	.uni-tag--success {
+		color: #fff;
+		background-color: #4cd964;
+		border: 1px solid #4cd964
+	}
+
+	.uni-tag--success.uni-tag--inverted {
+		color: #4cd964;
+		background-color: #fff;
+		border: 1px solid #4cd964
+	}
+
+	.uni-tag--warning {
+		color: #fff;
+		background-color: #f0ad4e;
+		border: 1px solid #f0ad4e
+	}
+
+	.uni-tag--warning.uni-tag--inverted {
+		color: #f0ad4e;
+		background-color: #fff;
+		border: 1px solid #f0ad4e
+	}
+
+	.uni-tag--error {
+		color: #fff;
+		background-color: #dd524d;
+		border: 1px solid #dd524d
+	}
+
+	.uni-tag--error.uni-tag--inverted {
+		color: #dd524d;
+		background-color: #fff;
+		border: 1px solid #dd524d
+	}
+
+	.uni-tag--inverted {
+		color: #333;
+		background-color: #fff;
+		border: 1px solid #f8f8f8
+	}
+</style>
\ No newline at end of file
diff --git a/components/xing-refresh/xing-refresh.vue b/components/xing-refresh/xing-refresh.vue
new file mode 100644
index 0000000..9ebbf4a
--- /dev/null
+++ b/components/xing-refresh/xing-refresh.vue
@@ -0,0 +1,166 @@
+<template>
+	<view>
+		<movable-area :style="'height:' + scrollHeight + 'px;width:100%'">
+			<movable-view :style="'height:' + (topHeight + scrollHeight) + 'px;width:100%;z-index:3'" direction="vertical"
+			 :out-of-bounds="true" :disabled="!scrollmark || status == 3" :y="y" :damping="50" @touchstart="touchstart"
+			 @touchend="touchend" @change="change">
+				<view :style="'height:' + topHeight + 'px;position:relative'">
+					<slot name="top"></slot>
+				</view>
+				<scroll-view :style="'height:' + scrollHeight + 'px;'" :scroll-y="status !== 3" :scroll-with-animation="scrollAnimation"
+				 :scroll-top="top" @scroll="scroll" @scrolltolower="scrolltolower">
+					<view>
+						<slot name="content"></slot>
+						<template v-if="downLoading">
+							<slot name="bottom"></slot>
+						</template>
+					</view>
+				</scroll-view>
+			</movable-view>
+		</movable-area>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			downLoading: {
+				//控制下面下拉加载区的显示 , 默认关闭
+				type: Boolean,
+				default: false
+			},
+			scrollHeight: {
+				//scroll显示区的高度(px)
+				type: Number,
+				default: 550
+			},
+			topHeight: {
+				//下拉区的高度(px)
+				type: Number,
+				default: 60
+			},
+			interruptPosition: {
+				//暂停区的高度(px)
+				type: Number,
+				default: 40
+			},
+			damping: {
+				//回弹动画的速度 , 值越大越快
+				type: Number,
+				default: 50
+			},
+			scrollTop: {
+				//即scroll-top属性 设置竖向滚动条位置
+				type: Number,
+				default: 0
+			},
+			scrollAnimation: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				isTouch: false, //触摸的标识
+				y: 0, //控制y
+				diff: 0, //定值topHeight-interruptPotion
+				scrollmark: true,
+				timeId: null,
+				top: 0,
+				status: 0,
+				count: 0.01,
+				scrollCount: 0.01,
+				fingers: 0, //记录手指数
+				clearFingers: null, //清除手指定时器
+			};
+		},
+		changePositon() {
+
+		},
+		created() {
+			this.y = -this.topHeight;
+			this.diff = this.interruptPosition - this.topHeight;
+		},
+		methods: {
+			change(e) {
+				//为3即是正在回弹状态
+				if (this.status == 3 || !this.isTouch) return;
+
+				if (e.detail.y >= this.diff || this.fingers > 1) {
+					this.status = 2;
+				} else if (e.detail.y < this.diff) {
+					this.status = 1;
+				}
+			},
+			touchstart(e) {
+				this.fingers++;
+				this.isTouch = true;
+			},
+			touchend(e) {
+				clearTimeout(this.clearFingers);
+				this.clearFingers = setTimeout(() => {
+					this.fingers = 0;
+					//重置手指数防止bug;
+				}, 200);
+				this.fingers--;
+				if (this.status == 3 || this.fingers != 0) return; //防止多指下滑问题 , 匹配手指 只用到最后一次touchend;栈的思想
+				this.isTouch = false;
+				if (this.scrollmark) {
+					if (this.status == 2) {
+						this.status = 3;
+						this.y = this.diff;
+						this.$emit('interrupt', () => {
+							this.y = -this.topHeight - 0.02;
+							setTimeout(() => {
+								this.$emit('finished');
+								this.status = 0; //回弹过程中
+								this.y = -this.topHeight; //结束之后,再次设置y坐标
+							}, 200);
+						});
+					} else if (this.status == 1) {
+						this.status = 3;
+						this.y = -this.topHeight + this.count;
+						//微小改变 否则无响应
+						this.count = -this.count;
+						setTimeout(() => {
+							this.status = 0; //回弹过程中
+						}, 200);
+					}
+				}
+			},
+
+			scroll(e) {
+				//事件
+				this.$emit('scroll', e)
+				clearTimeout(this.timeId);
+				this.scrollmark = false;
+				this.timeId = setTimeout(() => {
+					if (e.detail.scrollTop <= 15 || e.detail.scrollTop - e.detail.deltaY <= 0) {
+						this.top = 0 + this.count;
+						this.$emit('scrolltoupper', e)
+						this.scrollCount = -this.scrollCount;
+						this.scrollmark = true;
+					}
+				}, 100);
+			},
+			scrolltolower(e) {
+				this.$emit('scrolltolower', e);
+			}
+		},
+		watch: {
+			status(value) {
+				if (this.status == 2) this.$emit('pushToInterrupt');
+				else if (this.status == 1) this.$emit('backToInterrupt');
+			},
+			scrollTop() {
+				//console.log("进来");
+				setTimeout(() => {
+						   this.top =  this.scrollTop
+				}, 80);
+				//this.top = this.scrollTop;
+			}
+		}
+	};
+</script>
+
+<style></style>
diff --git "a/components/xing-refresh/\345\256\214\345\205\250\350\207\252\345\256\232\344\271\211\347\232\204\345\270\246\346\234\211\344\270\213\346\213\211\345\210\267\346\226\260\347\232\204scroll-view\347\273\204\344\273\266.md" "b/components/xing-refresh/\345\256\214\345\205\250\350\207\252\345\256\232\344\271\211\347\232\204\345\270\246\346\234\211\344\270\213\346\213\211\345\210\267\346\226\260\347\232\204scroll-view\347\273\204\344\273\266.md"
new file mode 100644
index 0000000..b115110
--- /dev/null
+++ "b/components/xing-refresh/\345\256\214\345\205\250\350\207\252\345\256\232\344\271\211\347\232\204\345\270\246\346\234\211\344\270\213\346\213\211\345\210\267\346\226\260\347\232\204scroll-view\347\273\204\344\273\266.md"
@@ -0,0 +1,192 @@
+## 完全自定义的带有下拉刷新的scroll-view组件
+
+​	看到很多人都需要下拉刷新的scroll-view组件 , 也有很多是从自己项目中抽离出来的组件 . 前端不是设计师 , 而且也难以定制样式 , 授人🐟不如授之以渔 , 所以我这边写了一个基于scroll-view的带下拉刷新的组件 . 我这边只封装了逻辑和进行优化组件的性能 . 
+
+​	大致说明下效果 下拉时遵循一个 ease-in-out曲线(慢快慢,即手滑动距离与下拉距离非线性)  , 下拉距离至超过设置值时 可以有回弹后暂停继续回弹的效果,可以参照手机QQ的下拉刷新效果 ; 过程中有钩子事件 , 你可以改变下拉框的内容和发送请求或别的事情 . 可以看gif 可能有些卡 但是实际上不是卡的(电脑端) 手机端不知道怎么样
+
+
+
+#### 自定义属性
+
+```Javascript
+upRefresh: {
+	//是否开启下拉刷新功能 , 不要动态改变这个属性
+​      type: Boolean,
+    
+​      default: true
+
+​    },
+	//控制显示底部的提示框(可配合scrolltolower事件用于底部加载 )
+​    downLoading: {
+
+​      type: Boolean,
+
+​      default: false
+
+​    },
+
+​    scrollHeight: {
+
+​      //scroll显示区的高度(rpx)
+
+​      type: Number,
+
+​      default: 800
+
+​    },
+
+​    moveMax: {
+
+​      //可下拉的最大距离 指手指滑动的距离(px)  超出后会被截断 此时下拉框已经完全显示 即已经到达
+//下面属性topHeight的高度
+
+​      type: Number,
+
+​      default: 300
+
+​    },
+
+​    topHeight: {
+    
+​      //下拉整个框的最大的高度
+
+​      type: Number,
+
+​      default: 100
+
+​    },
+
+​    animationTime: {
+
+​      //回弹的缓动时间 当upFresh完全显示时 需要花费300ms回弹
+
+​      //upFresh不完全显示时 时间减少 距离曲线按照ease-in-out函数 慢->快->慢
+
+​      type: Number,
+
+​      default: 300
+
+​    },
+
+​    interruptPosition: {
+​      //回弹中断时的高度(px),同时判断是否下拉成功钩子的临界点 建议设置成传入提示框的高度以保持回弹暂停时文字的居中
+​      type: Number,
+
+​      default: 40
+
+​    }
+```
+
+#### 自定义事件和下拉时的钩子
+
+@start,@move,@end 对应touchstart,touchmove,touchend事件参数为event
+
+**注意这些事件判断标准都是下拉的高度 , 而不是手指移动的距离**
+
+**重要!**
+
+##### @pushToInterrupt 下拉达到interruptPosition就会触发这个钩子 下拉过程中只会执行一次
+
+##### @interrupt 回弹暂停的钩子,此时高度为interruptPosition,参数为解除回弹暂停的函数
+
+##### @finished 最后回弹结束高度为0时的钩子
+
+#### **插槽**
+
+```
+<template slot="top"></template>
+<template slot="content"></template>
+<template slot="bottom"></template>
+```
+
+top对应传入提示文字内容 整个下拉框要因为要设置height的变化 所以无法移除 设置了 position:relative , 你可以 slot可以设置position:absolute来控制居中之类的 如果有有要求可以回到源码中改 比如
+
+```html
+<template slot="top">
+<view :style="'position: absolute;bottom: 0px;height: ' + 40 + 'px;line-height:' + 40 + 'px;width: 100%;text-align: center;'">{{tip}}</view>
+</template>
+//设置 position: absolute;bottom: 0px; 可以使提示文字一直在下拉框底部
+//上面提到interruptPosition建议为slot的view的高度40 以保证暂停时文字的居中
+```
+
+```html
+源码
+ <view
+      class="transform will"
+      v-if="upRefresh"
+      :style="'position:relative;height:' + height + 'px;'"
+    >
+      <slot name="top"></slot>
+    </view>
+//其他样式也可自行修改 , "'height:'+height+'px'"为控制下拉框变化部分 , 不可修改
+```
+
+其他两个content即为view-scroll的内容 bottom为底部加载的内容(默认关闭)
+
+#### 示例
+
+```Javascript
+<view class="content">
+		<refresh @interrupt="interrupt" @pushToInterrupt="pushToInterrupt" @finished="finished" @scrolltolower="g">
+			<template slot="top">
+					<view :style="'position: absolute;bottom: 0px;height: ' + 40 + 'px;line-height:' + 40 + 'px;width: 100%;text-align: center;'">
+					{{tip}}	
+					</view>
+			</template>
+			<template slot="content">
+				<view v-for="index in 5" :key="index" class="" style="height: 500px;background:#B2B2B2;border: #2C405A 1px solid;">在美国总统眼里,一切都是生意,只要是生意他不在乎用什么手段。他更喜欢用敲诈勒索,刮地三尺来榨取别国的血汗钱来实现美国的伟大。就在这段日子里,美国总统喊话日韩,要求韩国上交50亿美元保护费,要求日本支付比现在多5倍的保护费,如果不给,就等着美国的怒火吧。美国总统这种做法给了日韩很大的压力,他们在给与不给的选择上左右为难,然而有一个国家却不管美国总统的臭毛病。要求韩国上交50亿美元保护费,要求日本支付比现在多5倍的保护费,如果不给,就等着美国的怒火吧。美国总统这种做法给了日韩很大的压力,他们在给与不给的选择上左右为难,然而有一个国家却不管美国总统的臭毛病。
+				</view>
+			</template>
+			<template slot="bottom">
+				<view>
+				11111111111111111111111111111111111111111111111
+				</view>
+			</template>
+		</refresh>
+	</view>
+	<script>
+import refresh from '@/components/refresh.vue';
+export default {
+	components: {
+		refresh
+	},
+	data() {
+		return {
+			tip: '下拉刷新'
+		};
+	},
+	onLoad() {},
+	methods: {
+		g(e){},
+		interrupt(e) {
+            this.tip = '刷新中'
+            //模拟发送请求
+			setTimeout(e, 500);
+			this.tip = '刷新成功';
+		},
+		pushToInterrupt() {
+			this.tip = '释放刷新';
+		},
+		finished() {
+			this.tip = '下拉刷新';
+		}
+	}
+};
+</script>
+
+<style></style>
+
+```
+
+(1)下拉至interrupt,tip:下拉刷新->释放刷新 
+
+(2)回弹中断:tip->刷新中,发送请求 ,回调函数 tip->刷新成功 ,执行参数e() 回弹继续
+
+(3)完成整个过程 tip->释放刷新
+
+###### 其他的问题
+
+我这边只测试了h5端和微信小程序开发者工具 , 基本上bug已经被改完了,但是注意小程序端我这边使用的是自定义组件是成功的 非自定义组件不成功 , 貌似是uniapp非自定义组件不支持多slot的原因 只显示了content的slot(再次吐槽uniapp对插槽支持度 不完善slot和slot作用域非常影响插件质量) 你可以把提示移入源码都可以的 .  视极端与否 有bug可以在下面反馈下
+
+ 
+
diff --git a/css/uni.css b/css/uni.css
new file mode 100644
index 0000000..2bdd959
--- /dev/null
+++ b/css/uni.css
@@ -0,0 +1,1871 @@
+.white-color {
+	color: #FFFFFF;
+}
+
+.primary-color {
+	color: #2d8cf0;
+}
+
+.light-primary-color {
+	color: #5cadff;
+}
+
+.dark-primary-color {
+	color: #2b85e4;
+}
+
+.info-color {
+	color: #2d8cf0;
+}
+
+.success-color {
+	color: #19be6b;
+}
+
+.warning-color {
+	color: #ff9900;
+}
+
+.error-color {
+	color: #ed3f14;
+}
+
+.title-color {
+	color: #1c2438;
+}
+
+.content-color {
+	color: #495060;
+}
+
+.sub-color {
+	color: #80848f;
+}
+
+.disabled-color {
+	color: #bbbec4;
+}
+
+.border-color {
+	color: #dddee1;
+}
+
+.divider-color {
+	color: #e9eaec;
+}
+
+.gray-color {
+	color: #666666;
+}
+
+.pink-color {
+	color: #e7507b;
+}
+
+.bg-gray-color {
+	background: #666666;
+}
+
+.bg-color {
+	background: #EBEEF5;
+}
+
+.bg-primary-color {
+	background: #2d8cf0;
+}
+
+.bg-light-primary-color {
+	background: #5cadff;
+}
+
+.bg-dark-primary-color {
+	background: #2b85e4;
+}
+
+.bg-info-color {
+	background: #2d8cf0;
+}
+
+.bg-success-color {
+	background: #19be6b;
+}
+
+.bg-warning-color {
+	background: #ff9900;
+}
+
+.bg-error-color {
+	background: #ed3f14;
+}
+
+.bg-pink-color {
+	background: #e7507b;
+}
+
+.bg-title-color {
+	background: #1c2438;
+}
+
+.bg-content-color {
+	background: #495060;
+}
+
+.bg-sub-color {
+	background: #80848f;
+}
+
+.bg-disabled-color {
+	background: #bbbec4;
+}
+
+.bg-border-color {
+	background: #dddee1;
+}
+
+.bg-divider-color {
+	background: #e9eaec;
+}
+
+.bg-white-color {
+	background: #FFFFFF;
+}
+
+.bg-black-color {
+	background: #000;
+}
+
+.full-height {
+	height: 100%;
+}
+
+.full-width {
+	width: 100%;
+}
+
+.align-center {
+	text-align: center;
+}
+
+.align-left {
+	text-align: left;
+}
+
+.align-right {
+	text-align: right;
+}
+
+.float-left {
+	float: left;
+}
+
+.float-right {
+	float: right;
+}
+.border-radius-50 {
+	border-radius: 50%;
+}
+
+.text-overflow {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box !important;
+	-webkit-line-clamp: 1;
+	/* 限制在一个块元素显示的文本的行数 */
+	-webkit-box-orient: vertical;
+	/* 垂直排列 */
+	word-break: break-all;
+	/* 内容自动换行 */
+}
+
+.text-overflow2 {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box !important;
+	-webkit-line-clamp: 2;
+	/* 限制在一个块元素显示的文本的行数 */
+	-webkit-box-orient: vertical;
+	/* 垂直排列 */
+	word-break: break-all;
+	/* 内容自动换行 */
+}
+
+.uni-flex {
+	display: flex;
+	flex-direction: row;
+}
+
+.uni-flex-item {
+	flex: 1;
+}
+
+.uni-row {
+	flex-direction: row;
+}
+
+.uni-column {
+	flex-direction: column;
+}
+
+.uni-link {
+	color: #576B95;
+	font-size: 26upx;
+}
+
+.uni-center {
+	text-align: center;
+}
+
+.uni-inline-item {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+}
+
+.uni-inline-item text {
+	margin-right: 20upx;
+}
+
+.uni-inline-item text:last-child {
+	margin-right: 0upx;
+	margin-left: 20upx;
+}
+
+/* page */
+.uni-page-head {
+	padding: 35upx;
+	text-align: center;
+}
+
+.uni-page-head-title {
+	display: inline-block;
+	padding: 0 40upx;
+	font-size: 30upx;
+	height: 88upx;
+	line-height: 88upx;
+	color: #BEBEBE;
+	box-sizing: border-box;
+	border-bottom: 2upx solid #D8D8D8;
+}
+
+.uni-page-body {
+	width: 100%;
+	flex-grow: 1;
+	overflow-x: hidden;
+}
+
+.uni-padding-wrap {
+	width: 690upx;
+	padding: 0 30upx;
+}
+
+.uni-word {
+	text-align: center;
+	padding: 200upx 100upx;
+}
+
+.uni-title {
+	font-size: 30upx;
+	font-weight: 500;
+	padding: 20upx 0;
+	line-height: 1.5;
+}
+
+.uni-text {
+	font-size: 28upx;
+}
+
+.uni-title text {
+	font-size: 24upx;
+	color: #888;
+}
+
+.uni-text-gray {
+	color: #ccc;
+}
+
+.uni-text-small {
+	font-size: 24upx;
+}
+
+.uni-common-mb {
+	margin-bottom: 30upx;
+}
+
+.uni-common-pb {
+	padding-bottom: 30upx;
+}
+
+.uni-common-pl {
+	padding-left: 30upx;
+}
+
+.uni-common-mt {
+	margin-top: 30upx;
+}
+
+/* 背景色 */
+.uni-bg-red {
+	background: #F76260;
+	color: #FFF;
+}
+
+.uni-bg-green {
+	background: #09BB07;
+	color: #FFF;
+}
+
+.uni-bg-blue {
+	background: #007AFF;
+	color: #FFF;
+}
+
+/* 标题 */
+.uni-h1 {
+	font-size: 80upx;
+	font-weight: 700;
+}
+
+.uni-h2 {
+	font-size: 60upx;
+	font-weight: 700;
+}
+
+.uni-h3 {
+	font-size: 48upx;
+	font-weight: 700;
+}
+
+.uni-h4 {
+	font-size: 36upx;
+	font-weight: 700;
+}
+
+.uni-h5 {
+	font-size: 28upx;
+	color: #8f8f94;
+}
+
+.uni-h6 {
+	font-size: 24upx;
+	color: #8f8f94;
+}
+
+.uni-bold {
+	font-weight: bold;
+}
+
+/* 文本溢出隐藏 */
+.uni-ellipsis {
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+}
+
+/* 竖向百分百按钮 */
+.uni-btn-v {
+	padding: 10upx 0;
+}
+
+.uni-btn-v button {
+	margin: 20upx 0;
+}
+
+/* 表单 */
+.uni-form-item {
+	display: flex;
+	width: 100%;
+	padding: 10upx 0;
+}
+
+.uni-form-item .title {
+	padding: 10upx 25upx;
+}
+
+.uni-label {
+	width: 210upx;
+	word-wrap: break-word;
+	word-break: break-all;
+	text-indent: 20upx;
+}
+
+.uni-input {
+	height: 50upx;
+	padding: 15upx 25upx;
+	line-height: 50upx;
+	font-size: 28upx;
+	background: #FFF;
+	flex: 1;
+}
+
+radio-group,
+checkbox-group {
+	width: 100%;
+}
+
+radio-group label,
+checkbox-group label {
+	padding-right: 20upx;
+}
+
+.uni-form-item .with-fun {
+	display: flex;
+	flex-wrap: nowrap;
+	background: #FFFFFF;
+}
+
+.uni-form-item .with-fun .uni-icon {
+	width: 40px;
+	height: 80upx;
+	line-height: 80upx;
+	flex-shrink: 0;
+}
+
+/* loadmore */
+.uni-loadmore {
+	height: 80upx;
+	line-height: 80upx;
+	text-align: center;
+	padding-bottom: 30upx;
+}
+
+/*数字角标*/
+.uni-badge,
+.uni-badge-default {
+	font-family: 'Helvetica Neue', Helvetica, sans-serif;
+	font-size: 12px;
+	line-height: 1;
+	display: inline-block;
+	padding: 3px 6px;
+	color: #333;
+	border-radius: 100px;
+	background-color: rgba(0, 0, 0, .15);
+}
+
+.uni-badge.uni-badge-inverted {
+	padding: 0 5px 0 0;
+	color: #929292;
+	background-color: transparent
+}
+
+.uni-badge-primary {
+	color: #fff;
+	background-color: #007aff
+}
+
+.uni-badge-blue.uni-badge-inverted,
+.uni-badge-primary.uni-badge-inverted {
+	color: #007aff;
+	background-color: transparent
+}
+
+.uni-badge-green,
+.uni-badge-success {
+	color: #fff;
+	background-color: #4cd964;
+}
+
+.uni-badge-green.uni-badge-inverted,
+.uni-badge-success.uni-badge-inverted {
+	color: #4cd964;
+	background-color: transparent
+}
+
+.uni-badge-warning,
+.uni-badge-yellow {
+	color: #fff;
+	background-color: #f0ad4e
+}
+
+.uni-badge-warning.uni-badge-inverted,
+.uni-badge-yellow.uni-badge-inverted {
+	color: #f0ad4e;
+	background-color: transparent
+}
+
+.uni-badge-danger,
+.uni-badge-red {
+	color: #fff;
+	background-color: #dd524d
+}
+
+.uni-badge-danger.uni-badge-inverted,
+.uni-badge-red.uni-badge-inverted {
+	color: #dd524d;
+	background-color: transparent
+}
+
+.uni-badge-purple,
+.uni-badge-royal {
+	color: #fff;
+	background-color: #8a6de9
+}
+
+.uni-badge-purple.uni-badge-inverted,
+.uni-badge-royal.uni-badge-inverted {
+	color: #8a6de9;
+	background-color: transparent
+}
+
+/*折叠面板 */
+.uni-collapse-content {
+	height: 0;
+	width: 100%;
+	overflow: hidden;
+}
+
+.uni-collapse-content.uni-active {
+	height: auto;
+}
+
+/*卡片视图 */
+.uni-card {
+	background: #fff;
+	border-radius: 8upx;
+	margin: 20upx 0;
+	position: relative;
+	box-shadow: 0 2upx 4upx rgba(0, 0, 0, .3);
+}
+
+.uni-card-content {
+	font-size: 30upx;
+}
+
+.uni-card-content.image-view {
+	width: 100%;
+	margin: 0;
+}
+
+.uni-card-content-inner {
+	position: relative;
+	padding: 30upx;
+}
+
+.uni-card-footer,
+.uni-card-header {
+	position: relative;
+	display: flex;
+	min-height: 50upx;
+	padding: 20upx 30upx;
+	justify-content: space-between;
+	align-items: center;
+}
+
+.uni-card-header {
+	font-size: 36upx;
+}
+
+.uni-card-footer {
+	color: #6d6d72;
+}
+
+.uni-card-footer:before,
+.uni-card-header:after {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	height: 2upx;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-card-header:after {
+	top: auto;
+	bottom: 0;
+}
+
+.uni-card-media {
+	justify-content: flex-start;
+}
+
+.uni-card-media-logo {
+	height: 84upx;
+	width: 84upx;
+	margin-right: 20upx;
+}
+
+.uni-card-media-body {
+	height: 84upx;
+	display: flex;
+	flex-direction: column;
+	justify-content: space-between;
+	align-items: flex-start;
+}
+
+.uni-card-media-text-top {
+	line-height: 36upx;
+	font-size: 34upx;
+}
+
+.uni-card-media-text-bottom {
+	line-height: 30upx;
+	font-size: 28upx;
+	color: #8f8f94;
+}
+
+.uni-card-link {
+	color: #007AFF;
+}
+
+/* 列表 */
+.uni-list {
+	background-color: #FFFFFF;
+	position: relative;
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+}
+
+.uni-list:after {
+	position: absolute;
+	z-index: 10;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-list::before {
+	position: absolute;
+	z-index: 10;
+	right: 0;
+	top: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-list-cell {
+	position: relative;
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+}
+
+.uni-list-cell-hover {
+	background-color: #eee;
+}
+
+.uni-list-cell-pd {
+	padding: 22upx 30upx;
+}
+
+.uni-list-cell-left {
+	font-size: 28upx;
+	padding: 0 30upx;
+}
+
+.uni-list-cell-db,
+.uni-list-cell-right {
+	flex: 1;
+}
+
+.uni-list-cell::after {
+	position: absolute;
+	z-index: 3;
+	right: 0;
+	bottom: 0;
+	left: 30upx;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-list .uni-list-cell:last-child::after {
+	height: 0upx;
+}
+
+.uni-list-cell-last.uni-list-cell::after {
+	height: 0upx;
+}
+
+.uni-list-cell-divider {
+	position: relative;
+	display: flex;
+	color: #999;
+	background-color: #f7f7f7;
+	padding: 15upx 20upx;
+}
+
+.uni-list-cell-divider::before {
+	position: absolute;
+	right: 0;
+	top: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-list-cell-divider::after {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	left: 0upx;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-list-cell-navigate {
+	font-size: 30upx;
+	padding: 22upx 30upx;
+	line-height: 48upx;
+	position: relative;
+	display: flex;
+	box-sizing: border-box;
+	width: 100%;
+	flex: 1;
+	justify-content: space-between;
+	align-items: center;
+}
+
+.uni-list-cell-navigate {
+	padding-right: 36upx;
+}
+
+.uni-navigate-badge {
+	padding-right: 50upx;
+}
+
+.uni-list-cell-navigate.uni-navigate-right:after {
+	font-family: uniicons;
+	content: '\e583';
+	position: absolute;
+	right: 24upx;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+
+.uni-list-cell-navigate.uni-navigate-bottom:after {
+	font-family: uniicons;
+	content: '\e581';
+	position: absolute;
+	right: 24upx;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+
+.uni-list-cell-navigate.uni-navigate-bottom.uni-active::after {
+	font-family: uniicons;
+	content: '\e580';
+	position: absolute;
+	right: 24upx;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+
+.uni-collapse.uni-list-cell {
+	flex-direction: column;
+}
+
+.uni-list-cell-navigate.uni-active {
+	background: #eee;
+}
+
+.uni-list.uni-collapse {
+	box-sizing: border-box;
+	height: 0;
+	overflow: hidden;
+}
+
+.uni-collapse .uni-list-cell {
+	padding-left: 20upx;
+}
+
+.uni-collapse .uni-list-cell::after {
+	left: 52upx;
+}
+
+.uni-list.uni-active {
+	height: auto;
+}
+
+/* 三行列表 */
+.uni-triplex-row {
+	display: flex;
+	flex: 1;
+	width: 100%;
+	box-sizing: border-box;
+	flex-direction: row;
+	padding: 22upx 30upx;
+}
+
+.uni-triplex-right,
+.uni-triplex-left {
+	display: flex;
+	flex-direction: column;
+}
+
+.uni-triplex-left {
+	width: 84%;
+}
+
+.uni-triplex-left .uni-title {
+	padding: 8upx 0;
+}
+
+.uni-triplex-left .uni-text,
+.uni-triplex-left .uni-text-small {
+	color: #999999;
+}
+
+.uni-triplex-right {
+	width: 16%;
+	text-align: right;
+}
+
+/* 图文列表 */
+.uni-media-list {
+	padding: 22upx 30upx;
+	box-sizing: border-box;
+	display: flex;
+	width: 100%;
+	flex-direction: row;
+}
+
+.uni-navigate-right.uni-media-list {
+	padding-right: 74upx;
+}
+
+.uni-pull-right {
+	flex-direction: row-reverse;
+}
+
+.uni-pull-right>.uni-media-list-logo {
+	margin-right: 0upx;
+	margin-left: 20upx;
+}
+
+.uni-media-list-logo {
+	height: 84upx;
+	width: 84upx;
+	margin-right: 20upx;
+}
+
+.uni-media-list-logo image {
+	height: 100%;
+	width: 100%;
+}
+
+.uni-media-list-body {
+	height: 84upx;
+	display: flex;
+	flex: 1;
+	flex-direction: column;
+	justify-content: space-between;
+	align-items: flex-start;
+	overflow: hidden;
+}
+
+.uni-media-list-text-top {
+	width: 100%;
+	line-height: 36upx;
+	font-size: 30upx;
+}
+
+.uni-media-list-text-bottom {
+	width: 100%;
+	line-height: 30upx;
+	font-size: 26upx;
+	color: #8f8f94;
+}
+
+/* 九宫格 */
+.uni-grid-9 {
+	background: #f2f2f2;
+	width: 750upx;
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+	border-top: 2upx solid #eee;
+}
+
+.uni-grid-9-item {
+	width: 250upx;
+	height: 200upx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	border-bottom: 2upx solid;
+	border-right: 2upx solid;
+	border-color: #eee;
+	box-sizing: border-box;
+}
+
+.no-border-right {
+	border-right: none;
+}
+
+.uni-grid-9-image {
+	width: 100upx;
+	height: 100upx;
+}
+
+.uni-grid-9-text {
+	width: 250upx;
+	line-height: 4upx;
+	height: 40upx;
+	text-align: center;
+	font-size: 30upx;
+}
+
+.uni-grid-9-item-hover {
+	background: rgba(0, 0, 0, 0.1);
+}
+
+/* 上传 */
+.uni-uploader {
+	flex: 1;
+	flex-direction: column;
+}
+
+.uni-uploader-head {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+}
+
+.uni-uploader-info {
+	color: #B2B2B2;
+}
+
+.uni-uploader-body {
+	margin-top: 16upx;
+}
+
+.uni-uploader__files {
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+}
+
+.uni-uploader__file {
+	margin: 10upx;
+	width: 210upx;
+	height: 210upx;
+}
+
+.uni-uploader__img {
+	display: block;
+	width: 210upx;
+	height: 210upx;
+}
+
+.uni-uploader__input-box {
+	position: relative;
+	margin: 10upx;
+	width: 208upx;
+	height: 208upx;
+	border: 2upx solid #D9D9D9;
+}
+
+.uni-uploader__input-box:before,
+.uni-uploader__input-box:after {
+	content: " ";
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	-webkit-transform: translate(-50%, -50%);
+	transform: translate(-50%, -50%);
+	background-color: #D9D9D9;
+}
+
+.uni-uploader__input-box:before {
+	width: 4upx;
+	height: 79upx;
+}
+
+.uni-uploader__input-box:after {
+	width: 79upx;
+	height: 4upx;
+}
+
+.uni-uploader__input-box:active {
+	border-color: #999999;
+}
+
+.uni-uploader__input-box:active:before,
+.uni-uploader__input-box:active:after {
+	background-color: #999999;
+}
+
+.uni-uploader__input {
+	position: absolute;
+	z-index: 1;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	opacity: 0;
+}
+
+/*问题反馈*/
+.feedback-title {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	padding: 20upx;
+	color: #8f8f94;
+	font-size: 28upx;
+}
+
+.feedback-star-view.feedback-title {
+	justify-content: flex-start;
+	margin: 0;
+}
+
+.feedback-quick {
+	position: relative;
+	padding-right: 40upx;
+}
+
+.feedback-quick:after {
+	font-family: uniicons;
+	font-size: 40upx;
+	content: '\e581';
+	position: absolute;
+	right: 0;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+
+.feedback-body {
+	background: #fff;
+}
+
+.feedback-textare {
+	height: 200upx;
+	font-size: 34upx;
+	line-height: 50upx;
+	width: 100%;
+	box-sizing: border-box;
+	padding: 20upx 30upx 0;
+}
+
+.feedback-input {
+	font-size: 34upx;
+	height: 50upx;
+	min-height: 50upx;
+	padding: 15upx 20upx;
+	line-height: 50upx;
+}
+
+.feedback-uploader {
+	padding: 22upx 20upx;
+}
+
+.feedback-star {
+	font-family: uniicons;
+	font-size: 40upx;
+	margin-left: 6upx;
+}
+
+.feedback-star-view {
+	margin-left: 20upx;
+}
+
+.feedback-star:after {
+	content: '\e408';
+}
+
+.feedback-star.active {
+	color: #FFB400;
+}
+
+.feedback-star.active:after {
+	content: '\e438';
+}
+
+.feedback-submit {
+	background: #007AFF;
+	color: #FFFFFF;
+	margin: 20upx;
+}
+
+/* input group */
+.uni-input-group {
+	position: relative;
+	padding: 0;
+	border: 0;
+	background-color: #fff;
+}
+
+.uni-input-group:before {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	height: 2upx;
+	content: '';
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-input-group:after {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	height: 2upx;
+	content: '';
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-input-row {
+	position: relative;
+	display: flex;
+	flex-direction: row;
+	font-size: 28upx;
+	padding: 22upx 30upx;
+	justify-content: space-between;
+}
+
+.uni-input-group .uni-input-row:after {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	left: 30upx;
+	height: 2upx;
+	content: '';
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-input-row label {
+	line-height: 70upx;
+}
+
+/* textarea */
+.uni-textarea {
+	width: 100%;
+	background: #FFF;
+}
+
+.uni-textarea textarea {
+	width: 96%;
+	padding: 18upx 2%;
+	line-height: 1.6;
+	font-size: 28upx;
+	height: 150upx;
+}
+
+/* tab bar */
+.uni-tab-bar {
+	display: flex;
+	flex: 1;
+	flex-direction: column;
+	overflow: hidden;
+	height: 100%;
+}
+
+.uni-tab-bar .list {
+	width: 750upx;
+	height: 100%;
+}
+
+.uni-swiper-tab {
+	width: 100%;
+	white-space: nowrap;
+	line-height: 100upx;
+	height: 100upx;
+	border-bottom: 1px solid #c8c7cc;
+}
+
+.swiper-tab-list {
+	font-size: 30upx;
+	width: 150upx;
+	display: inline-block;
+	text-align: center;
+}
+
+.uni-tab-bar .active {
+	color: #007AFF;
+}
+
+.uni-tab-bar .swiper-box {
+	flex: 1;
+	width: 100%;
+	height: calc(100% - 100upx);
+}
+
+.uni-tab-bar-loading {
+	padding: 20upx 0;
+}
+
+/* comment */
+.uni-comment {
+	padding: 5upx 0;
+	display: flex;
+	flex-grow: 1;
+	flex-direction: column;
+}
+
+.uni-comment-list {
+	flex-wrap: nowrap;
+	padding: 10upx 0;
+	margin: 10upx 0;
+	width: 100%;
+	display: flex;
+}
+
+.uni-comment-face {
+	width: 70upx;
+	height: 70upx;
+	border-radius: 100%;
+	margin-right: 20upx;
+	flex-shrink: 0;
+	overflow: hidden;
+}
+
+.uni-comment-face image {
+	width: 100%;
+	border-radius: 100%;
+}
+
+.uni-comment-body {
+	width: 100%;
+}
+
+.uni-comment-top {
+	line-height: 1.5em;
+	justify-content: space-between;
+}
+
+.uni-comment-top text {
+	color: #0A98D5;
+	font-size: 24upx;
+}
+
+.uni-comment-date {
+	line-height: 38upx;
+	flex-direction: row;
+	justify-content: space-between;
+	display: flex !important;
+	flex-grow: 1;
+}
+
+.uni-comment-date view {
+	color: #666666;
+	font-size: 24upx;
+	line-height: 38upx;
+}
+
+.uni-comment-content {
+	line-height: 1.6em;
+	font-size: 28upx;
+	padding: 8upx 0;
+}
+
+.uni-comment-replay-btn {
+	background: #FFF;
+	font-size: 24upx;
+	line-height: 28upx;
+	padding: 5upx 20upx;
+	border-radius: 30upx;
+	color: #333 !important;
+	margin: 0 10upx;
+}
+
+/* swiper msg */
+.uni-swiper-msg {
+	width: 100%;
+	padding: 12upx 0;
+	flex-wrap: nowrap;
+	display: flex;
+}
+
+.uni-swiper-msg-icon {
+	width: 50upx;
+	margin-right: 20upx;
+}
+
+.uni-swiper-msg-icon image {
+	width: 100%;
+	flex-shrink: 0;
+}
+
+.uni-swiper-msg swiper {
+	width: 100%;
+	height: 50upx;
+}
+
+.uni-swiper-msg swiper-item {
+	line-height: 50upx;
+}
+
+/* product */
+.uni-product-list {
+	display: flex;
+	width: 100%;
+	flex-wrap: wrap;
+	flex-direction: row;
+}
+
+.uni-product {
+	padding: 20upx;
+	display: flex;
+	flex-direction: column;
+}
+
+.image-view {
+	height: 330upx;
+	width: 330upx;
+	margin: 12upx 0;
+}
+
+.uni-product-image {
+	height: 330upx;
+	width: 330upx;
+}
+
+.uni-product-title {
+	width: 300upx;
+	word-break: break-all;
+	display: -webkit-box;
+	overflow: hidden;
+	line-height: 1.5;
+	text-overflow: ellipsis;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+}
+
+.uni-product-price {
+	margin-top: 10upx;
+	font-size: 28upx;
+	line-height: 1.5;
+	position: relative;
+}
+
+.uni-product-price-original {
+	color: #e80080;
+}
+
+.uni-product-price-favour {
+	color: #888888;
+	text-decoration: line-through;
+	margin-left: 10upx;
+}
+
+.uni-product-tip {
+	position: absolute;
+	right: 10upx;
+	background-color: #ff3333;
+	color: #ffffff;
+	padding: 0 10upx;
+	border-radius: 5upx;
+}
+
+/* timeline */
+.uni-timeline {
+	margin: 35upx 0;
+	display: flex;
+	flex-direction: column;
+	position: relative;
+}
+
+
+.uni-timeline-item {
+	display: flex;
+	flex-direction: row;
+	position: relative;
+	padding-bottom: 20upx;
+	box-sizing: border-box;
+	overflow: hidden;
+
+}
+
+.uni-timeline-item .uni-timeline-item-keynode {
+	width: 160upx;
+	flex-shrink: 0;
+	box-sizing: border-box;
+	padding-right: 20upx;
+	text-align: right;
+	line-height: 65upx;
+}
+
+.uni-timeline-item .uni-timeline-item-divider {
+	flex-shrink: 0;
+	position: relative;
+	width: 30upx;
+	height: 30upx;
+	top: 15upx;
+	border-radius: 50%;
+	background-color: #bbb;
+}
+
+
+
+.uni-timeline-item-divider::before,
+.uni-timeline-item-divider::after {
+	position: absolute;
+	left: 15upx;
+	width: 1upx;
+	height: 100vh;
+	content: '';
+	background: inherit;
+}
+
+.uni-timeline-item-divider::before {
+	bottom: 100%;
+}
+
+.uni-timeline-item-divider::after {
+	top: 100%;
+}
+
+
+.uni-timeline-last-item .uni-timeline-item-divider:after {
+	display: none;
+}
+
+.uni-timeline-first-item .uni-timeline-item-divider:before {
+	display: none;
+}
+
+.uni-timeline-item .uni-timeline-item-content {
+	padding-left: 20upx;
+}
+
+.uni-timeline-last-item .bottom-border::after {
+	display: none;
+}
+
+.uni-timeline-item-content .datetime {
+	color: #CCCCCC;
+}
+
+/* 自定义节点颜色 */
+.uni-timeline-last-item .uni-timeline-item-divider {
+	background-color: #1AAD19;
+}
+
+
+/* uni-icon */
+
+.uni-icon {
+	font-family: uniicons;
+	font-size: 24px;
+	font-weight: normal;
+	font-style: normal;
+	line-height: 1;
+	display: inline-block;
+	text-decoration: none;
+	-webkit-font-smoothing: antialiased;
+}
+
+.uni-icon.uni-active {
+	color: #007aff;
+}
+
+.uni-icon-contact:before {
+	content: '\e100';
+}
+
+.uni-icon-person:before {
+	content: '\e101';
+}
+
+.uni-icon-personadd:before {
+	content: '\e102';
+}
+
+.uni-icon-contact-filled:before {
+	content: '\e130';
+}
+
+.uni-icon-person-filled:before {
+	content: '\e131';
+}
+
+.uni-icon-personadd-filled:before {
+	content: '\e132';
+}
+
+.uni-icon-phone:before {
+	content: '\e200';
+}
+
+.uni-icon-email:before {
+	content: '\e201';
+}
+
+.uni-icon-chatbubble:before {
+	content: '\e202';
+}
+
+.uni-icon-chatboxes:before {
+	content: '\e203';
+}
+
+.uni-icon-phone-filled:before {
+	content: '\e230';
+}
+
+.uni-icon-email-filled:before {
+	content: '\e231';
+}
+
+.uni-icon-chatbubble-filled:before {
+	content: '\e232';
+}
+
+.uni-icon-chatboxes-filled:before {
+	content: '\e233';
+}
+
+.uni-icon-weibo:before {
+	content: '\e260';
+}
+
+.uni-icon-weixin:before {
+	content: '\e261';
+}
+
+.uni-icon-pengyouquan:before {
+	content: '\e262';
+}
+
+.uni-icon-chat:before {
+	content: '\e263';
+}
+
+.uni-icon-qq:before {
+	content: '\e264';
+}
+
+.uni-icon-videocam:before {
+	content: '\e300';
+}
+
+.uni-icon-camera:before {
+	content: '\e301';
+}
+
+.uni-icon-mic:before {
+	content: '\e302';
+}
+
+.uni-icon-location:before {
+	content: '\e303';
+}
+
+.uni-icon-mic-filled:before,
+.uni-icon-speech:before {
+	content: '\e332';
+}
+
+.uni-icon-location-filled:before {
+	content: '\e333';
+}
+
+.uni-icon-micoff:before {
+	content: '\e360';
+}
+
+.uni-icon-image:before {
+	content: '\e363';
+}
+
+.uni-icon-map:before {
+	content: '\e364';
+}
+
+.uni-icon-compose:before {
+	content: '\e400';
+}
+
+.uni-icon-trash:before {
+	content: '\e401';
+}
+
+.uni-icon-upload:before {
+	content: '\e402';
+}
+
+.uni-icon-download:before {
+	content: '\e403';
+}
+
+.uni-icon-close:before {
+	content: '\e404';
+}
+
+.uni-icon-redo:before {
+	content: '\e405';
+}
+
+.uni-icon-undo:before {
+	content: '\e406';
+}
+
+.uni-icon-refresh:before {
+	content: '\e407';
+}
+
+.uni-icon-star:before {
+	content: '\e408';
+}
+
+.uni-icon-plus:before {
+	content: '\e409';
+}
+
+.uni-icon-minus:before {
+	content: '\e410';
+}
+
+.uni-icon-circle:before,
+.uni-icon-checkbox:before {
+	content: '\e411';
+}
+
+.uni-icon-close-filled:before,
+.uni-icon-clear:before {
+	content: '\e434';
+}
+
+.uni-icon-refresh-filled:before {
+	content: '\e437';
+}
+
+.uni-icon-star-filled:before {
+	content: '\e438';
+}
+
+.uni-icon-plus-filled:before {
+	content: '\e439';
+}
+
+.uni-icon-minus-filled:before {
+	content: '\e440';
+}
+
+.uni-icon-circle-filled:before {
+	content: '\e441';
+}
+
+.uni-icon-checkbox-filled:before {
+	content: '\e442';
+}
+
+.uni-icon-closeempty:before {
+	content: '\e460';
+}
+
+.uni-icon-refreshempty:before {
+	content: '\e461';
+}
+
+.uni-icon-reload:before {
+	content: '\e462';
+}
+
+.uni-icon-starhalf:before {
+	content: '\e463';
+}
+
+.uni-icon-spinner:before {
+	content: '\e464';
+}
+
+.uni-icon-spinner-cycle:before {
+	content: '\e465';
+}
+
+.uni-icon-search:before {
+	content: '\e466';
+}
+
+.uni-icon-plusempty:before {
+	content: '\e468';
+}
+
+.uni-icon-forward:before {
+	content: '\e470';
+}
+
+.uni-icon-back:before,
+.uni-icon-left-nav:before {
+	content: '\e471';
+}
+
+.uni-icon-checkmarkempty:before {
+	content: '\e472';
+}
+
+.uni-icon-home:before {
+	content: '\e500';
+}
+
+.uni-icon-navigate:before {
+	content: '\e501';
+}
+
+.uni-icon-gear:before {
+	content: '\e502';
+}
+
+.uni-icon-paperplane:before {
+	content: '\e503';
+}
+
+.uni-icon-info:before {
+	content: '\e504';
+}
+
+.uni-icon-help:before {
+	content: '\e505';
+}
+
+.uni-icon-locked:before {
+	content: '\e506';
+}
+
+.uni-icon-more:before {
+	content: '\e507';
+}
+
+.uni-icon-flag:before {
+	content: '\e508';
+}
+
+.uni-icon-home-filled:before {
+	content: '\e530';
+}
+
+.uni-icon-gear-filled:before {
+	content: '\e532';
+}
+
+.uni-icon-info-filled:before {
+	content: '\e534';
+}
+
+.uni-icon-help-filled:before {
+	content: '\e535';
+}
+
+.uni-icon-more-filled:before {
+	content: '\e537';
+}
+
+.uni-icon-settings:before {
+	content: '\e560';
+}
+
+.uni-icon-list:before {
+	content: '\e562';
+}
+
+.uni-icon-bars:before {
+	content: '\e563';
+}
+
+.uni-icon-loop:before {
+	content: '\e565';
+}
+
+.uni-icon-paperclip:before {
+	content: '\e567';
+}
+
+.uni-icon-eye:before {
+	content: '\e568';
+}
+
+.uni-icon-arrowup:before {
+	content: '\e580';
+}
+
+.uni-icon-arrowdown:before {
+	content: '\e581';
+}
+
+.uni-icon-arrowleft:before {
+	content: '\e582';
+}
+
+.uni-icon-arrowright:before {
+	content: '\e583';
+}
+
+.uni-icon-arrowthinup:before {
+	content: '\e584';
+}
+
+.uni-icon-arrowthindown:before {
+	content: '\e585';
+}
+
+.uni-icon-arrowthinleft:before {
+	content: '\e586';
+}
+
+.uni-icon-arrowthinright:before {
+	content: '\e587';
+}
+
+.uni-icon-pulldown:before {
+	content: '\e588';
+}
+
+.uni-icon-scan:before {
+	content: "\e612";
+}
+
+/* 分界线 */
+.uni-divider {
+	height: 110upx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	position: relative;
+}
+
+.uni-divider__content {
+	font-size: 28upx;
+	color: #999;
+	padding: 0 20upx;
+	position: relative;
+	z-index: 101;
+	background: #F4F5F6;
+}
+
+.uni-divider__line {
+	background-color: #CCCCCC;
+	height: 1px;
+	width: 100%;
+	position: absolute;
+	z-index: 100;
+	top: 50%;
+	left: 0;
+	transform: translateY(50%);
+}
diff --git a/js_sdk/u-charts/config.js b/js_sdk/u-charts/config.js
new file mode 100644
index 0000000..0fe89ef
--- /dev/null
+++ b/js_sdk/u-charts/config.js
@@ -0,0 +1,471 @@
+/*
+ * uCharts组件 默认配置文件,如有修改,更新前请备份此文件!!
+ * Copyright (c) 2021 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
+ * 
+ */
+module.exports = {
+	"type":["pie","ring","rose","word","funnel","map","arcbar","line","column","area","radar","gauge","candle","mix","point","bubble"],
+	"categories":["line","column","area","radar","gauge","candle","mix","point","bubble"],
+	//以上数据请勿改动,下面是自定义默认配置,请添加项目所需的个性配置
+	"pie":{
+		type: 'pie',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+			padding:5,
+			lineHeight:11,
+			margin:0,
+		},
+		dataLabel: true,
+		extra: {
+			pie: {
+		    border:true,
+		    borderColor:'#FFFFFF',
+		    borderWidth:3
+			}
+		}
+	},
+	"ring":{
+		type: 'ring',
+		padding:[5,5,5,5],
+		legend:{
+			show:true,
+			position:'right',
+			float:'center',
+			itemGap:10,
+			padding:5,
+			lineHeight:26,
+			margin:5,
+			borderWidth :1
+		},
+		disablePieStroke: true,
+		dataLabel: true,
+		subtitle: {
+			name: '70%',
+			color: '#7cb5ec',
+			fontSize: 25,
+		},
+		title: {
+			name: '收益率',
+			color: '#666666',
+			fontSize: 15,
+		},
+		extra: {
+			pie: {
+			  offsetAngle: 0,
+			  ringWidth: 40,
+			  labelWidth:15
+			}
+		}
+	},
+	"rose":{
+		type: 'rose',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+			position:'left',
+			float:'center',
+			itemGap:10,
+			padding:5,
+			lineHeight:26,
+			margin:5,
+			borderWidth :1
+		},
+		dataLabel: true,
+		extra: {
+			rose: {
+				type:'area',
+				minRadius:50,
+				activeOpacity:0.5,
+				offsetAngle:0,
+				labelWidth:15
+			}
+		}
+	},
+	"word":{
+		type: 'word',
+		extra: {
+			word: {
+				type: 'normal'
+			}
+		}
+	},
+	"funnel":{
+		type: 'funnel',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+			padding:5,
+			lineHeight:11,
+			margin:0,
+		},
+		dataLabel: true,
+		extra: {
+			funnel: {
+		    border:true,
+		    borderWidth:2,
+		    borderColor:'#FFFFFF'
+			}
+		}
+	},
+	"map":{
+		type: 'map',
+		padding:[0,0,0,0],
+		legend:{
+			show:false
+		},
+		dataLabel:true,
+		extra: {
+			map: {
+		    border:true,
+		    borderWidth:1,
+		    borderColor:'#666666',
+		    fillOpacity:0.6
+			}
+		}
+	},
+	"arcbar":{
+		type: 'arcbar',
+		legend:{show:false},
+		dataLabel: true,
+		title: {
+			name: "百分比",
+			color: '#00FF00',
+			fontSize: 25
+		},
+		subtitle: {
+			name: "默认标题",
+			color: '#666666',
+			fontSize: 15
+		},
+		extra: {
+			arcbar:{
+				type:'default',
+				width: 12,
+			}
+		}
+	},
+	"line":{
+		type: 'line',
+		padding:[15,30,0,15],
+		legend:{
+			show:true,
+			padding:5,
+			lineHeight:11,
+			margin:0,
+		},
+		dataLabel: true,
+		dataPointShape:true,
+		xAxis: {
+			disableGrid: true,
+		},
+		yAxis: {
+			gridType: 'dash',
+			gridColor: '#CCCCCC',
+			dashLength: 8,
+			splitNumber: 4,
+			format: val => {
+				return val.toFixed(0);
+			}
+		},
+		extra: {
+			line:{
+				type: 'straight'
+			}
+		}
+	},
+	"column":{
+		type: 'column',
+		padding:[15,5,0,15],
+		legend:{
+			show:true,
+			padding:5,
+			lineHeight:11,
+			margin:0,
+		},
+		animation: true,
+		dataLabel: true,
+		xAxis: {
+			disableGrid:true,
+		},
+		yAxis: {
+		  data:[{
+		    position:'right',
+				axisLine:false,
+		    format:(val)=>{return val.toFixed(0)},
+		  }]
+		},
+		extra: {
+			column: {
+				type:'group',
+				width:30
+			}
+		}
+	},
+	"area":{
+		type: 'area',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+		},
+		dataLabel:true,
+		dataPointShape:true,
+		xAxis: {
+			disableGrid:true,
+		},
+		yAxis: {
+			gridType:'dash',
+			gridColor:'#CCCCCC',
+			dashLength:8,
+			splitNumber:5,
+		},
+		extra: {
+			area:{
+				type: 'straight',
+				opacity:0.2,
+				addLine:true,
+				width:2,
+				gradient:false
+			}
+		}
+	},
+	"radar":{
+		type: 'radar',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+			padding:5,
+			lineHeight:11,
+			margin:0,
+		},
+		animation: true,
+		dataLabel: true,
+		extra: {
+			radar: {
+				max: 200,
+				gridType:'radar'//radar或者circle可选,网格样式,默认radar
+			}
+		}
+	},
+	"gauge":{
+		type: 'gauge',
+		legend:{show:false},
+		animation: true,
+		dataLabel: true,
+		title: {
+			name: "字符串类型",
+			color: '#00FF00',
+			fontSize: 25,
+			offsetY:50,
+		},
+		subtitle: {
+			name: "字符串类型",
+			color: '#666666',
+			fontSize: 15,
+			offsetY:-50,
+		},
+		extra: {
+			gauge:{
+				type:'default',
+				width: 30,
+				startAngle:0.75,
+				endAngle:0.25,
+				startNumber:0,
+				endNumber:100,
+				splitLine:{
+					fixRadius:0,
+					splitNumber:10,
+					width: 30,
+					color:'#FFFFFF',
+					childNumber:5,
+					childWidth:30*0.4,
+				},
+				pointer:{
+					width: 30*0.8,
+					color:'auto'
+				}
+			}
+		}
+	},
+	"candle":{
+		type: 'candle',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+			padding:5,
+			lineHeight:11,
+			margin:8,
+		},
+		enableMarkLine: true,
+		enableScroll: true,
+		dataLabel: false,
+		dataPointShape: true,
+		xAxis: {
+			disableGrid:true,
+			labelCount:4,
+			itemCount:5,
+			scrollShow:true,
+			scrollAlign:'right',
+		},
+		yAxis: {
+			gridType:'dash',
+			splitNumber:5,
+			format:(val)=>{return val.toFixed(0)}
+		},
+		extra: {
+			candle:{
+				color:{
+					upLine:'#f04864',
+					upFill:'#f04864',
+					downLine:'#2fc25b',
+					downFill:'#2fc25b'
+				},
+				average:{
+					show:true,
+					name:['MA5','MA10','MA30'],
+					day:[5,10,20],
+					color:['#1890ff', '#2fc25b', '#facc14']
+				}
+			},
+			tooltip:{
+				bgColor:'#000000',
+				bgOpacity:0.7,
+				gridType:'dash',
+				dashLength:5,
+				gridColor:'#1890ff',
+				fontColor:'#FFFFFF',
+				horizentalLine:true,
+				xAxisLabel:true,
+				yAxisLabel:true,
+				labelBgColor:'#DFE8FF',
+				labelBgOpacity:0.95,
+				labelAlign:'left',
+				labelFontColor:'#666666'
+			},
+		  markLine: {
+		    type: 'dash',
+		    dashLength: 5,
+		    data: [{
+		      value:2150,
+		      lineColor: '#f04864',
+		      showLabel:true
+		    },{
+		      value:2350,
+		      lineColor: '#f04864',
+		      showLabel:true
+		    }]
+		  }
+		}
+	},
+	"mix":{
+		type: 'mix',
+		padding:[15,15,0,15],
+		legend:{
+			show:true,
+		  position:'bottom',
+		  float:'center',
+			padding:5,
+			lineHeight:11,
+			margin:6,
+		},
+		dataLabel: true,
+		dataPointShape: true,
+		xAxis: {
+			disableGrid:true,
+		},
+		yAxis: {
+		  data:[{
+		    calibration:true,
+		    position:'left',
+		    title:'折线',
+		    titleFontSize:12,
+		    format:(val)=>{return val.toFixed(0)+'度'}
+		  },{
+		    calibration:true,
+		    position:'right',
+		    min:0,
+		    max:200,
+		    title:'柱状图',
+		    titleFontSize:12,
+		    format:(val)=>{return val.toFixed(0)+'元'}
+		  },{
+		    calibration:true,
+		    position:'right',
+		    min:0,
+		    max:200,
+		    title:'点',
+		    titleFontSize:12
+		  }],
+		  showTitle:true,
+			gridType:'dash',
+			dashLength:4,
+			splitNumber:5
+		},
+		extra: {
+		  column:{
+		    width:20
+		  }
+		}
+	},
+	"point":{
+		type: 'point',
+		padding:[15,30,0,15],
+		legend:{
+			show:true
+		},
+		dataLabel: false,
+		dataPointShape:true,
+		xAxis: {
+			disableGrid: true,
+			labelCount: 4
+		},
+		yAxis: {
+			gridType: 'dash',
+			gridColor: '#CCCCCC',
+			dashLength: 8,
+			splitNumber: 4,
+			format: val => {
+				return val.toFixed(1);
+			}
+		},
+		extra: {
+			point:{
+			}
+		}
+	},
+	"bubble":{
+		type: 'bubble',
+		padding:[15,30,0,15],
+		legend:{
+			show:true
+		},
+		dataLabel: true,
+		xAxis: {
+			disableGrid: true,
+			labelCount: 4
+		},
+		yAxis: {
+			gridType: 'dash',
+			gridColor: '#CCCCCC',
+			dashLength: 8,
+			splitNumber: 4,
+			format: val => {
+				return val.toFixed(1);
+			}
+		},
+		extra: {
+			bubble:{
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/js_sdk/u-charts/u-charts.js b/js_sdk/u-charts/u-charts.js
new file mode 100644
index 0000000..5bc52e9
--- /dev/null
+++ b/js_sdk/u-charts/u-charts.js
@@ -0,0 +1,5687 @@
+/*
+ * uCharts v1.9.6.20210214
+ * uni-app平台高性能跨全端图表,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)
+ * Copyright (c) 2021 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: 22,
+  xAxisLineHeight: 22,
+  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) {
+      if(item.data[1] - item.data[0] < 0){
+      	color[1] = downColor;
+      }else{
+      	color[1] = upColor;
+      }
+    } 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 && calPoints.length>0){
+		for(let i=1;i<opts.chartData.xAxisPoints.length;i++){
+				xAxisPoints.push(opts.chartData.xAxisPoints[i]-spacing)
+		}
+		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.toString().indexOf('Array')>-1) {
+        return item !== null;
+      } else {
+        return item.value !== null;
+      }
+    } else {
+      return item !== null;
+    }
+  });
+  data.map(function(item) {
+    if (typeof item === 'object') {
+      if (item.constructor.toString().indexOf('Array')>-1) {
+				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.toString().indexOf('Array')>-1) {
+					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.toString().indexOf('Array')>-1) {
+        return item !== null;
+      } else {
+        return item.value !== null;
+      }
+    } else {
+      return item !== null;
+    }
+  });
+  data.map(function(item) {
+    if (typeof item === 'object') {
+      if (item.constructor.toString().indexOf('Array')>-1) {
+				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) { //Merge pull request !12 from 邱贵翔
+    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);
+            }
+          };
+        } 
+				if (lineOption.type === 'straight') {
+          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);
+            }
+          };
+        }
+				if (lineOption.type === 'step') {
+				  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, points[j-1].y);
+				      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',
+		gridType: 'radar',
+    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];
+
+  // 画分割线
+  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();
+	
+  // 画背景网格
+  var _loop = function _loop(i) {
+    var startPos = {};
+    context.beginPath();
+    context.setLineWidth(1 * opts.pixelRatio);
+    context.setStrokeStyle(radarOption.gridColor);
+		if(radarOption.gridType=='radar'){
+			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);
+		}else{
+			var pos = convertCoordinateOrigin(radius / radarOption.gridCount * i * Math.cos(1.5), radius / radarOption.gridCount * i * Math.sin(1.5), centerPosition);
+			context.arc(centerPosition.x, centerPosition.y, centerPosition.y - pos.y, 0, 2 * Math.PI, false);
+		}
+    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.delEventListener = function(type) {
+	this.events[type] = [];
+};
+
+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;
+	opts.canvas2d = opts.canvas2d ? 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;
+  this.context = opts.context ? opts.context : uni.createCanvasContext(opts.canvasId, opts.$this);
+	
+	if(opts.canvas2d){
+		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(){ }
+	}
+  /* 兼容原生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.delEventListener = function(type) {
+  this.event.delEventListener(type);
+};
+
+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方式导出
+}
diff --git a/js_sdk/u-charts/u-charts.vue b/js_sdk/u-charts/u-charts.vue
new file mode 100644
index 0000000..1301e1e
--- /dev/null
+++ b/js_sdk/u-charts/u-charts.vue
@@ -0,0 +1,446 @@
+<template>
+	<view class="chartsview" :style="{ background: background }">
+		<view v-show="mixinDatacomLoading"><view class="uni-icons-spinner-cycle">Loading...</view></view>
+		<view v-show="mixinDatacomErrorMessage">
+			<view class="uni-icons-info-filled">{{ mixinDatacomErrorMessage }}</view>
+		</view>
+		
+		<canvas
+			:id="canvasId"
+			:canvas-id="canvasId"
+			:style="{ width: cWidth + 'px', height: cHeight + 'px' }"
+			:type="canvas2d?'2d':''"
+			@tap="tap"
+			@cilck="tap"
+			@touch="tap"
+			@touchstart="touchStart"
+			@touchmove="touchMove"
+			@touchend="touchEnd"
+			@mousemove="mouseMove"
+			@mousedown="mousedown"
+			@mouseup="mouseup"
+			@error="error"
+			v-show="showchart"
+		/>
+		
+	</view>
+</template>
+
+<script>
+import qiunCharts from '../../js_sdk/u-charts/u-charts.js';
+import config from '../../js_sdk/u-charts/config.js';
+var canvases = {};
+var options = {};
+var chartdom = null;
+export default {
+	mixins: [uniCloud.mixinDatacom],
+	props: {
+		type: {
+			type: String,
+			default: null
+		},
+		canvasId: {
+			type: String,
+			default: "uchartsid"
+		},
+		canvas2d: {
+			type: Boolean,
+			default: false
+		},
+		pixelRatio: {
+			type: Number,
+			default: 1
+		},
+		background: {
+			type: String,
+			default: 'none'
+		},
+		animation:{
+			type: Boolean,
+			default: true
+		},
+		chartData: {
+			type: Object,
+			default() {
+				return {
+					categories: [],
+					series: []
+				};
+			}
+		},
+		opts: {
+			type: Object,
+			default: () => ({})
+		},
+		inScrollView:{
+			type: Boolean,
+			default: false
+		},
+		show:{
+			type: Boolean,
+			default: false
+		}
+	},
+	data() {
+		return {
+			cWidth: 375,
+			cHeight: 250,
+			showchart: false,
+			defaultOpts: {}
+		};
+	},
+	mounted() {
+		if(this.canvasId=='uchartsid'){
+			console.warn("注意:请在uCharts组件传入canvasId,以免单页多图产生图表错乱!")
+		}
+		if (this.type && config.type.includes(this.type)) {
+			this.defaultOpts = Object.assign({},config[this.type])
+			this.load()
+		} else {
+			this.mixinDatacomLoading = false
+			this.showchart = false
+			this.mixinDatacomErrorMessage = '参数错误:props参数中type类型不正确'
+		}
+		uni.onWindowResize(res => {
+			this.init()
+		})
+	},
+	watch: {
+		chartData(val, oldval) {
+			if (!this.type || !config.type.includes(this.type)) {
+				this.mixinDatacomLoading = false
+				this.showchart = false
+				this.mixinDatacomErrorMessage = '参数错误:props参数中type不正确'
+				return
+			}
+			if (typeof val === 'object') {
+				if (this.collection != '') {
+					if (config.categories.includes(this.type) && val.categories.length == 0 ) {
+						this.mixinDatacomLoading = false
+						this.showchart = false
+						this.mixinDatacomErrorMessage = '数据错误:chartData中缺少categories'
+					} else {
+						this.mixinDatacomLoading = false
+						this.mixinDatacomErrorMessage = null
+						this.$nextTick(function() {
+							this.init()
+						})
+					}
+				} else {
+					this.mixinDatacomLoading = false
+					this.mixinDatacomErrorMessage = null
+					this.$nextTick(function() {
+						this.init()
+					});
+				}
+			} else {
+				this.mixinDatacomLoading = false
+				this.showchart = false
+				this.mixinDatacomErrorMessage = '参数错误:chartData数据类型错误'
+			}
+		},
+		show(val, oldval) {
+			if (val) {
+				if (this.collection != '') {
+					if (config.categories.includes(this.type) && this.chartData.categories.length == 0 ) {
+						this.mixinDatacomLoading = false
+						this.showchart = false
+						this.mixinDatacomErrorMessage = '数据错误:chartData中缺少categories'
+					} else {
+						this.mixinDatacomLoading = false
+						this.mixinDatacomErrorMessage = null
+						this.$nextTick(function() {
+							this.init()
+						})
+					}
+				} else {
+					this.mixinDatacomLoading = false
+					this.mixinDatacomErrorMessage = null
+					this.$nextTick(function() {
+						this.init()
+					});
+				}
+			}
+		}
+	},
+	methods: {
+		load() {
+			if (this.mixinDatacomLoading == true) {
+				return
+			}
+			this.mixinDatacomLoading = true
+			if (this.collection != '') {
+				this.mixinDatacomGet()
+					.then(res => {
+						this.mixinDatacomLoading = false
+						const { data, count } = res.result
+						this.mixinDatacomResData = data
+						if (config.categories.includes(this.type) && this.chartData.categories.length == 0) {
+							this.mixinDatacomLoading = false
+							this.showchart = false
+							this.mixinDatacomErrorMessage = '数据错误:chartData中缺少categories'
+						} else {
+							this.init()
+						}
+					})
+					.catch(err => {
+						if (this.collection == '') {
+							if (this.chartData.series.length > 0) {
+								this.mixinDatacomLoading = false
+								this.init()
+							}
+						} else {
+							this.mixinDatacomLoading = false
+							this.showchart = false
+							this.mixinDatacomErrorMessage = '请求错误:' + err
+						}
+					});
+			}else{
+				if (this.chartData.series.length > 0) {
+					this.mixinDatacomLoading = false
+					this.init()
+				}
+			}
+		},
+		onMixinDatacomPropsChange(needReset, changed) {
+			if (needReset) {
+				if(options[this.canvasId] !== undefined){
+					options[this.canvasId].context.clearRect(0, 0, options[this.canvasId].width, options[this.canvasId].height)
+					options[this.canvasId].context.draw()
+				}
+				this.showchart = false;
+				this.load()
+			}
+		},
+		cloudDataInit() {
+			let temp = {}
+			let series=[]
+			let resdata = this.mixinDatacomResData
+			let categories = options[this.canvasId].categories
+			resdata.map(function (item, index) {
+				if(item.type!=undefined && !temp[item.type]){
+					series.push({name:item.type,data:[]})
+					temp[item.type] = true;
+				}
+			})
+			if(series.length==0){
+				let seriesname="默认分组"
+				if(this.chartData.series.length>0){
+					seriesname=this.chartData.series[0].name
+				}
+				series=[{name:seriesname,data:[]}]
+				for (let j = 0; j < categories.length; j++) {
+					let seriesdata = 0;
+					for (let i = 0; i < resdata.length; i++) {
+						if(resdata[i].label == categories[j]){
+							seriesdata = resdata[i].value
+						}
+					}
+					series[0].data.push(seriesdata)
+				}
+			}else{
+				for (let k = 0; k < series.length; k++) {
+					if(categories.length>0){
+						for (let j = 0; j < categories.length; j++) {
+							let seriesdata = 0;
+							for (let i = 0; i < resdata.length; i++) {
+								if(series[k].name == resdata[i].type && resdata[i].label == categories[j]){
+									seriesdata = resdata[i].value
+								}
+							}
+							series[k].data.push(seriesdata)
+						}
+					}else{
+						for (let i = 0; i < resdata.length; i++) {
+							if(series[k].name == resdata[i].type){
+								series[k].data.push(resdata[i].type)
+							}
+						}
+					}
+				}
+			}
+			return series;
+		},
+		init() {
+			chartdom = uni.createSelectorQuery().in(this).select('.chartsview');
+			chartdom.boundingClientRect(data => {
+				console.log(data)
+				if(data.width>0 && data.height>0){
+					this.cWidth = data.width
+					this.cHeight = data.height
+					options[this.canvasId] = Object.assign(this.defaultOpts, this.opts)
+					options[this.canvasId].canvasId = this.canvasId
+					options[this.canvasId].categories = this.chartData.categories
+					if (this.collection == '') {
+						options[this.canvasId].series = this.chartData.series
+					}else{
+						options[this.canvasId].series = this.cloudDataInit()
+					}
+					options[this.canvasId].background = this.background == 'none' ? '#FFFFFF' : this.background
+					options[this.canvasId].pixelRatio = this.pixelRatio
+					options[this.canvasId].animation = this.animation
+					options[this.canvasId].width = data.width * this.pixelRatio
+					options[this.canvasId].height = data.height * this.pixelRatio
+					if(this.canvas2d){
+						options[this.canvasId].canvas2d = this.canvas2d
+						const query = uni.createSelectorQuery().in(this)
+						query.select('#'+this.canvasId)
+							.fields({ node: true, size: true })
+							.exec((res) => {
+								const canvas = res[0].node
+								const ctx = canvas.getContext('2d')
+								options[this.canvasId].context = ctx
+								canvas.width = data.width * this.pixelRatio
+								canvas.height = data.height * this.pixelRatio
+								canvas._width = data.width * this.pixelRatio
+								canvas._height = data.height * this.pixelRatio
+								if(!this.mixinDatacomLoading){
+									this.showchart = true
+								}
+								this.newChart()
+							})
+					}else{
+						options[this.canvasId].context = uni.createCanvasContext(this.canvasId,this)
+						if(!this.mixinDatacomLoading){
+							this.showchart = true
+						}
+						this.newChart()
+					}
+				}else{
+					this.mixinDatacomLoading = false
+					this.showchart = false
+					this.mixinDatacomErrorMessage = '布局错误:请尝试props绑定show状态'
+				}
+			}).exec();
+		},
+		newChart() {
+			canvases[this.canvasId] = new qiunCharts(options[this.canvasId])
+			canvases[this.canvasId].addEventListener('renderComplete', () => {
+				this.$emit("complete",{complete:true,charts:canvases[this.canvasId]})
+			});
+			canvases[this.canvasId].addEventListener('scrollLeft', () => {
+				this.$emit("scrollLeft",{scrollLeft:true,charts:canvases[this.canvasId]})
+			});
+			canvases[this.canvasId].addEventListener('scrollRight', () => {
+				this.$emit("scrollRight",{scrollRight:true,charts:canvases[this.canvasId]})
+			});
+		},
+		tap(e) {
+			let currentIndex=null
+			let legendIndex=null
+			if(this.inScrollView){
+				e.type = 'click'
+			}
+			if (e.type == 'click') {
+				chartdom = uni.createSelectorQuery().in(this).select('.chartsview')
+				chartdom.boundingClientRect(data => {
+					e.changedTouches.unshift({ x: e.detail.x - data.left, y: e.detail.y - data.top })
+					e.mp.changedTouches.unshift({ x: e.detail.x - data.left, y: e.detail.y - data.top })
+					canvases[this.canvasId].touchLegend(e)
+					canvases[this.canvasId].showToolTip(e, {
+						format: function(item, category) {
+							if(category){
+								return category + ' ' + item.name + ':' + item.data
+							}else{
+								return item.name + ':' + item.data
+							}
+						}
+					})
+					currentIndex=canvases[this.canvasId].getCurrentDataIndex(e)
+					legendIndex=canvases[this.canvasId].getLegendDataIndex(e) 
+					this.$emit("getIndex",{event:e,currentIndex:currentIndex,legendIndex:legendIndex,charts:canvases[this.canvasId]})
+				}).exec();
+			} else {
+				e.changedTouches.unshift({ x: e.detail.x - e.currentTarget.offsetLeft, y: e.detail.y - e.currentTarget.offsetTop })
+				e.mp.changedTouches.unshift({ x: e.detail.x - e.currentTarget.offsetLeft, y: e.detail.y - e.currentTarget.offsetTop })
+				canvases[this.canvasId].touchLegend(e)
+				canvases[this.canvasId].showToolTip(e, {
+					format: function(item, category) {
+						if(category){
+							return category + ' ' + item.name + ':' + item.data
+						}else{
+							return item.name + ':' + item.data
+						}
+					}
+				});
+				currentIndex=canvases[this.canvasId].getCurrentDataIndex(e)
+				legendIndex=canvases[this.canvasId].getLegendDataIndex(e) 
+				this.$emit("getIndex",{event:e,currentIndex:currentIndex,legendIndex:legendIndex,charts:canvases[this.canvasId]})
+			}
+		},
+		touchStart(e) {
+			canvases[this.canvasId].scrollStart(e)
+			this.$emit("touchStart",{event:e,charts:canvases[this.canvasId]})
+		},
+		touchMove(e) {
+			canvases[this.canvasId].scroll(e)
+			this.$emit("touchMove",{event:e,charts:canvases[this.canvasId]})
+		},
+		touchEnd(e) {
+			canvases[this.canvasId].scrollEnd(e)
+			this.$emit("touchEnd",{event:e,charts:canvases[this.canvasId]})
+		},
+		mousedown(e){
+			if(options[this.canvasId].enableScroll){
+				chartdom = uni.createSelectorQuery().in(this).select('.chartsview')
+				chartdom.boundingClientRect(data => {
+					e.changedTouches.unshift({ x: e.pageX - data.left, y: e.clientY-data.top })
+					e.mp.changedTouches.unshift({ x: e.pageX - data.left, y: e.clientY-data.top })
+					canvases[this.canvasId].scrollStart(e)
+					options[this.canvasId].mousedown=true;
+					this.$emit("touchStart",{event:e,charts:canvases[this.canvasId]})
+				}).exec();
+			}
+		},
+		mouseMove(e) {
+			if (options[this.canvasId].series.length > 0) {
+				chartdom = uni.createSelectorQuery().in(this).select('.chartsview')
+				chartdom.boundingClientRect(data => {
+					e.changedTouches.unshift({ x: e.pageX - data.left, y: e.clientY-data.top })
+					e.mp.changedTouches.unshift({ x: e.pageX - data.left, y: e.clientY-data.top })
+					if(options[this.canvasId].enableScroll && options[this.canvasId].mousedown){
+						canvases[this.canvasId].scroll(e)
+						this.$emit("touchMove",{event:e,charts:canvases[this.canvasId]})
+					}else{
+						canvases[this.canvasId].showToolTip(e, {
+							format: function(item, category) {
+								if(category){
+									return category + ' ' + item.name + ':' + item.data
+								}else{
+									return item.name + ':' + item.data
+								}
+							}
+						});
+					}
+				}).exec()
+			}
+		},
+		mouseup(e){
+			if(options[this.canvasId].enableScroll){
+				chartdom = uni.createSelectorQuery().in(this).select('.chartsview')
+				chartdom.boundingClientRect(data => {
+					e.changedTouches.unshift({ x: e.pageX - data.left, y: e.clientY-data.top })
+					e.mp.changedTouches.unshift({ x: e.pageX - data.left, y: e.clientY-data.top })
+					canvases[this.canvasId].scrollEnd(e)
+					options[this.canvasId].mousedown=false;
+					this.$emit("touchEnd",{event:e,charts:canvases[this.canvasId]})
+				}).exec();
+			}
+		},
+		error(e) {
+			console.log(e)
+		}
+	}
+};
+</script>
+
+<style scoped>
+.chartsview {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	flex: 1;
+	justify-content: center;
+	align-items: center;
+}
+</style>
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..eaf0b29
--- /dev/null
+++ b/main.js
@@ -0,0 +1,29 @@
+import Vue from 'vue'
+import App from './App'
+import store from './store'//本地缓存
+import './static/font-awesome/font-awesome.css'
+import nothing from './util/nothing'//常用方法
+import AppContext from './util/AppContext'//构造方法
+import Env from './util/Env'//配置文件
+import base from './util/base.js'
+import http from './util/http.js';
+import './css/uni.css'
+import './static/iconfont/iconfont.css'
+Vue.config.productionTip = false
+Vue.prototype.$store = store
+Vue.prototype.$nothing = nothing
+Vue.prototype.$AppContext = AppContext
+Vue.prototype.$Env = Env
+Vue.prototype.$base = base
+Vue.prototype.$http = http
+App.mpType = 'app'
+const app = new Vue({
+	store,
+	nothing,
+	AppContext,
+	...App,
+	mounted() {
+		AppContext.initialize(this)
+	}
+})
+app.$mount()
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..180833b
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,115 @@
+{
+    "name" : "mobile-phone-shell-applet",
+    "appid" : "__UNI__AB0E0FC",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+	"networkTimeout":{
+		"uploadFile":60000,
+		"request":60000
+	},
+    "app-plus" : {
+        /* 5+App特有相关 */
+        "usingComponents" : true,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "modules" : {
+            "OAuth" : {},
+            "Share" : {},
+            "Payment" : {}
+        },
+        /* 模块配置 */
+        "distribute" : {
+            /* 应用发布信息 */
+            "android" : {
+                /* android打包配置 */
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            "ios" : {},
+            /* ios打包配置 */
+            "sdkConfigs" : {
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wxd42f41a5f4efd7cb"
+                    }
+                },
+                "maps" : {},
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wxd42f41a5f4efd7cb"
+                    }
+                },
+                "push" : {},
+                "payment" : {
+                    "weixin" : {
+                        "appid" : "wxd42f41a5f4efd7cb"
+                    }
+                }
+            }
+        }
+    },
+    /* SDK配置 */
+    "quickapp" : {},
+    /* 快应用特有相关 */
+    "mp-weixin" : {
+        /* 小程序特有相关 */
+        "appid" : "wxdca8810ccd426633",
+        "setting" : {
+            "urlCheck" : true,
+            "postcss" : true,
+            "es6" : true,
+            "minified" : true,
+            "newFeature" : true,
+            "checkSiteMap" : false
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "获取当前位置"
+            }
+        },
+		"requiredPrivateInfos": ["getLocation","chooseAddress"]
+    },
+	//"requiredPrivateInfos": ["getLocation","chooseAddress"],
+    // "navigateToMiniProgramAppIdList":[ "wx55b5b6d95c648041"]
+    "h5" : {
+        "devServer" : {
+            "port" : 8088
+        },
+        "title" : "iphone",
+        "router" : {
+            "base" : ""
+        },
+        "domain" : "https://mall.onezxkj.com"
+    }
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..4b8b5ff
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,12475 @@
+{
+  "name": "mobile-phone-shell-applet",
+  "version": "1.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "mobile-phone-shell-applet",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "browserslist": "^4.19.1",
+        "build": "^0.1.4",
+        "caniuse-lite": "^1.0.30001299",
+        "crypto-js": "^4.1.1",
+        "echarts": "^4.9.0",
+        "flyio": "^0.6.14",
+        "font-awesome": "^4.7.0",
+        "js-base64": "^3.7.5",
+        "js-md5": "^0.7.3",
+        "jsfeat": "^0.0.8",
+        "jssha": "^2.4.2",
+        "jweixin-module": "^1.6.0",
+        "moment": "^2.27.0",
+        "mpvue-echarts": "^0.3.2",
+        "qs": "^6.9.4",
+        "string-random": "^0.1.3",
+        "unifly": "^1.0.2",
+        "vuex": "^3.5.1"
+      },
+      "devDependencies": {
+        "webpack": "^3.12.0",
+        "webpack-dev-server": "^2.11.5"
+      }
+    },
+    "node_modules/@dabh/diagnostics": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz",
+      "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==",
+      "dependencies": {
+        "colorspace": "1.1.x",
+        "enabled": "2.0.x",
+        "kuler": "^2.0.0"
+      }
+    },
+    "node_modules/accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "dev": true,
+      "dependencies": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "5.7.4",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+      "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-dynamic-import": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/acorn-dynamic-import/download/acorn-dynamic-import-2.0.2.tgz",
+      "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^4.0.3"
+      }
+    },
+    "node_modules/acorn-dynamic-import/node_modules/acorn": {
+      "version": "4.0.13",
+      "resolved": "http://r.cnpmjs.org/acorn/download/acorn-4.0.13.tgz",
+      "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.10.0",
+      "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz",
+      "integrity": "sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE=",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^2.0.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.4.1",
+      "resolved": "http://r.cnpmjs.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz",
+      "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=",
+      "dev": true,
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/align-text": {
+      "version": "0.1.4",
+      "resolved": "http://r.cnpmjs.org/align-text/download/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2",
+        "longest": "^1.0.1",
+        "repeat-string": "^1.5.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/align-text/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ansi-html": {
+      "version": "0.0.7",
+      "resolved": "http://r.cnpmjs.org/ansi-html/download/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true,
+      "engines": [
+        "node >= 0.8.0"
+      ],
+      "bin": {
+        "ansi-html": "bin/ansi-html"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/anymatch/download/anymatch-2.0.0.tgz",
+      "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+      "dev": true,
+      "dependencies": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      }
+    },
+    "node_modules/anymatch/node_modules/normalize-path": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/normalize-path/download/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "dev": true,
+      "dependencies": {
+        "remove-trailing-separator": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-diff": {
+      "version": "4.0.0",
+      "resolved": "http://r.cnpmjs.org/arr-diff/download/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
+      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-union": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/arr-union/download/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-find-index": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/array-find-index/download/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+      "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+      "dev": true
+    },
+    "node_modules/array-includes": {
+      "version": "3.0.3",
+      "resolved": "http://r.cnpmjs.org/array-includes/download/array-includes-3.0.3.tgz",
+      "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.7.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/array-union": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/array-union/download/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "dependencies": {
+        "array-uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-uniq": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/array-uniq/download/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-unique": {
+      "version": "0.3.2",
+      "resolved": "http://r.cnpmjs.org/array-unique/download/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dependencies": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "node_modules/asn1.js": {
+      "version": "4.10.1",
+      "resolved": "http://r.cnpmjs.org/asn1.js/download/asn1.js-4.10.1.tgz",
+      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/assert": {
+      "version": "1.5.0",
+      "resolved": "http://r.cnpmjs.org/assert/download/assert-1.5.0.tgz",
+      "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=",
+      "dev": true,
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      }
+    },
+    "node_modules/assert-plus": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/assert/node_modules/inherits": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.1.tgz",
+      "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+      "dev": true
+    },
+    "node_modules/assert/node_modules/util": {
+      "version": "0.10.3",
+      "resolved": "http://r.cnpmjs.org/util/download/util-0.10.3.tgz",
+      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "2.0.1"
+      }
+    },
+    "node_modules/assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/assign-symbols/download/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/async": {
+      "version": "2.6.3",
+      "resolved": "http://r.cnpmjs.org/async/download/async-2.6.3.tgz",
+      "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=",
+      "dev": true,
+      "dependencies": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "node_modules/async-each": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/async-each/download/async-each-1.0.3.tgz",
+      "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=",
+      "dev": true
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+    },
+    "node_modules/atob": {
+      "version": "2.1.2",
+      "resolved": "http://r.cnpmjs.org/atob/download/atob-2.1.2.tgz",
+      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=",
+      "dev": true,
+      "bin": {
+        "atob": "bin/atob.js"
+      },
+      "engines": {
+        "node": ">= 4.5.0"
+      }
+    },
+    "node_modules/aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/aws4": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+      "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA=="
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/balanced-match/download/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "node_modules/base": {
+      "version": "0.11.2",
+      "resolved": "http://r.cnpmjs.org/base/download/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "dev": true,
+      "dependencies": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+      "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base64-js": {
+      "version": "1.3.1",
+      "resolved": "http://r.cnpmjs.org/base64-js/download/base64-js-1.3.1.tgz",
+      "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=",
+      "dev": true
+    },
+    "node_modules/batch": {
+      "version": "0.6.1",
+      "resolved": "http://r.cnpmjs.org/batch/download/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "node_modules/bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dependencies": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "http://r.cnpmjs.org/big.js/download/big.js-5.2.2.tgz",
+      "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "http://r.cnpmjs.org/binary-extensions/download/binary-extensions-1.13.1.tgz",
+      "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "node_modules/bn.js": {
+      "version": "4.11.8",
+      "resolved": "http://r.cnpmjs.org/bn.js/download/bn.js-4.11.8.tgz",
+      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+      "dev": true
+    },
+    "node_modules/body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "dev": true,
+      "dependencies": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/body-parser/node_modules/bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/body-parser/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/qs": {
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/bonjour": {
+      "version": "3.5.0",
+      "resolved": "http://r.cnpmjs.org/bonjour/download/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "dependencies": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "http://r.cnpmjs.org/braces/download/braces-2.3.2.tgz",
+      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+      "dev": true,
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/braces/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/brorand": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/brorand/download/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "node_modules/browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/browserify-aes/download/browserify-aes-1.2.0.tgz",
+      "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=",
+      "dev": true,
+      "dependencies": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=",
+      "dev": true,
+      "dependencies": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "node_modules/browserify-des": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/browserify-des/download/browserify-des-1.0.2.tgz",
+      "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=",
+      "dev": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "node_modules/browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "http://r.cnpmjs.org/browserify-sign/download/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.0"
+      }
+    },
+    "node_modules/browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "http://r.cnpmjs.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+      "dev": true,
+      "dependencies": {
+        "pako": "~1.0.5"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.19.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001286",
+        "electron-to-chromium": "^1.4.17",
+        "escalade": "^3.1.1",
+        "node-releases": "^2.0.1",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "4.9.1",
+      "resolved": "http://r.cnpmjs.org/buffer/download/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "deprecated": "This version of 'buffer' is out-of-date. You must update to v4.9.2 or newer",
+      "dev": true,
+      "dependencies": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "node_modules/buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "node_modules/buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/buffer-xor/download/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "node_modules/build": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/build/-/build-0.1.4.tgz",
+      "integrity": "sha1-cH/gJv/O3crL/c3zVur9pk8VEEY=",
+      "dependencies": {
+        "cssmin": "0.3.x",
+        "jsmin": "1.x",
+        "jxLoader": "*",
+        "moo-server": "*",
+        "promised-io": "*",
+        "timespan": "2.x",
+        "uglify-js": "1.x",
+        "walker": "1.x",
+        "winston": "*",
+        "wrench": "1.3.x"
+      },
+      "engines": {
+        "node": ">v0.4.12"
+      }
+    },
+    "node_modules/build/node_modules/uglify-js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz",
+      "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0=",
+      "bin": {
+        "uglifyjs": "bin/uglifyjs"
+      }
+    },
+    "node_modules/builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "node_modules/bytes": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/bytes/download/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/cache-base": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/cache-base/download/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "dev": true,
+      "dependencies": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/camelcase": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001299",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
+      "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
+    },
+    "node_modules/caseless": {
+      "version": "0.12.0",
+      "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+    },
+    "node_modules/center-align": {
+      "version": "0.1.3",
+      "resolved": "http://r.cnpmjs.org/center-align/download/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "dev": true,
+      "dependencies": {
+        "align-text": "^0.1.3",
+        "lazy-cache": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "2.1.8",
+      "resolved": "http://r.cnpmjs.org/chokidar/download/chokidar-2.1.8.tgz",
+      "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=",
+      "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      },
+      "optionalDependencies": {
+        "fsevents": "^1.2.7"
+      }
+    },
+    "node_modules/cipher-base": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/cipher-base/download/cipher-base-1.0.4.tgz",
+      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/class-utils": {
+      "version": "0.3.6",
+      "resolved": "http://r.cnpmjs.org/class-utils/download/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "dev": true,
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/class-utils/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "3.2.0",
+      "resolved": "http://r.cnpmjs.org/cliui/download/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "node_modules/code-point-at": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/code-point-at/download/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/collection-visit": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/collection-visit/download/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "dependencies": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/color": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
+      "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
+      "dependencies": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.2"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "http://r.cnpmjs.org/color-convert/download/color-convert-1.9.3.tgz",
+      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "http://r.cnpmjs.org/color-name/download/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "node_modules/color-string": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
+      "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
+      "dependencies": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "node_modules/colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+      "engines": {
+        "node": ">=0.1.90"
+      }
+    },
+    "node_modules/colorspace": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz",
+      "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==",
+      "dependencies": {
+        "color": "3.0.x",
+        "text-hex": "1.0.x"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/component-emitter": {
+      "version": "1.3.0",
+      "resolved": "http://r.cnpmjs.org/component-emitter/download/component-emitter-1.3.0.tgz",
+      "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=",
+      "dev": true
+    },
+    "node_modules/compressible": {
+      "version": "2.0.17",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
+      "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==",
+      "dev": true,
+      "dependencies": {
+        "mime-db": ">= 1.40.0 < 2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "dev": true,
+      "dependencies": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/compression/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "http://r.cnpmjs.org/concat-map/download/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "node_modules/connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/console-browserify": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/console-browserify/download/console-browserify-1.2.0.tgz",
+      "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=",
+      "dev": true
+    },
+    "node_modules/constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/constants-browserify/download/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "5.1.2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "http://r.cnpmjs.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "node_modules/copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "node_modules/create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "http://r.cnpmjs.org/create-ecdh/download/create-ecdh-4.0.3.tgz",
+      "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      }
+    },
+    "node_modules/create-hash": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/create-hash/download/create-hash-1.2.0.tgz",
+      "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=",
+      "dev": true,
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "node_modules/create-hmac": {
+      "version": "1.1.7",
+      "resolved": "http://r.cnpmjs.org/create-hmac/download/create-hmac-1.1.7.tgz",
+      "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=",
+      "dev": true,
+      "dependencies": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "node_modules/crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "http://r.cnpmjs.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+      "dev": true,
+      "dependencies": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/crypto-js": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+      "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+    },
+    "node_modules/cssmin": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.3.2.tgz",
+      "integrity": "sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0=",
+      "bin": {
+        "cssmin": "bin/cssmin"
+      }
+    },
+    "node_modules/currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "http://r.cnpmjs.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "dependencies": {
+        "array-find-index": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/d": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/d/download/d-1.0.1.tgz",
+      "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=",
+      "dev": true,
+      "dependencies": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
+    "node_modules/dashdash": {
+      "version": "1.14.1",
+      "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/debug": {
+      "version": "3.2.6",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+      "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/debug/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/decamelize": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/decamelize/download/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "http://r.cnpmjs.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz",
+      "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==",
+      "dev": true,
+      "dependencies": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "dependencies": {
+        "object-keys": "^1.0.12"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+      "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/del": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/del/download/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "dependencies": {
+        "globby": "^6.1.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "p-map": "^1.1.1",
+        "pify": "^3.0.0",
+        "rimraf": "^2.2.8"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/del/node_modules/pify": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/pify/download/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/depd": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/depd/download/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/des.js": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/des.js/download/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "node_modules/detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+      "dev": true
+    },
+    "node_modules/diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "http://r.cnpmjs.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "node_modules/dns-equal": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/dns-equal/download/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "node_modules/dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "dependencies": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/dns-txt": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/dns-txt/download/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "dependencies": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "node_modules/domain-browser": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/domain-browser/download/domain-browser-1.2.0.tgz",
+      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4",
+        "npm": ">=1.2"
+      }
+    },
+    "node_modules/ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dependencies": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/echarts": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz",
+      "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
+      "dependencies": {
+        "zrender": "4.3.2"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "http://r.cnpmjs.org/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.45",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz",
+      "integrity": "sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg=="
+    },
+    "node_modules/elliptic": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      }
+    },
+    "node_modules/emojis-list": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/emojis-list/download/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/enabled": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+      "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "3.4.1",
+      "resolved": "http://r.cnpmjs.org/enhanced-resolve/download/enhanced-resolve-3.4.1.tgz",
+      "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "object-assign": "^4.0.1",
+        "tapable": "^0.2.7"
+      },
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/enhanced-resolve/node_modules/tapable": {
+      "version": "0.2.9",
+      "resolved": "http://r.cnpmjs.org/tapable/download/tapable-0.2.9.tgz",
+      "integrity": "sha1-ry2LvJsE907hevK02QSPgHrNGKg=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/errno": {
+      "version": "0.1.7",
+      "resolved": "http://r.cnpmjs.org/errno/download/errno-0.1.7.tgz",
+      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
+      "dev": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "http://r.cnpmjs.org/error-ex/download/error-ex-1.3.2.tgz",
+      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+      "dev": true,
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/es-abstract": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
+      "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+      "dev": true,
+      "dependencies": {
+        "es-to-primitive": "^1.2.0",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.0",
+        "is-callable": "^1.1.4",
+        "is-regex": "^1.0.4",
+        "object-inspect": "^1.6.0",
+        "object-keys": "^1.1.1",
+        "string.prototype.trimleft": "^2.1.0",
+        "string.prototype.trimright": "^2.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+      "dev": true,
+      "dependencies": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es5-ext": {
+      "version": "0.10.52",
+      "resolved": "http://r.cnpmjs.org/es5-ext/download/es5-ext-0.10.52.tgz",
+      "integrity": "sha1-uyF3fpGaBCY3Nt7RIKnWZfEOpj8=",
+      "dev": true,
+      "dependencies": {
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.2",
+        "next-tick": "~1.0.0"
+      }
+    },
+    "node_modules/es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/es6-iterator/download/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "node_modules/es6-map": {
+      "version": "0.1.5",
+      "resolved": "http://r.cnpmjs.org/es6-map/download/es6-map-0.1.5.tgz",
+      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+      "dev": true,
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-set": "~0.1.5",
+        "es6-symbol": "~3.1.1",
+        "event-emitter": "~0.3.5"
+      }
+    },
+    "node_modules/es6-set": {
+      "version": "0.1.5",
+      "resolved": "http://r.cnpmjs.org/es6-set/download/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "dev": true,
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "~0.3.5"
+      }
+    },
+    "node_modules/es6-set/node_modules/es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "http://r.cnpmjs.org/es6-symbol/download/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "dev": true,
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "node_modules/es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "http://r.cnpmjs.org/es6-symbol/download/es6-symbol-3.1.3.tgz",
+      "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=",
+      "dev": true,
+      "dependencies": {
+        "d": "^1.0.1",
+        "ext": "^1.1.2"
+      }
+    },
+    "node_modules/es6-weak-map": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz",
+      "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=",
+      "dev": true,
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "^0.10.46",
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "node_modules/escope": {
+      "version": "3.6.0",
+      "resolved": "http://r.cnpmjs.org/escope/download/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "dev": true,
+      "dependencies": {
+        "es6-map": "^0.1.3",
+        "es6-weak-map": "^2.0.1",
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.2.1",
+      "resolved": "http://r.cnpmjs.org/esrecurse/download/esrecurse-4.2.1.tgz",
+      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "http://r.cnpmjs.org/estraverse/download/estraverse-4.3.0.tgz",
+      "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "http://r.cnpmjs.org/etag/download/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/event-emitter": {
+      "version": "0.3.5",
+      "resolved": "http://r.cnpmjs.org/event-emitter/download/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "dev": true,
+      "dependencies": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "node_modules/eventemitter3": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+      "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
+      "dev": true
+    },
+    "node_modules/events": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/events/download/events-3.0.0.tgz",
+      "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/eventsource": {
+      "version": "0.1.6",
+      "resolved": "http://r.cnpmjs.org/eventsource/download/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "dev": true,
+      "dependencies": {
+        "original": ">=0.0.5"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+      "dev": true,
+      "dependencies": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "http://r.cnpmjs.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "dependencies": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "http://r.cnpmjs.org/debug/download/debug-2.6.9.tgz",
+      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "dev": true,
+      "dependencies": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/express/node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "http://r.cnpmjs.org/array-flatten/download/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/qs": {
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/ext": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/ext/download/ext-1.1.2.tgz",
+      "integrity": "sha1-0dIWyDZBu0y3aEYisGPP9EoZzjU=",
+      "dev": true,
+      "dependencies": {
+        "type": "^2.0.0"
+      }
+    },
+    "node_modules/ext/node_modules/type": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/type/download/type-2.0.0.tgz",
+      "integrity": "sha1-Xxb/bvLrRPJgSU2uJxAzspwJqcM=",
+      "dev": true
+    },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extend-shallow/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-extendable/download/is-extendable-1.0.1.tgz",
+      "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/extglob/download/extglob-2.0.4.tgz",
+      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "dev": true,
+      "dependencies": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+      "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extsprintf": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "engines": [
+        "node >=0.6.0"
+      ]
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz",
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+    },
+    "node_modules/fast-safe-stringify": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
+    },
+    "node_modules/faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "http://r.cnpmjs.org/faye-websocket/download/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "dependencies": {
+        "websocket-driver": ">=0.5.1"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/fecha": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz",
+      "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg=="
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "http://r.cnpmjs.org/fill-range/download/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fill-range/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "dev": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/flyio": {
+      "version": "0.6.14",
+      "resolved": "https://registry.npmjs.org/flyio/-/flyio-0.6.14.tgz",
+      "integrity": "sha512-RE2OXE1ZZmcXOKb0jCtGyquHDxpAqHg17CZ8lmQKRfl3x1kP+NBpaQDx4WgN7DNpLJjFnspTzTEQpwRGg6/xaA==",
+      "dependencies": {
+        "request": "^2.85.0"
+      }
+    },
+    "node_modules/fn.name": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+      "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+      "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/font-awesome": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npm.taobao.org/font-awesome/download/font-awesome-4.7.0.tgz",
+      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=",
+      "engines": {
+        "node": ">=0.10.3"
+      }
+    },
+    "node_modules/for-in": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/for-in/download/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/forever-agent": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.1.2",
+      "resolved": "http://r.cnpmjs.org/forwarded/download/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "dependencies": {
+        "map-cache": "^0.2.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "http://r.cnpmjs.org/fresh/download/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "node_modules/fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "dependencies": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      },
+      "engines": {
+        "node": ">= 4.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "node_modules/get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/get-caller-file/download/get-caller-file-1.0.3.tgz",
+      "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=",
+      "dev": true
+    },
+    "node_modules/get-stdin": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/get-stdin/download/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/get-value": {
+      "version": "2.0.6",
+      "resolved": "http://r.cnpmjs.org/get-value/download/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/getpass": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.1.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
+      "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/glob-parent/download/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      }
+    },
+    "node_modules/glob-parent/node_modules/is-glob": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/is-glob/download/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/globby": {
+      "version": "6.1.0",
+      "resolved": "http://r.cnpmjs.org/globby/download/globby-6.1.0.tgz",
+      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+      "dev": true,
+      "dependencies": {
+        "array-union": "^1.0.1",
+        "glob": "^7.0.3",
+        "object-assign": "^4.0.1",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.3",
+      "resolved": "http://r.cnpmjs.org/graceful-fs/download/graceful-fs-4.2.3.tgz",
+      "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=",
+      "dev": true
+    },
+    "node_modules/handle-thing": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
+      "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
+      "dev": true
+    },
+    "node_modules/har-schema": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "deprecated": "this library is no longer supported",
+      "dependencies": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/har-validator/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "node_modules/har-validator/node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/has-flag/download/has-flag-2.0.0.tgz",
+      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/has-symbols/download/has-symbols-1.0.0.tgz",
+      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/has-value": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/has-value/download/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "dependencies": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/has-values/download/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/kind-of": {
+      "version": "4.0.0",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-4.0.0.tgz",
+      "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/hash-base": {
+      "version": "3.0.4",
+      "resolved": "http://r.cnpmjs.org/hash-base/download/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "node_modules/hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "dependencies": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/hosted-git-info": {
+      "version": "2.8.5",
+      "resolved": "http://r.cnpmjs.org/hosted-git-info/download/hosted-git-info-2.8.5.tgz",
+      "integrity": "sha1-dZz88sTRVq3lmwst+r3cQqa5xww=",
+      "dev": true
+    },
+    "node_modules/hpack.js": {
+      "version": "2.1.6",
+      "resolved": "http://r.cnpmjs.org/hpack.js/download/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "node_modules/html-entities": {
+      "version": "1.2.1",
+      "resolved": "http://r.cnpmjs.org/html-entities/download/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true,
+      "engines": [
+        "node >= 0.4.0"
+      ]
+    },
+    "node_modules/http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "http://r.cnpmjs.org/http-deceiver/download/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "node_modules/http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "dev": true,
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/http-errors/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "node_modules/http-parser-js": {
+      "version": "0.4.10",
+      "resolved": "http://r.cnpmjs.org/http-parser-js/download/http-parser-js-0.4.10.tgz",
+      "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
+      "dev": true
+    },
+    "node_modules/http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "dev": true,
+      "dependencies": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "dev": true,
+      "dependencies": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/http-signature": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      },
+      "engines": {
+        "node": ">=0.8",
+        "npm": ">=1.3.7"
+      }
+    },
+    "node_modules/https-browserify": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/https-browserify/download/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.1.13",
+      "resolved": "http://r.cnpmjs.org/ieee754/download/ieee754-1.1.13.tgz",
+      "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=",
+      "dev": true
+    },
+    "node_modules/import-local": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
+      "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
+      "dev": true,
+      "dependencies": {
+        "pkg-dir": "^2.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local/node_modules/find-up": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/find-up/download/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local/node_modules/locate-path": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/locate-path/download/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local/node_modules/p-limit": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local/node_modules/p-locate": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/p-locate/download/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local/node_modules/p-try": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/p-try/download/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local/node_modules/pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/pkg-dir/download/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "dependencies": {
+        "find-up": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/indent-string": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/indent-string/download/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "dependencies": {
+        "repeating": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "http://r.cnpmjs.org/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.4.tgz",
+      "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
+    },
+    "node_modules/internal-ip": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/internal-ip/download/internal-ip-1.2.0.tgz",
+      "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
+      "dev": true,
+      "dependencies": {
+        "meow": "^3.3.0"
+      },
+      "bin": {
+        "internal-ip": "cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/interpret": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/interpret/download/interpret-1.2.0.tgz",
+      "integrity": "sha1-1QYaYiS+WOgIOYX1AU2EQ1lXYpY=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/invert-kv": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/invert-kv/download/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ip": {
+      "version": "1.1.5",
+      "resolved": "http://r.cnpmjs.org/ip/download/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+      "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-accessor-descriptor/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-arguments": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "node_modules/is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "http://r.cnpmjs.org/is-buffer/download/is-buffer-1.1.6.tgz",
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+      "dev": true
+    },
+    "node_modules/is-callable": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-data-descriptor/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-date-object/download/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-descriptor/node_modules/kind-of": {
+      "version": "5.1.0",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-5.1.0.tgz",
+      "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/is-extendable/download/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/is-extglob/download/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-finite": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-finite/download/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "dependencies": {
+        "number-is-nan": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "dev": true,
+      "dependencies": {
+        "number-is-nan": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/is-glob/download/is-glob-4.0.1.tgz",
+      "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/is-number/download/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-path-in-cwd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+      "dev": true,
+      "dependencies": {
+        "is-path-inside": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-path-inside/download/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "dependencies": {
+        "path-is-inside": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/is-plain-object/download/is-plain-object-2.0.4.tgz",
+      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-regex": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/is-regex/download/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/is-stream/download/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+      "dev": true,
+      "dependencies": {
+        "has-symbols": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "node_modules/is-utf8": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/is-utf8/download/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "node_modules/is-windows": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-windows/download/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/is-wsl/download/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/isarray/download/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/isexe/download/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "http://r.cnpmjs.org/isobject/download/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/isstream": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+    },
+    "node_modules/js-base64": {
+      "version": "3.7.5",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz",
+      "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
+    },
+    "node_modules/js-md5": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.7.3.tgz",
+      "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
+    },
+    "node_modules/js-yaml": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz",
+      "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I=",
+      "engines": {
+        "node": "> 0.4.11"
+      }
+    },
+    "node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+    },
+    "node_modules/jsfeat": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/jsfeat/-/jsfeat-0.0.8.tgz",
+      "integrity": "sha512-wG2Rzv9ywe2KGnX+N8VJtFO0srwyZaRmV8cBjsE52PCNdNJk8nVGtiK9HQ5wZZ5fUxk3wVPqV3zr8KxQjulR3w=="
+    },
+    "node_modules/jsmin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz",
+      "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw=",
+      "bin": {
+        "jsmin": "bin/jsmin"
+      },
+      "engines": {
+        "node": ">=0.1.93"
+      }
+    },
+    "node_modules/json-loader": {
+      "version": "0.5.7",
+      "resolved": "http://r.cnpmjs.org/json-loader/download/json-loader-0.5.7.tgz",
+      "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=",
+      "dev": true
+    },
+    "node_modules/json-schema": {
+      "version": "0.2.3",
+      "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
+    },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    },
+    "node_modules/json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+      "dev": true
+    },
+    "node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/json5/download/json5-1.0.1.tgz",
+      "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/json5/node_modules/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "node_modules/jsprim": {
+      "version": "1.4.1",
+      "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "dependencies": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "node_modules/jssha": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/jssha/-/jssha-2.4.2.tgz",
+      "integrity": "sha512-/jsi/9C0S70zfkT/4UlKQa5E1xKurDnXcQizcww9JSR/Fv+uIbWM2btG+bFcL3iNoK9jIGS0ls9HWLr1iw0kFg==",
+      "deprecated": "jsSHA versions < 3.0.0 will no longer receive feature updates",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/jweixin-module": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
+      "integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
+    },
+    "node_modules/jxLoader": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz",
+      "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=",
+      "dependencies": {
+        "js-yaml": "0.3.x",
+        "moo-server": "1.3.x",
+        "promised-io": "*",
+        "walker": "1.x"
+      },
+      "engines": {
+        "node": ">v0.4.10"
+      }
+    },
+    "node_modules/killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/kuler": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+      "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
+    },
+    "node_modules/lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/lazy-cache/download/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/lcid": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/lcid/download/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "dependencies": {
+        "invert-kv": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/load-json-file": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/load-json-file/download/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "2.4.0",
+      "resolved": "http://r.cnpmjs.org/loader-runner/download/loader-runner-2.4.0.tgz",
+      "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=",
+      "dev": true,
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "1.2.3",
+      "resolved": "http://r.cnpmjs.org/loader-utils/download/loader-utils-1.2.3.tgz",
+      "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+      "dev": true,
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^2.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+      "dev": true
+    },
+    "node_modules/logform": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz",
+      "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==",
+      "dependencies": {
+        "colors": "^1.2.1",
+        "fast-safe-stringify": "^2.0.4",
+        "fecha": "^4.2.0",
+        "ms": "^2.1.1",
+        "triple-beam": "^1.3.0"
+      }
+    },
+    "node_modules/logform/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/loglevel": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz",
+      "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/longest": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/longest/download/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "http://r.cnpmjs.org/loud-rejection/download/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "dependencies": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "4.1.5",
+      "resolved": "http://r.cnpmjs.org/lru-cache/download/lru-cache-4.1.5.tgz",
+      "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
+      "dev": true,
+      "dependencies": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "node_modules/makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "dependencies": {
+        "tmpl": "1.0.x"
+      }
+    },
+    "node_modules/map-cache": {
+      "version": "0.2.2",
+      "resolved": "http://r.cnpmjs.org/map-cache/download/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/map-obj": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/map-obj/download/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/map-visit": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/map-visit/download/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "dependencies": {
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/md5.js": {
+      "version": "1.3.5",
+      "resolved": "http://r.cnpmjs.org/md5.js/download/md5.js-1.3.5.tgz",
+      "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=",
+      "dev": true,
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "http://r.cnpmjs.org/media-typer/download/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/memory-fs": {
+      "version": "0.4.1",
+      "resolved": "http://r.cnpmjs.org/memory-fs/download/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "dependencies": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "node_modules/meow": {
+      "version": "3.7.0",
+      "resolved": "http://r.cnpmjs.org/meow/download/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "dependencies": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/meow/node_modules/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/methods/download/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "3.1.10",
+      "resolved": "http://r.cnpmjs.org/micromatch/download/micromatch-3.1.10.tgz",
+      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/miller-rabin/download/miller-rabin-4.0.1.tgz",
+      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "bin": {
+        "miller-rabin": "bin/miller-rabin"
+      }
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.40.0",
+      "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz",
+      "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.24",
+      "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz",
+      "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=",
+      "dependencies": {
+        "mime-db": "1.40.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=",
+      "dev": true
+    },
+    "node_modules/minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "node_modules/minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "node_modules/mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "http://r.cnpmjs.org/mixin-deep/download/mixin-deep-1.3.2.tgz",
+      "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=",
+      "dev": true,
+      "dependencies": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mixin-deep/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-extendable/download/is-extendable-1.0.1.tgz",
+      "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.5"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/moment": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/moo-server": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz",
+      "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE=",
+      "engines": {
+        "node": ">v0.4.10"
+      }
+    },
+    "node_modules/mpvue-echarts": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-0.3.2.tgz",
+      "integrity": "sha512-KULGS1DOMNhXu3nBkBv6BtmnqjyHLc+2Dur7eW+2s2aic1NCOygglCMmAmMEU6/TGSR67ttFA2NYxXPUYbNhWQ=="
+    },
+    "node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "node_modules/multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "dependencies": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      },
+      "bin": {
+        "multicast-dns": "cli.js"
+      }
+    },
+    "node_modules/multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "node_modules/nan": {
+      "version": "2.14.2",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/nanomatch": {
+      "version": "1.2.13",
+      "resolved": "http://r.cnpmjs.org/nanomatch/download/nanomatch-1.2.13.tgz",
+      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "node_modules/next-tick": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/next-tick/download/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
+    "node_modules/node-forge": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
+      "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4.5.0"
+      }
+    },
+    "node_modules/node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "http://r.cnpmjs.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=",
+      "dev": true,
+      "dependencies": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      }
+    },
+    "node_modules/node-libs-browser/node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "http://r.cnpmjs.org/punycode/download/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "dev": true
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
+    },
+    "node_modules/normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "http://r.cnpmjs.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
+      "dev": true,
+      "dependencies": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/normalize-path/download/normalize-path-3.0.0.tgz",
+      "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "http://r.cnpmjs.org/object-assign/download/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy": {
+      "version": "0.1.0",
+      "resolved": "http://r.cnpmjs.org/object-copy/download/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "dependencies": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
+      "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
+      "dev": true
+    },
+    "node_modules/object-is": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/object-is/download/object-is-1.0.1.tgz",
+      "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-visit": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/object-visit/download/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object.pick": {
+      "version": "1.3.0",
+      "resolved": "http://r.cnpmjs.org/object.pick/download/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "node_modules/on-finished": {
+      "version": "2.3.0",
+      "resolved": "http://r.cnpmjs.org/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "http://r.cnpmjs.org/once/download/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/one-time": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+      "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+      "dependencies": {
+        "fn.name": "1.x.x"
+      }
+    },
+    "node_modules/opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "dev": true,
+      "dependencies": {
+        "is-wsl": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
+      "dependencies": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "node_modules/os-browserify": {
+      "version": "0.3.0",
+      "resolved": "http://r.cnpmjs.org/os-browserify/download/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "node_modules/os-locale": {
+      "version": "1.4.0",
+      "resolved": "http://r.cnpmjs.org/os-locale/download/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "dependencies": {
+        "lcid": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/p-finally": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/p-finally/download/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/p-map": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pako": {
+      "version": "1.0.10",
+      "resolved": "http://r.cnpmjs.org/pako/download/pako-1.0.10.tgz",
+      "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=",
+      "dev": true
+    },
+    "node_modules/parse-asn1": {
+      "version": "5.1.5",
+      "resolved": "http://r.cnpmjs.org/parse-asn1/download/parse-asn1-5.1.5.tgz",
+      "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=",
+      "dev": true,
+      "dependencies": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "2.2.0",
+      "resolved": "http://r.cnpmjs.org/parse-json/download/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "dependencies": {
+        "error-ex": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/pascalcase": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/pascalcase/download/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "0.0.1",
+      "resolved": "http://r.cnpmjs.org/path-browserify/download/path-browserify-0.0.1.tgz",
+      "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=",
+      "dev": true
+    },
+    "node_modules/path-dirname": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/path-dirname/download/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "node_modules/path-exists": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/path-exists/download/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/path-is-inside/download/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/path-key/download/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.6",
+      "resolved": "http://r.cnpmjs.org/path-parse/download/path-parse-1.0.6.tgz",
+      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
+      "dev": true
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "http://r.cnpmjs.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "node_modules/path-type": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/path-type/download/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pbkdf2": {
+      "version": "3.0.17",
+      "resolved": "http://r.cnpmjs.org/pbkdf2/download/pbkdf2-3.0.17.tgz",
+      "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=",
+      "dev": true,
+      "dependencies": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/performance-now": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "http://r.cnpmjs.org/pify/download/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pinkie": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/pinkie/download/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "dependencies": {
+        "pinkie": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+      "dev": true,
+      "dependencies": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      },
+      "engines": {
+        "node": ">= 0.12.0"
+      }
+    },
+    "node_modules/posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "http://r.cnpmjs.org/process/download/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
+    },
+    "node_modules/promised-io": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.6.tgz",
+      "integrity": "sha512-bNwZusuNIW4m0SPR8jooSyndD35ggirHlxVl/UhIaZD/F0OBv9ebfc6tNmbpZts3QXHggkjIBH8lvtnzhtcz0A=="
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+      "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+      "dev": true,
+      "dependencies": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/prr/download/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "node_modules/pseudomap": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/pseudomap/download/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "node_modules/psl": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+    },
+    "node_modules/public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "http://r.cnpmjs.org/public-encrypt/download/public-encrypt-4.0.3.tgz",
+      "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=",
+      "dev": true,
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+      "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.9.4",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+      "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/querystring": {
+      "version": "0.2.0",
+      "resolved": "http://r.cnpmjs.org/querystring/download/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/querystring-es3/download/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/querystringify": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
+      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
+      "dev": true
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/randombytes/download/randombytes-2.1.0.tgz",
+      "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/randomfill": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/randomfill/download/randomfill-1.0.4.tgz",
+      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
+      "dev": true,
+      "dependencies": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "dev": true,
+      "dependencies": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/raw-body/node_modules/bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/read-pkg": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/read-pkg/download/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "dependencies": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "dependencies": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/read-pkg-up/node_modules/find-up": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/find-up/download/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+      "dev": true,
+      "dependencies": {
+        "path-exists": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/read-pkg-up/node_modules/path-exists": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/path-exists/download/path-exists-2.1.0.tgz",
+      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+      "dev": true,
+      "dependencies": {
+        "pinkie-promise": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "2.3.6",
+      "resolved": "http://r.cnpmjs.org/readable-stream/download/readable-stream-2.3.6.tgz",
+      "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
+      "dev": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "2.2.1",
+      "resolved": "http://r.cnpmjs.org/readdirp/download/readdirp-2.2.1.tgz",
+      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/redent": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/redent/download/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "dependencies": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regex-not": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/regex-not/download/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz",
+      "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "node_modules/repeat-element": {
+      "version": "1.1.3",
+      "resolved": "http://r.cnpmjs.org/repeat-element/download/repeat-element-1.1.3.tgz",
+      "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/repeat-string": {
+      "version": "1.6.1",
+      "resolved": "http://r.cnpmjs.org/repeat-string/download/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/repeating": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/repeating/download/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "dependencies": {
+        "is-finite": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+      "dependencies": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/request/node_modules/qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/require-directory/download/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/require-main-filename/download/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "node_modules/requires-port": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/requires-port/download/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "node_modules/resolve": {
+      "version": "1.12.0",
+      "resolved": "http://r.cnpmjs.org/resolve/download/resolve-1.12.0.tgz",
+      "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
+      "dev": true,
+      "dependencies": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "dependencies": {
+        "resolve-from": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/resolve-from/download/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve-url": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+      "dev": true
+    },
+    "node_modules/ret": {
+      "version": "0.1.15",
+      "resolved": "http://r.cnpmjs.org/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/right-align": {
+      "version": "0.1.3",
+      "resolved": "http://r.cnpmjs.org/right-align/download/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "dev": true,
+      "dependencies": {
+        "align-text": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/ripemd160": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/ripemd160/download/ripemd160-2.0.2.tgz",
+      "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=",
+      "dev": true,
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
+    },
+    "node_modules/safe-regex": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/safe-regex/download/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "dependencies": {
+        "ret": "~0.1.10"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+    },
+    "node_modules/select-hose": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/select-hose/download/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "node_modules/selfsigned": {
+      "version": "1.10.7",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
+      "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
+      "dev": true,
+      "dependencies": {
+        "node-forge": "0.9.0"
+      }
+    },
+    "node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "http://r.cnpmjs.org/semver/download/semver-5.7.1.tgz",
+      "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "dev": true,
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+      "dev": true
+    },
+    "node_modules/serve-index": {
+      "version": "1.9.1",
+      "resolved": "http://r.cnpmjs.org/serve-index/download/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "dependencies": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/serve-index/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/serve-index/node_modules/http-errors": {
+      "version": "1.6.3",
+      "resolved": "http://r.cnpmjs.org/http-errors/download/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": ">= 1.4.0 < 2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/serve-index/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "node_modules/serve-index/node_modules/setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "dev": true
+    },
+    "node_modules/serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "dev": true,
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/set-blocking/download/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "node_modules/set-value": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/set-value/download/set-value-2.0.1.tgz",
+      "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/set-value/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "http://r.cnpmjs.org/setimmediate/download/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "dev": true
+    },
+    "node_modules/sha.js": {
+      "version": "2.4.11",
+      "resolved": "http://r.cnpmjs.org/sha.js/download/sha.js-2.4.11.tgz",
+      "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      },
+      "bin": {
+        "sha.js": "bin.js"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/shebang-command/download/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/shebang-regex/download/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.2",
+      "resolved": "http://r.cnpmjs.org/signal-exit/download/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "node_modules/simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dependencies": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
+    "node_modules/simple-swizzle/node_modules/is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+    },
+    "node_modules/snapdragon": {
+      "version": "0.8.2",
+      "resolved": "http://r.cnpmjs.org/snapdragon/download/snapdragon-0.8.2.tgz",
+      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
+      "dev": true,
+      "dependencies": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+      "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "http://r.cnpmjs.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "http://r.cnpmjs.org/debug/download/debug-2.6.9.tgz",
+      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "dev": true,
+      "dependencies": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.0.1"
+      }
+    },
+    "node_modules/sockjs-client": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
+      "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
+      "dev": true,
+      "dependencies": {
+        "debug": "^2.6.6",
+        "eventsource": "0.1.6",
+        "faye-websocket": "~0.11.0",
+        "inherits": "^2.0.1",
+        "json3": "^3.3.2",
+        "url-parse": "^1.1.8"
+      }
+    },
+    "node_modules/sockjs-client/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/sockjs-client/node_modules/faye-websocket": {
+      "version": "0.11.3",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+      "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+      "dev": true,
+      "dependencies": {
+        "websocket-driver": ">=0.5.1"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/source-list-map": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/source-list-map/download/source-list-map-2.0.1.tgz",
+      "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=",
+      "dev": true
+    },
+    "node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "http://r.cnpmjs.org/source-map/download/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "http://r.cnpmjs.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+      "dev": true,
+      "dependencies": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "node_modules/source-map-url": {
+      "version": "0.4.0",
+      "resolved": "http://r.cnpmjs.org/source-map-url/download/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
+      "dev": true
+    },
+    "node_modules/spdx-correct": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/spdx-correct/download/spdx-correct-3.1.0.tgz",
+      "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=",
+      "dev": true,
+      "dependencies": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "node_modules/spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "http://r.cnpmjs.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=",
+      "dev": true
+    },
+    "node_modules/spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
+      "dev": true,
+      "dependencies": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "node_modules/spdx-license-ids": {
+      "version": "3.0.5",
+      "resolved": "http://r.cnpmjs.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz",
+      "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=",
+      "dev": true
+    },
+    "node_modules/spdy": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
+      "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      }
+    },
+    "node_modules/spdy-transport/node_modules/debug": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/spdy-transport/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/spdy-transport/node_modules/readable-stream": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+      "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/spdy/node_modules/debug": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/spdy/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/split-string": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/split-string/download/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "dependencies": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      },
+      "bin": {
+        "sshpk-conv": "bin/sshpk-conv",
+        "sshpk-sign": "bin/sshpk-sign",
+        "sshpk-verify": "bin/sshpk-verify"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/stack-trace": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/static-extend": {
+      "version": "0.1.2",
+      "resolved": "http://r.cnpmjs.org/static-extend/download/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/static-extend/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "1.5.0",
+      "resolved": "http://r.cnpmjs.org/statuses/download/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/stream-browserify/download/stream-browserify-2.0.2.tgz",
+      "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "node_modules/stream-http": {
+      "version": "2.8.3",
+      "resolved": "http://r.cnpmjs.org/stream-http/download/stream-http-2.8.3.tgz",
+      "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=",
+      "dev": true,
+      "dependencies": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "http://r.cnpmjs.org/string_decoder/download/string_decoder-1.1.1.tgz",
+      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/string-random": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/string-random/-/string-random-0.1.3.tgz",
+      "integrity": "sha512-g+UsIwzKhNi+9/+Q3Q7hP8R4HkQxiIkQlttnxw6GRdk9pnnkGIv53C6H8dvh8wxAVDhkqpnWeauaPXS1b2sBJg=="
+    },
+    "node_modules/string-width": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/string-width/download/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "dev": true,
+      "dependencies": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/string.prototype.trimleft": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+      "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.1.3",
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/string.prototype.trimright": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+      "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.1.3",
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "http://r.cnpmjs.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-bom": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/strip-bom/download/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "dependencies": {
+        "is-utf8": "^0.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-eof": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/strip-eof/download/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-indent": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/strip-indent/download/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "dependencies": {
+        "get-stdin": "^4.0.1"
+      },
+      "bin": {
+        "strip-indent": "cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "4.5.0",
+      "resolved": "http://r.cnpmjs.org/supports-color/download/supports-color-4.5.0.tgz",
+      "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/text-hex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+      "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
+    },
+    "node_modules/thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+      "dev": true
+    },
+    "node_modules/time-stamp": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz",
+      "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/timers-browserify": {
+      "version": "2.0.11",
+      "resolved": "http://r.cnpmjs.org/timers-browserify/download/timers-browserify-2.0.11.tgz",
+      "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=",
+      "dev": true,
+      "dependencies": {
+        "setimmediate": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/timespan": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+      "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=",
+      "engines": {
+        "node": ">= 0.2.0"
+      }
+    },
+    "node_modules/tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+    },
+    "node_modules/to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "node_modules/to-object-path": {
+      "version": "0.3.0",
+      "resolved": "http://r.cnpmjs.org/to-object-path/download/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-object-path/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex": {
+      "version": "3.0.2",
+      "resolved": "http://r.cnpmjs.org/to-regex/download/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/to-regex-range/download/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "dependencies": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/triple-beam": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+      "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+    },
+    "node_modules/tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "http://r.cnpmjs.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+    },
+    "node_modules/type": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/type/download/type-1.2.0.tgz",
+      "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=",
+      "dev": true
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/uglify-js": {
+      "version": "2.8.29",
+      "resolved": "http://r.cnpmjs.org/uglify-js/download/uglify-js-2.8.29.tgz",
+      "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+      "dev": true,
+      "dependencies": {
+        "source-map": "~0.5.1",
+        "yargs": "~3.10.0"
+      },
+      "bin": {
+        "uglifyjs": "bin/uglifyjs"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      },
+      "optionalDependencies": {
+        "uglify-to-browserify": "~1.0.0"
+      }
+    },
+    "node_modules/uglify-js/node_modules/camelcase": {
+      "version": "1.2.1",
+      "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-1.2.1.tgz",
+      "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/uglify-js/node_modules/cliui": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/cliui/download/cliui-2.1.0.tgz",
+      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+      "dev": true,
+      "dependencies": {
+        "center-align": "^0.1.1",
+        "right-align": "^0.1.1",
+        "wordwrap": "0.0.2"
+      }
+    },
+    "node_modules/uglify-js/node_modules/yargs": {
+      "version": "3.10.0",
+      "resolved": "http://r.cnpmjs.org/yargs/download/yargs-3.10.0.tgz",
+      "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^1.0.2",
+        "cliui": "^2.1.0",
+        "decamelize": "^1.0.0",
+        "window-size": "0.1.0"
+      }
+    },
+    "node_modules/uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/uglifyjs-webpack-plugin": {
+      "version": "0.4.6",
+      "resolved": "http://r.cnpmjs.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-0.4.6.tgz",
+      "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+      "dev": true,
+      "hasInstallScript": true,
+      "dependencies": {
+        "source-map": "^0.5.6",
+        "uglify-js": "^2.8.29",
+        "webpack-sources": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      },
+      "peerDependencies": {
+        "webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0"
+      }
+    },
+    "node_modules/unifly": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unifly/-/unifly-1.0.2.tgz",
+      "integrity": "sha512-Lk2CQ/HNspIzA3qqeOhEVnfs6G5yNi/3zY3bjEFm4roPi3FhWhAQ6FZDedWo3OrDfMEmGM3IKdbgekeDfvZ3WQ=="
+    },
+    "node_modules/union-value": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/union-value/download/union-value-1.0.1.tgz",
+      "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=",
+      "dev": true,
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unset-value": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/unset-value/download/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "dependencies": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value": {
+      "version": "0.3.1",
+      "resolved": "http://r.cnpmjs.org/has-value/download/has-value-0.3.1.tgz",
+      "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+      "dev": true,
+      "dependencies": {
+        "get-value": "^2.0.3",
+        "has-values": "^0.1.4",
+        "isobject": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/isobject/download/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "dev": true,
+      "dependencies": {
+        "isarray": "1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-values": {
+      "version": "0.1.4",
+      "resolved": "http://r.cnpmjs.org/has-values/download/has-values-0.1.4.tgz",
+      "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/upath": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/upath/download/upath-1.2.0.tgz",
+      "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=4",
+        "yarn": "*"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.2.2",
+      "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz",
+      "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/urix": {
+      "version": "0.1.0",
+      "resolved": "http://r.cnpmjs.org/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+      "dev": true
+    },
+    "node_modules/url": {
+      "version": "0.11.0",
+      "resolved": "http://r.cnpmjs.org/url/download/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "dependencies": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      }
+    },
+    "node_modules/url-parse": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+      "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+      "dev": true,
+      "dependencies": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "node_modules/url/node_modules/punycode": {
+      "version": "1.3.2",
+      "resolved": "http://r.cnpmjs.org/punycode/download/punycode-1.3.2.tgz",
+      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+      "dev": true
+    },
+    "node_modules/use": {
+      "version": "3.1.1",
+      "resolved": "http://r.cnpmjs.org/use/download/use-3.1.1.tgz",
+      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/util": {
+      "version": "0.11.1",
+      "resolved": "http://r.cnpmjs.org/util/download/util-0.11.1.tgz",
+      "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=",
+      "dev": true,
+      "dependencies": {
+        "inherits": "2.0.3"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "node_modules/util/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/uuid": {
+      "version": "3.3.2",
+      "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz",
+      "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+      "bin": {
+        "uuid": "bin/uuid"
+      }
+    },
+    "node_modules/validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "http://r.cnpmjs.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
+      "dev": true,
+      "dependencies": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/vary/download/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/verror": {
+      "version": "1.10.0",
+      "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "node_modules/vm-browserify": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/vm-browserify/download/vm-browserify-1.1.0.tgz",
+      "integrity": "sha1-vXbWojMj4sqP+hICjcBFWcdfkBk=",
+      "dev": true
+    },
+    "node_modules/vue": {
+      "version": "2.6.14",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.6.14.tgz",
+      "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
+      "peer": true
+    },
+    "node_modules/vuex": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.5.1.tgz",
+      "integrity": "sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw==",
+      "peerDependencies": {
+        "vue": "^2.0.0"
+      }
+    },
+    "node_modules/walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+      "dependencies": {
+        "makeerror": "1.0.x"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0"
+      },
+      "optionalDependencies": {
+        "chokidar": "^3.4.1",
+        "watchpack-chokidar2": "^2.0.0"
+      }
+    },
+    "node_modules/watchpack-chokidar2": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "chokidar": "^2.1.8"
+      },
+      "engines": {
+        "node": "<8.10.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/anymatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/watchpack/node_modules/binary-extensions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/chokidar": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+      "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.4.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.1.2"
+      }
+    },
+    "node_modules/watchpack/node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/fsevents": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "deprecated": "\"Please update to latest v2.3 or v2.2\"",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/glob-parent": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/watchpack/node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/readdirp": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+      "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "dependencies": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "3.12.0",
+      "resolved": "http://r.cnpmjs.org/webpack/download/webpack-3.12.0.tgz",
+      "integrity": "sha1-P540NgNwYC/PY56Xk520hvTsDXQ=",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^5.0.0",
+        "acorn-dynamic-import": "^2.0.0",
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0",
+        "async": "^2.1.2",
+        "enhanced-resolve": "^3.4.0",
+        "escope": "^3.6.0",
+        "interpret": "^1.0.0",
+        "json-loader": "^0.5.4",
+        "json5": "^0.5.1",
+        "loader-runner": "^2.3.0",
+        "loader-utils": "^1.1.0",
+        "memory-fs": "~0.4.1",
+        "mkdirp": "~0.5.0",
+        "node-libs-browser": "^2.0.0",
+        "source-map": "^0.5.3",
+        "supports-color": "^4.2.1",
+        "tapable": "^0.2.7",
+        "uglifyjs-webpack-plugin": "^0.4.6",
+        "watchpack": "^1.4.0",
+        "webpack-sources": "^1.0.1",
+        "yargs": "^8.0.2"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/webpack-dev-middleware": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+      "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+      "dev": true,
+      "dependencies": {
+        "memory-fs": "~0.4.1",
+        "mime": "^1.5.0",
+        "path-is-absolute": "^1.0.0",
+        "range-parser": "^1.0.3",
+        "time-stamp": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "peerDependencies": {
+        "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0"
+      }
+    },
+    "node_modules/webpack-dev-server": {
+      "version": "2.11.5",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz",
+      "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==",
+      "dev": true,
+      "dependencies": {
+        "ansi-html": "0.0.7",
+        "array-includes": "^3.0.3",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.2",
+        "compression": "^1.7.3",
+        "connect-history-api-fallback": "^1.3.0",
+        "debug": "^3.1.0",
+        "del": "^3.0.0",
+        "express": "^4.16.2",
+        "html-entities": "^1.2.0",
+        "http-proxy-middleware": "^0.19.1",
+        "import-local": "^1.0.0",
+        "internal-ip": "1.2.0",
+        "ip": "^1.1.5",
+        "killable": "^1.0.0",
+        "loglevel": "^1.4.1",
+        "opn": "^5.1.0",
+        "portfinder": "^1.0.9",
+        "selfsigned": "^1.9.1",
+        "serve-index": "^1.9.1",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.1.5",
+        "spdy": "^4.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^5.1.0",
+        "webpack-dev-middleware": "1.12.2",
+        "yargs": "6.6.0"
+      },
+      "bin": {
+        "webpack-dev-server": "bin/webpack-dev-server.js"
+      },
+      "engines": {
+        "node": ">=4.7"
+      },
+      "peerDependencies": {
+        "webpack": "^2.2.0 || ^3.0.0"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "http://r.cnpmjs.org/webpack-sources/download/webpack-sources-1.4.3.tgz",
+      "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=",
+      "dev": true,
+      "dependencies": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/webpack-sources/node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "http://r.cnpmjs.org/source-map/download/source-map-0.6.1.tgz",
+      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack/node_modules/ansi-regex": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/camelcase": {
+      "version": "4.1.0",
+      "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-4.1.0.tgz",
+      "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/cross-spawn": {
+      "version": "5.1.0",
+      "resolved": "http://r.cnpmjs.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^4.0.1",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "node_modules/webpack/node_modules/execa": {
+      "version": "0.7.0",
+      "resolved": "http://r.cnpmjs.org/execa/download/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^5.0.1",
+        "get-stream": "^3.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/find-up": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/find-up/download/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/get-stream": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/get-stream/download/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/json5": {
+      "version": "0.5.1",
+      "resolved": "http://r.cnpmjs.org/json5/download/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+      "dev": true,
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/webpack/node_modules/load-json-file": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/load-json-file/download/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/locate-path": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/locate-path/download/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/mem": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/mem/download/mem-1.1.0.tgz",
+      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/mimic-fn/download/mimic-fn-1.2.0.tgz",
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/os-locale": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/os-locale/download/os-locale-2.1.0.tgz",
+      "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=",
+      "dev": true,
+      "dependencies": {
+        "execa": "^0.7.0",
+        "lcid": "^1.0.0",
+        "mem": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/p-limit": {
+      "version": "1.3.0",
+      "resolved": "http://r.cnpmjs.org/p-limit/download/p-limit-1.3.0.tgz",
+      "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/p-locate": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/p-locate/download/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/p-try": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/p-try/download/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/path-type": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/path-type/download/path-type-2.0.0.tgz",
+      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+      "dev": true,
+      "dependencies": {
+        "pify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/read-pkg": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/read-pkg/download/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
+      "dependencies": {
+        "load-json-file": "^2.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
+      "dependencies": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/string-width": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/string-width/download/string-width-2.1.1.tgz",
+      "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+      "dev": true,
+      "dependencies": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/strip-ansi": {
+      "version": "4.0.0",
+      "resolved": "http://r.cnpmjs.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/strip-bom/download/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/webpack/node_modules/tapable": {
+      "version": "0.2.9",
+      "resolved": "http://r.cnpmjs.org/tapable/download/tapable-0.2.9.tgz",
+      "integrity": "sha1-ry2LvJsE907hevK02QSPgHrNGKg=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/webpack/node_modules/which-module": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/which-module/download/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "dev": true
+    },
+    "node_modules/webpack/node_modules/y18n": {
+      "version": "3.2.1",
+      "resolved": "http://r.cnpmjs.org/y18n/download/y18n-3.2.1.tgz",
+      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+      "dev": true
+    },
+    "node_modules/webpack/node_modules/yargs": {
+      "version": "8.0.2",
+      "resolved": "http://r.cnpmjs.org/yargs/download/yargs-8.0.2.tgz",
+      "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^4.1.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^2.0.0",
+        "read-pkg-up": "^2.0.0",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^2.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^3.2.1",
+        "yargs-parser": "^7.0.0"
+      }
+    },
+    "node_modules/webpack/node_modules/yargs-parser": {
+      "version": "7.0.0",
+      "resolved": "http://r.cnpmjs.org/yargs-parser/download/yargs-parser-7.0.0.tgz",
+      "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^4.1.0"
+      }
+    },
+    "node_modules/websocket-driver": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
+      "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
+      "dev": true,
+      "dependencies": {
+        "http-parser-js": ">=0.4.0 <0.4.11",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "http://r.cnpmjs.org/which/download/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/which-module": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/which-module/download/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true
+    },
+    "node_modules/window-size": {
+      "version": "0.1.0",
+      "resolved": "http://r.cnpmjs.org/window-size/download/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/winston": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz",
+      "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==",
+      "dependencies": {
+        "@dabh/diagnostics": "^2.0.2",
+        "async": "^3.1.0",
+        "is-stream": "^2.0.0",
+        "logform": "^2.2.0",
+        "one-time": "^1.0.0",
+        "readable-stream": "^3.4.0",
+        "stack-trace": "0.0.x",
+        "triple-beam": "^1.3.0",
+        "winston-transport": "^4.4.0"
+      },
+      "engines": {
+        "node": ">= 6.4.0"
+      }
+    },
+    "node_modules/winston-transport": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
+      "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
+      "dependencies": {
+        "readable-stream": "^2.3.7",
+        "triple-beam": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 6.4.0"
+      }
+    },
+    "node_modules/winston-transport/node_modules/readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/winston/node_modules/async": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+      "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
+    },
+    "node_modules/winston/node_modules/is-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/winston/node_modules/readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/wordwrap": {
+      "version": "0.0.2",
+      "resolved": "http://r.cnpmjs.org/wordwrap/download/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "dependencies": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/wrappy/download/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "node_modules/wrench": {
+      "version": "1.3.9",
+      "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.3.9.tgz",
+      "integrity": "sha1-bxPsNRRTF+spLKX2UxORskQRFBE=",
+      "deprecated": "wrench.js is deprecated! You should check out fs-extra (https://github.com/jprichardson/node-fs-extra) for any operations you were using wrench for. Thanks for all the usage over the years.",
+      "engines": {
+        "node": ">=0.1.97"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "http://r.cnpmjs.org/xtend/download/xtend-4.0.2.tgz",
+      "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "2.1.2",
+      "resolved": "http://r.cnpmjs.org/yallist/download/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "node_modules/yargs": {
+      "version": "6.6.0",
+      "resolved": "http://r.cnpmjs.org/yargs/download/yargs-6.6.0.tgz",
+      "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^3.0.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^1.4.0",
+        "read-pkg-up": "^1.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^1.0.2",
+        "which-module": "^1.0.0",
+        "y18n": "^3.2.1",
+        "yargs-parser": "^4.2.0"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "4.2.1",
+      "resolved": "http://r.cnpmjs.org/yargs-parser/download/yargs-parser-4.2.1.tgz",
+      "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+      "dev": true,
+      "dependencies": {
+        "camelcase": "^3.0.0"
+      }
+    },
+    "node_modules/yargs-parser/node_modules/camelcase": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-3.0.0.tgz",
+      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/yargs/node_modules/camelcase": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-3.0.0.tgz",
+      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/yargs/node_modules/y18n": {
+      "version": "3.2.1",
+      "resolved": "http://r.cnpmjs.org/y18n/download/y18n-3.2.1.tgz",
+      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+      "dev": true
+    },
+    "node_modules/zrender": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz",
+      "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g=="
+    }
+  },
+  "dependencies": {
+    "@dabh/diagnostics": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz",
+      "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==",
+      "requires": {
+        "colorspace": "1.1.x",
+        "enabled": "2.0.x",
+        "kuler": "^2.0.0"
+      }
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "5.7.4",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+      "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/acorn-dynamic-import/download/acorn-dynamic-import-2.0.2.tgz",
+      "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+      "dev": true,
+      "requires": {
+        "acorn": "^4.0.3"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "http://r.cnpmjs.org/acorn/download/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+          "dev": true
+        }
+      }
+    },
+    "ajv": {
+      "version": "6.10.0",
+      "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz",
+      "integrity": "sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE=",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^2.0.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-keywords": {
+      "version": "3.4.1",
+      "resolved": "http://r.cnpmjs.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz",
+      "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=",
+      "dev": true,
+      "requires": {}
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "http://r.cnpmjs.org/align-text/download/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2",
+        "longest": "^1.0.1",
+        "repeat-string": "^1.5.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "http://r.cnpmjs.org/ansi-html/download/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/anymatch/download/anymatch-2.0.0.tgz",
+      "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
+      "dev": true,
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "http://r.cnpmjs.org/normalize-path/download/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "dev": true,
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "http://r.cnpmjs.org/arr-diff/download/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/arr-flatten/download/arr-flatten-1.1.0.tgz",
+      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/arr-union/download/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/array-find-index/download/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+      "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+      "dev": true
+    },
+    "array-includes": {
+      "version": "3.0.3",
+      "resolved": "http://r.cnpmjs.org/array-includes/download/array-includes-3.0.3.tgz",
+      "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.7.0"
+      }
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/array-union/download/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/array-uniq/download/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "http://r.cnpmjs.org/array-unique/download/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "http://r.cnpmjs.org/asn1.js/download/asn1.js-4.10.1.tgz",
+      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "http://r.cnpmjs.org/assert/download/assert-1.5.0.tgz",
+      "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "http://r.cnpmjs.org/util/download/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/assign-symbols/download/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.3",
+      "resolved": "http://r.cnpmjs.org/async/download/async-2.6.3.tgz",
+      "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/async-each/download/async-each-1.0.3.tgz",
+      "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "http://r.cnpmjs.org/atob/download/atob-2.1.2.tgz",
+      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=",
+      "dev": true
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+    },
+    "aws4": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+      "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA=="
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/balanced-match/download/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "http://r.cnpmjs.org/base/download/base-0.11.2.tgz",
+      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "base64-js": {
+      "version": "1.3.1",
+      "resolved": "http://r.cnpmjs.org/base64-js/download/base64-js-1.3.1.tgz",
+      "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "http://r.cnpmjs.org/batch/download/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "http://r.cnpmjs.org/big.js/download/big.js-5.2.2.tgz",
+      "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "http://r.cnpmjs.org/binary-extensions/download/binary-extensions-1.13.1.tgz",
+      "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=",
+      "dev": true
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "http://r.cnpmjs.org/bn.js/download/bn.js-4.11.8.tgz",
+      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "http://r.cnpmjs.org/bonjour/download/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "http://r.cnpmjs.org/braces/download/braces-2.3.2.tgz",
+      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/brorand/download/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/browserify-aes/download/browserify-aes-1.2.0.tgz",
+      "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/browserify-des/download/browserify-des-1.0.2.tgz",
+      "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "http://r.cnpmjs.org/browserify-sign/download/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.0"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "http://r.cnpmjs.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.19.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+      "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+      "requires": {
+        "caniuse-lite": "^1.0.30001286",
+        "electron-to-chromium": "^1.4.17",
+        "escalade": "^3.1.1",
+        "node-releases": "^2.0.1",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "http://r.cnpmjs.org/buffer/download/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/buffer-xor/download/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "build": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/build/-/build-0.1.4.tgz",
+      "integrity": "sha1-cH/gJv/O3crL/c3zVur9pk8VEEY=",
+      "requires": {
+        "cssmin": "0.3.x",
+        "jsmin": "1.x",
+        "jxLoader": "*",
+        "moo-server": "*",
+        "promised-io": "*",
+        "timespan": "2.x",
+        "uglify-js": "1.x",
+        "walker": "1.x",
+        "winston": "*",
+        "wrench": "1.3.x"
+      },
+      "dependencies": {
+        "uglify-js": {
+          "version": "1.3.5",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz",
+          "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0="
+        }
+      }
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/bytes/download/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/cache-base/download/cache-base-1.0.1.tgz",
+      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
+      "dev": true,
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001299",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
+      "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "http://r.cnpmjs.org/center-align/download/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "dev": true,
+      "requires": {
+        "align-text": "^0.1.3",
+        "lazy-cache": "^1.0.3"
+      }
+    },
+    "chokidar": {
+      "version": "2.1.8",
+      "resolved": "http://r.cnpmjs.org/chokidar/download/chokidar-2.1.8.tgz",
+      "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=",
+      "dev": true,
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "fsevents": "^1.2.7",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      }
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/cipher-base/download/cipher-base-1.0.4.tgz",
+      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "http://r.cnpmjs.org/class-utils/download/class-utils-0.3.6.tgz",
+      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "http://r.cnpmjs.org/cliui/download/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/code-point-at/download/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/collection-visit/download/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
+      "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
+      "requires": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.2"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "http://r.cnpmjs.org/color-convert/download/color-convert-1.9.3.tgz",
+      "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "http://r.cnpmjs.org/color-name/download/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "color-string": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
+      "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+    },
+    "colorspace": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz",
+      "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==",
+      "requires": {
+        "color": "3.0.x",
+        "text-hex": "1.0.x"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "http://r.cnpmjs.org/component-emitter/download/component-emitter-1.3.0.tgz",
+      "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.17",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
+      "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.40.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "http://r.cnpmjs.org/concat-map/download/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/console-browserify/download/console-browserify-1.2.0.tgz",
+      "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=",
+      "dev": true
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/constants-browserify/download/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "http://r.cnpmjs.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "http://r.cnpmjs.org/create-ecdh/download/create-ecdh-4.0.3.tgz",
+      "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/create-hash/download/create-hash-1.2.0.tgz",
+      "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "http://r.cnpmjs.org/create-hmac/download/create-hmac-1.1.7.tgz",
+      "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "http://r.cnpmjs.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "crypto-js": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+      "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+    },
+    "cssmin": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.3.2.tgz",
+      "integrity": "sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0="
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "http://r.cnpmjs.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "d": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/d/download/d-1.0.1.tgz",
+      "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=",
+      "dev": true,
+      "requires": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "debug": {
+      "version": "3.2.6",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+      "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+      "dev": true,
+      "requires": {
+        "ms": "^2.1.1"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/decamelize/download/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "http://r.cnpmjs.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz",
+      "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==",
+      "dev": true,
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/define-property/download/define-property-2.0.2.tgz",
+      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "del": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/del/download/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "requires": {
+        "globby": "^6.1.0",
+        "is-path-cwd": "^1.0.0",
+        "is-path-in-cwd": "^1.0.0",
+        "p-map": "^1.1.1",
+        "pify": "^3.0.0",
+        "rimraf": "^2.2.8"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "http://r.cnpmjs.org/pify/download/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/depd/download/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/des.js/download/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "http://r.cnpmjs.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/dns-equal/download/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/dns-txt/download/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/domain-browser/download/domain-browser-1.2.0.tgz",
+      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
+      "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "echarts": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz",
+      "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
+      "requires": {
+        "zrender": "4.3.2"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "http://r.cnpmjs.org/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.4.45",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz",
+      "integrity": "sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg=="
+    },
+    "elliptic": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      }
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/emojis-list/download/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "dev": true
+    },
+    "enabled": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+      "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "enhanced-resolve": {
+      "version": "3.4.1",
+      "resolved": "http://r.cnpmjs.org/enhanced-resolve/download/enhanced-resolve-3.4.1.tgz",
+      "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "object-assign": "^4.0.1",
+        "tapable": "^0.2.7"
+      },
+      "dependencies": {
+        "tapable": {
+          "version": "0.2.9",
+          "resolved": "http://r.cnpmjs.org/tapable/download/tapable-0.2.9.tgz",
+          "integrity": "sha1-ry2LvJsE907hevK02QSPgHrNGKg=",
+          "dev": true
+        }
+      }
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "http://r.cnpmjs.org/errno/download/errno-0.1.7.tgz",
+      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
+      "dev": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "http://r.cnpmjs.org/error-ex/download/error-ex-1.3.2.tgz",
+      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
+      "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "^1.2.0",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.0",
+        "is-callable": "^1.1.4",
+        "is-regex": "^1.0.4",
+        "object-inspect": "^1.6.0",
+        "object-keys": "^1.1.1",
+        "string.prototype.trimleft": "^2.1.0",
+        "string.prototype.trimright": "^2.1.0"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.52",
+      "resolved": "http://r.cnpmjs.org/es5-ext/download/es5-ext-0.10.52.tgz",
+      "integrity": "sha1-uyF3fpGaBCY3Nt7RIKnWZfEOpj8=",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.2",
+        "next-tick": "~1.0.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/es6-iterator/download/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-map": {
+      "version": "0.1.5",
+      "resolved": "http://r.cnpmjs.org/es6-map/download/es6-map-0.1.5.tgz",
+      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-set": "~0.1.5",
+        "es6-symbol": "~3.1.1",
+        "event-emitter": "~0.3.5"
+      }
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "http://r.cnpmjs.org/es6-set/download/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "~0.3.5"
+      },
+      "dependencies": {
+        "es6-symbol": {
+          "version": "3.1.1",
+          "resolved": "http://r.cnpmjs.org/es6-symbol/download/es6-symbol-3.1.1.tgz",
+          "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+          "dev": true,
+          "requires": {
+            "d": "1",
+            "es5-ext": "~0.10.14"
+          }
+        }
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "http://r.cnpmjs.org/es6-symbol/download/es6-symbol-3.1.3.tgz",
+      "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=",
+      "dev": true,
+      "requires": {
+        "d": "^1.0.1",
+        "ext": "^1.1.2"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.3",
+      "resolved": "http://r.cnpmjs.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz",
+      "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.46",
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escope": {
+      "version": "3.6.0",
+      "resolved": "http://r.cnpmjs.org/escope/download/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "dev": true,
+      "requires": {
+        "es6-map": "^0.1.3",
+        "es6-weak-map": "^2.0.1",
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "http://r.cnpmjs.org/esrecurse/download/esrecurse-4.2.1.tgz",
+      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "http://r.cnpmjs.org/estraverse/download/estraverse-4.3.0.tgz",
+      "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "http://r.cnpmjs.org/etag/download/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "http://r.cnpmjs.org/event-emitter/download/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "eventemitter3": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+      "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
+      "dev": true
+    },
+    "events": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/events/download/events-3.0.0.tgz",
+      "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "0.1.6",
+      "resolved": "http://r.cnpmjs.org/eventsource/download/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "dev": true,
+      "requires": {
+        "original": ">=0.0.5"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "http://r.cnpmjs.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "http://r.cnpmjs.org/debug/download/debug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "1.1.1",
+          "resolved": "http://r.cnpmjs.org/array-flatten/download/array-flatten-1.1.1.tgz",
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        }
+      }
+    },
+    "ext": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/ext/download/ext-1.1.2.tgz",
+      "integrity": "sha1-0dIWyDZBu0y3aEYisGPP9EoZzjU=",
+      "dev": true,
+      "requires": {
+        "type": "^2.0.0"
+      },
+      "dependencies": {
+        "type": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/type/download/type-2.0.0.tgz",
+          "integrity": "sha1-Xxb/bvLrRPJgSU2uJxAzspwJqcM=",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://r.cnpmjs.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/extglob/download/extglob-2.0.4.tgz",
+      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
+      "dev": true,
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "fast-deep-equal": {
+      "version": "2.0.1",
+      "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz",
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+    },
+    "fast-safe-stringify": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "http://r.cnpmjs.org/faye-websocket/download/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fecha": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz",
+      "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg=="
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "http://r.cnpmjs.org/fill-range/download/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "flyio": {
+      "version": "0.6.14",
+      "resolved": "https://registry.npmjs.org/flyio/-/flyio-0.6.14.tgz",
+      "integrity": "sha512-RE2OXE1ZZmcXOKb0jCtGyquHDxpAqHg17CZ8lmQKRfl3x1kP+NBpaQDx4WgN7DNpLJjFnspTzTEQpwRGg6/xaA==",
+      "requires": {
+        "request": "^2.85.0"
+      }
+    },
+    "fn.name": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+      "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
+    },
+    "follow-redirects": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+      "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
+      "dev": true
+    },
+    "font-awesome": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npm.taobao.org/font-awesome/download/font-awesome-4.7.0.tgz",
+      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/for-in/download/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "http://r.cnpmjs.org/forwarded/download/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "http://r.cnpmjs.org/fresh/download/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/fs.realpath/download/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "http://r.cnpmjs.org/get-caller-file/download/get-caller-file-1.0.3.tgz",
+      "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/get-stdin/download/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "http://r.cnpmjs.org/get-value/download/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
+      "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/glob-parent/download/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "requires": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "http://r.cnpmjs.org/is-glob/download/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
+    "globby": {
+      "version": "6.1.0",
+      "resolved": "http://r.cnpmjs.org/globby/download/globby-6.1.0.tgz",
+      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+      "dev": true,
+      "requires": {
+        "array-union": "^1.0.1",
+        "glob": "^7.0.3",
+        "object-assign": "^4.0.1",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.3",
+      "resolved": "http://r.cnpmjs.org/graceful-fs/download/graceful-fs-4.2.3.tgz",
+      "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=",
+      "dev": true
+    },
+    "handle-thing": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
+      "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+    },
+    "har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "requires": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        }
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/has-flag/download/has-flag-2.0.0.tgz",
+      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/has-symbols/download/has-symbols-1.0.0.tgz",
+      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/has-value/download/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/has-values/download/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.0.4",
+      "resolved": "http://r.cnpmjs.org/hash-base/download/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.8.5",
+      "resolved": "http://r.cnpmjs.org/hosted-git-info/download/hosted-git-info-2.8.5.tgz",
+      "integrity": "sha1-dZz88sTRVq3lmwst+r3cQqa5xww=",
+      "dev": true
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "http://r.cnpmjs.org/hpack.js/download/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "http://r.cnpmjs.org/html-entities/download/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "http://r.cnpmjs.org/http-deceiver/download/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "http-parser-js": {
+      "version": "0.4.10",
+      "resolved": "http://r.cnpmjs.org/http-parser-js/download/http-parser-js-0.4.10.tgz",
+      "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/https-browserify/download/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "ieee754": {
+      "version": "1.1.13",
+      "resolved": "http://r.cnpmjs.org/ieee754/download/ieee754-1.1.13.tgz",
+      "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=",
+      "dev": true
+    },
+    "import-local": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
+      "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^2.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "http://r.cnpmjs.org/find-up/download/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/locate-path/download/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/p-locate/download/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/p-try/download/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/pkg-dir/download/pkg-dir-2.0.0.tgz",
+          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        }
+      }
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/indent-string/download/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "http://r.cnpmjs.org/inflight/download/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.4.tgz",
+      "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
+    },
+    "internal-ip": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/internal-ip/download/internal-ip-1.2.0.tgz",
+      "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
+      "dev": true,
+      "requires": {
+        "meow": "^3.3.0"
+      }
+    },
+    "interpret": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/interpret/download/interpret-1.2.0.tgz",
+      "integrity": "sha1-1QYaYiS+WOgIOYX1AU2EQ1lXYpY=",
+      "dev": true
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/invert-kv/download/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "http://r.cnpmjs.org/ip/download/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+      "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arguments": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+      "dev": true
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/is-arrayish/download/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-binary-path/download/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "http://r.cnpmjs.org/is-buffer/download/is-buffer-1.1.6.tgz",
+      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+      "dev": true
+    },
+    "is-callable": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+      "dev": true
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-date-object/download/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-0.1.6.tgz",
+      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-5.1.0.tgz",
+          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=",
+          "dev": true
+        }
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/is-extendable/download/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/is-extglob/download/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-finite/download/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/is-glob/download/is-glob-4.0.1.tgz",
+      "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/is-number/download/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^1.0.0"
+      }
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/is-path-inside/download/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "^1.0.1"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/is-plain-object/download/is-plain-object-2.0.4.tgz",
+      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/is-regex/download/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.1"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/is-stream/download/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-symbol": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.0"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/is-utf8/download/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/is-windows/download/is-windows-1.0.2.tgz",
+      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/is-wsl/download/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/isarray/download/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/isexe/download/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "http://r.cnpmjs.org/isobject/download/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+    },
+    "js-base64": {
+      "version": "3.7.5",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz",
+      "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
+    },
+    "js-md5": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.7.3.tgz",
+      "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
+    },
+    "js-yaml": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz",
+      "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I="
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+    },
+    "jsfeat": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/jsfeat/-/jsfeat-0.0.8.tgz",
+      "integrity": "sha512-wG2Rzv9ywe2KGnX+N8VJtFO0srwyZaRmV8cBjsE52PCNdNJk8nVGtiK9HQ5wZZ5fUxk3wVPqV3zr8KxQjulR3w=="
+    },
+    "jsmin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz",
+      "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw="
+    },
+    "json-loader": {
+      "version": "0.5.7",
+      "resolved": "http://r.cnpmjs.org/json-loader/download/json-loader-0.5.7.tgz",
+      "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    },
+    "json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/json5/download/json5-1.0.1.tgz",
+      "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        }
+      }
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "jssha": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/jssha/-/jssha-2.4.2.tgz",
+      "integrity": "sha512-/jsi/9C0S70zfkT/4UlKQa5E1xKurDnXcQizcww9JSR/Fv+uIbWM2btG+bFcL3iNoK9jIGS0ls9HWLr1iw0kFg=="
+    },
+    "jweixin-module": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
+      "integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
+    },
+    "jxLoader": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz",
+      "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=",
+      "requires": {
+        "js-yaml": "0.3.x",
+        "moo-server": "1.3.x",
+        "promised-io": "*",
+        "walker": "1.x"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "kuler": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+      "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
+    },
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/lazy-cache/download/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+      "dev": true
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/lcid/download/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/load-json-file/download/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "http://r.cnpmjs.org/loader-runner/download/loader-runner-2.4.0.tgz",
+      "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.2.3",
+      "resolved": "http://r.cnpmjs.org/loader-utils/download/loader-utils-1.2.3.tgz",
+      "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^2.0.0",
+        "json5": "^1.0.1"
+      }
+    },
+    "lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+      "dev": true
+    },
+    "logform": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz",
+      "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==",
+      "requires": {
+        "colors": "^1.2.1",
+        "fast-safe-stringify": "^2.0.4",
+        "fecha": "^4.2.0",
+        "ms": "^2.1.1",
+        "triple-beam": "^1.3.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "loglevel": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz",
+      "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==",
+      "dev": true
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/longest/download/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "http://r.cnpmjs.org/loud-rejection/download/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
+      }
+    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "http://r.cnpmjs.org/lru-cache/download/lru-cache-4.1.5.tgz",
+      "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=",
+      "dev": true,
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "requires": {
+        "tmpl": "1.0.x"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "http://r.cnpmjs.org/map-cache/download/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/map-obj/download/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/map-visit/download/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "http://r.cnpmjs.org/md5.js/download/md5.js-1.3.5.tgz",
+      "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "http://r.cnpmjs.org/media-typer/download/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "http://r.cnpmjs.org/memory-fs/download/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "http://r.cnpmjs.org/meow/download/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        }
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/methods/download/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "http://r.cnpmjs.org/micromatch/download/micromatch-3.1.10.tgz",
+      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "http://r.cnpmjs.org/miller-rabin/download/miller-rabin-4.0.1.tgz",
+      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      }
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.40.0",
+      "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz",
+      "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI="
+    },
+    "mime-types": {
+      "version": "2.1.24",
+      "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz",
+      "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=",
+      "requires": {
+        "mime-db": "1.40.0"
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "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==",
+      "dev": true
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "http://r.cnpmjs.org/mixin-deep/download/mixin-deep-1.3.2.tgz",
+      "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "http://r.cnpmjs.org/is-extendable/download/is-extendable-1.0.1.tgz",
+          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "moment": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
+    },
+    "moo-server": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz",
+      "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE="
+    },
+    "mpvue-echarts": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-0.3.2.tgz",
+      "integrity": "sha512-KULGS1DOMNhXu3nBkBv6BtmnqjyHLc+2Dur7eW+2s2aic1NCOygglCMmAmMEU6/TGSR67ttFA2NYxXPUYbNhWQ=="
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.14.2",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
+      "dev": true,
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "http://r.cnpmjs.org/nanomatch/download/nanomatch-1.2.13.tgz",
+      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/next-tick/download/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
+    "node-forge": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
+      "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==",
+      "dev": true
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "http://r.cnpmjs.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "http://r.cnpmjs.org/punycode/download/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "node-releases": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "http://r.cnpmjs.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/normalize-path/download/normalize-path-3.0.0.tgz",
+      "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "http://r.cnpmjs.org/object-assign/download/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "http://r.cnpmjs.org/object-copy/download/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-inspect": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
+      "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
+      "dev": true
+    },
+    "object-is": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/object-is/download/object-is-1.0.1.tgz",
+      "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/object-visit/download/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "http://r.cnpmjs.org/object.pick/download/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "http://r.cnpmjs.org/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "http://r.cnpmjs.org/once/download/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "one-time": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+      "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+      "requires": {
+        "fn.name": "1.x.x"
+      }
+    },
+    "opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
+      "requires": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "http://r.cnpmjs.org/os-browserify/download/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "http://r.cnpmjs.org/os-locale/download/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "requires": {
+        "lcid": "^1.0.0"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/p-finally/download/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-map": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "dev": true
+    },
+    "pako": {
+      "version": "1.0.10",
+      "resolved": "http://r.cnpmjs.org/pako/download/pako-1.0.10.tgz",
+      "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=",
+      "dev": true
+    },
+    "parse-asn1": {
+      "version": "5.1.5",
+      "resolved": "http://r.cnpmjs.org/parse-asn1/download/parse-asn1-5.1.5.tgz",
+      "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "http://r.cnpmjs.org/parse-json/download/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/pascalcase/download/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "http://r.cnpmjs.org/path-browserify/download/path-browserify-0.0.1.tgz",
+      "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/path-dirname/download/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/path-exists/download/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/path-is-inside/download/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/path-key/download/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "http://r.cnpmjs.org/path-parse/download/path-parse-1.0.6.tgz",
+      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "http://r.cnpmjs.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/path-type/download/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.17",
+      "resolved": "http://r.cnpmjs.org/pbkdf2/download/pbkdf2-3.0.17.tgz",
+      "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true,
+      "optional": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "http://r.cnpmjs.org/pify/download/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "http://r.cnpmjs.org/pinkie/download/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "http://r.cnpmjs.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "http://r.cnpmjs.org/process/download/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
+    },
+    "promised-io": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.6.tgz",
+      "integrity": "sha512-bNwZusuNIW4m0SPR8jooSyndD35ggirHlxVl/UhIaZD/F0OBv9ebfc6tNmbpZts3QXHggkjIBH8lvtnzhtcz0A=="
+    },
+    "proxy-addr": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+      "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+      "dev": true,
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.0"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/prr/download/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/pseudomap/download/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "http://r.cnpmjs.org/public-encrypt/download/public-encrypt-4.0.3.tgz",
+      "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+      "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
+    },
+    "qs": {
+      "version": "6.9.4",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
+      "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "http://r.cnpmjs.org/querystring/download/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/querystring-es3/download/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
+      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
+      "dev": true
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/randombytes/download/randombytes-2.1.0.tgz",
+      "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "http://r.cnpmjs.org/randomfill/download/randomfill-1.0.4.tgz",
+      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/read-pkg/download/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "http://r.cnpmjs.org/find-up/download/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "http://r.cnpmjs.org/path-exists/download/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "http://r.cnpmjs.org/readable-stream/download/readable-stream-2.3.6.tgz",
+      "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
+      "dev": true,
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "http://r.cnpmjs.org/readdirp/download/readdirp-2.2.1.tgz",
+      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/redent/download/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/regex-not/download/regex-not-1.0.2.tgz",
+      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz",
+      "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "http://r.cnpmjs.org/repeat-element/download/repeat-element-1.1.3.tgz",
+      "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "http://r.cnpmjs.org/repeat-string/download/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/repeating/download/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+        }
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/require-directory/download/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/require-main-filename/download/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/requires-port/download/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.12.0",
+      "resolved": "http://r.cnpmjs.org/resolve/download/resolve-1.12.0.tgz",
+      "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/resolve-from/download/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "http://r.cnpmjs.org/resolve-url/download/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "http://r.cnpmjs.org/ret/download/ret-0.1.15.tgz",
+      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=",
+      "dev": true
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "http://r.cnpmjs.org/right-align/download/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "dev": true,
+      "requires": {
+        "align-text": "^0.1.1"
+      }
+    },
+    "rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/ripemd160/download/ripemd160-2.0.2.tgz",
+      "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
+      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/safe-regex/download/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/select-hose/download/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "1.10.7",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
+      "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.9.0"
+      }
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "http://r.cnpmjs.org/semver/download/semver-5.7.1.tgz",
+      "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=",
+      "dev": true
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "dev": true
+            }
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "dev": true
+        }
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "http://r.cnpmjs.org/serve-index/download/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "http://r.cnpmjs.org/http-errors/download/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/set-blocking/download/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/set-value/download/set-value-2.0.1.tgz",
+      "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "http://r.cnpmjs.org/setimmediate/download/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "http://r.cnpmjs.org/sha.js/download/sha.js-2.4.11.tgz",
+      "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/shebang-command/download/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/shebang-regex/download/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "http://r.cnpmjs.org/signal-exit/download/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+        }
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "http://r.cnpmjs.org/snapdragon/download/snapdragon-0.8.2.tgz",
+      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
+      "dev": true,
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "http://r.cnpmjs.org/debug/download/debug-2.6.9.tgz",
+          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "http://r.cnpmjs.org/extend-shallow/download/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
+      "dev": true,
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "http://r.cnpmjs.org/is-descriptor/download/is-descriptor-1.0.2.tgz",
+          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "http://r.cnpmjs.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.0.1"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
+      "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.6",
+        "eventsource": "0.1.6",
+        "faye-websocket": "~0.11.0",
+        "inherits": "^2.0.1",
+        "json3": "^3.3.2",
+        "url-parse": "^1.1.8"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.3",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+          "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+          "dev": true,
+          "requires": {
+            "websocket-driver": ">=0.5.1"
+          }
+        }
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "http://r.cnpmjs.org/source-list-map/download/source-list-map-2.0.1.tgz",
+      "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "http://r.cnpmjs.org/source-map/download/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "dev": true
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "http://r.cnpmjs.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "http://r.cnpmjs.org/source-map-url/download/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/spdx-correct/download/spdx-correct-3.1.0.tgz",
+      "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "http://r.cnpmjs.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "http://r.cnpmjs.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.5",
+      "resolved": "http://r.cnpmjs.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz",
+      "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
+      "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "http://r.cnpmjs.org/split-string/download/split-string-3.1.0.tgz",
+      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
+    "stack-trace": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "http://r.cnpmjs.org/static-extend/download/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "http://r.cnpmjs.org/define-property/download/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "http://r.cnpmjs.org/statuses/download/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+      "dev": true
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "http://r.cnpmjs.org/stream-browserify/download/stream-browserify-2.0.2.tgz",
+      "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "http://r.cnpmjs.org/stream-http/download/stream-http-2.8.3.tgz",
+      "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "http://r.cnpmjs.org/string_decoder/download/string_decoder-1.1.1.tgz",
+      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "string-random": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/string-random/-/string-random-0.1.3.tgz",
+      "integrity": "sha512-g+UsIwzKhNi+9/+Q3Q7hP8R4HkQxiIkQlttnxw6GRdk9pnnkGIv53C6H8dvh8wxAVDhkqpnWeauaPXS1b2sBJg=="
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/string-width/download/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "dev": true,
+      "requires": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      }
+    },
+    "string.prototype.trimleft": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+      "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "function-bind": "^1.1.1"
+      }
+    },
+    "string.prototype.trimright": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+      "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "function-bind": "^1.1.1"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "http://r.cnpmjs.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "http://r.cnpmjs.org/strip-bom/download/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/strip-eof/download/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/strip-indent/download/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^4.0.1"
+      }
+    },
+    "supports-color": {
+      "version": "4.5.0",
+      "resolved": "http://r.cnpmjs.org/supports-color/download/supports-color-4.5.0.tgz",
+      "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+      "dev": true,
+      "requires": {
+        "has-flag": "^2.0.0"
+      }
+    },
+    "text-hex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+      "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
+    },
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+      "dev": true
+    },
+    "time-stamp": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz",
+      "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.11",
+      "resolved": "http://r.cnpmjs.org/timers-browserify/download/timers-browserify-2.0.11.tgz",
+      "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timespan": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+      "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk="
+    },
+    "tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "http://r.cnpmjs.org/to-object-path/download/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "http://r.cnpmjs.org/kind-of/download/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "http://r.cnpmjs.org/to-regex/download/to-regex-3.0.2.tgz",
+      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
+      "dev": true,
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "http://r.cnpmjs.org/to-regex-range/download/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "requires": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "triple-beam": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+      "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "http://r.cnpmjs.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+    },
+    "type": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/type/download/type-1.2.0.tgz",
+      "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=",
+      "dev": true
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "uglify-js": {
+      "version": "2.8.29",
+      "resolved": "http://r.cnpmjs.org/uglify-js/download/uglify-js-2.8.29.tgz",
+      "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.5.1",
+        "uglify-to-browserify": "~1.0.0",
+        "yargs": "~3.10.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-1.2.1.tgz",
+          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "2.1.0",
+          "resolved": "http://r.cnpmjs.org/cliui/download/cliui-2.1.0.tgz",
+          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+          "dev": true,
+          "requires": {
+            "center-align": "^0.1.1",
+            "right-align": "^0.1.1",
+            "wordwrap": "0.0.2"
+          }
+        },
+        "yargs": {
+          "version": "3.10.0",
+          "resolved": "http://r.cnpmjs.org/yargs/download/yargs-3.10.0.tgz",
+          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^1.0.2",
+            "cliui": "^2.1.0",
+            "decamelize": "^1.0.0",
+            "window-size": "0.1.0"
+          }
+        }
+      }
+    },
+    "uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "dev": true,
+      "optional": true
+    },
+    "uglifyjs-webpack-plugin": {
+      "version": "0.4.6",
+      "resolved": "http://r.cnpmjs.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-0.4.6.tgz",
+      "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.5.6",
+        "uglify-js": "^2.8.29",
+        "webpack-sources": "^1.0.1"
+      }
+    },
+    "unifly": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unifly/-/unifly-1.0.2.tgz",
+      "integrity": "sha512-Lk2CQ/HNspIzA3qqeOhEVnfs6G5yNi/3zY3bjEFm4roPi3FhWhAQ6FZDedWo3OrDfMEmGM3IKdbgekeDfvZ3WQ=="
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/union-value/download/union-value-1.0.1.tgz",
+      "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/unset-value/download/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "http://r.cnpmjs.org/has-value/download/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "http://r.cnpmjs.org/isobject/download/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "http://r.cnpmjs.org/has-values/download/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "http://r.cnpmjs.org/upath/download/upath-1.2.0.tgz",
+      "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz",
+      "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "http://r.cnpmjs.org/urix/download/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "http://r.cnpmjs.org/url/download/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "http://r.cnpmjs.org/punycode/download/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+      "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "http://r.cnpmjs.org/use/download/use-3.1.1.tgz",
+      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
+      "dev": true
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "http://r.cnpmjs.org/util/download/util-0.11.1.tgz",
+      "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "http://r.cnpmjs.org/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz",
+      "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE="
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "http://r.cnpmjs.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "http://r.cnpmjs.org/vary/download/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.0",
+      "resolved": "http://r.cnpmjs.org/vm-browserify/download/vm-browserify-1.1.0.tgz",
+      "integrity": "sha1-vXbWojMj4sqP+hICjcBFWcdfkBk=",
+      "dev": true
+    },
+    "vue": {
+      "version": "2.6.14",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.6.14.tgz",
+      "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
+      "peer": true
+    },
+    "vuex": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.5.1.tgz",
+      "integrity": "sha512-w7oJzmHQs0FM9LXodfskhw9wgKBiaB+totOdb8sNzbTB2KDCEEwEs29NzBZFh/lmEK1t5tDmM1vtsO7ubG1DFw==",
+      "requires": {}
+    },
+    "walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+      "requires": {
+        "makeerror": "1.0.x"
+      }
+    },
+    "watchpack": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+          "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+          "dev": true,
+          "optional": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.4.2",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+          "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.1.2",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.4.0"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true,
+          "optional": true
+        },
+        "readdirp": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+          "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "webpack": {
+      "version": "3.12.0",
+      "resolved": "http://r.cnpmjs.org/webpack/download/webpack-3.12.0.tgz",
+      "integrity": "sha1-P540NgNwYC/PY56Xk520hvTsDXQ=",
+      "dev": true,
+      "requires": {
+        "acorn": "^5.0.0",
+        "acorn-dynamic-import": "^2.0.0",
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0",
+        "async": "^2.1.2",
+        "enhanced-resolve": "^3.4.0",
+        "escope": "^3.6.0",
+        "interpret": "^1.0.0",
+        "json-loader": "^0.5.4",
+        "json5": "^0.5.1",
+        "loader-runner": "^2.3.0",
+        "loader-utils": "^1.1.0",
+        "memory-fs": "~0.4.1",
+        "mkdirp": "~0.5.0",
+        "node-libs-browser": "^2.0.0",
+        "source-map": "^0.5.3",
+        "supports-color": "^4.2.1",
+        "tapable": "^0.2.7",
+        "uglifyjs-webpack-plugin": "^0.4.6",
+        "watchpack": "^1.4.0",
+        "webpack-sources": "^1.0.1",
+        "yargs": "^8.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "http://r.cnpmjs.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "http://r.cnpmjs.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.7.0",
+          "resolved": "http://r.cnpmjs.org/execa/download/execa-0.7.0.tgz",
+          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "http://r.cnpmjs.org/find-up/download/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "http://r.cnpmjs.org/get-stream/download/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "http://r.cnpmjs.org/json5/download/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/load-json-file/download/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/locate-path/download/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "mem": {
+          "version": "1.1.0",
+          "resolved": "http://r.cnpmjs.org/mem/download/mem-1.1.0.tgz",
+          "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "mimic-fn": {
+          "version": "1.2.0",
+          "resolved": "http://r.cnpmjs.org/mimic-fn/download/mimic-fn-1.2.0.tgz",
+          "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
+          "dev": true
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "resolved": "http://r.cnpmjs.org/os-locale/download/os-locale-2.1.0.tgz",
+          "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=",
+          "dev": true,
+          "requires": {
+            "execa": "^0.7.0",
+            "lcid": "^1.0.0",
+            "mem": "^1.1.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "http://r.cnpmjs.org/p-limit/download/p-limit-1.3.0.tgz",
+          "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/p-locate/download/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "http://r.cnpmjs.org/p-try/download/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/path-type/download/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/read-pkg/download/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^2.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.0.0",
+            "read-pkg": "^2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "http://r.cnpmjs.org/string-width/download/string-width-2.1.1.tgz",
+          "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "http://r.cnpmjs.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "http://r.cnpmjs.org/strip-bom/download/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "tapable": {
+          "version": "0.2.9",
+          "resolved": "http://r.cnpmjs.org/tapable/download/tapable-0.2.9.tgz",
+          "integrity": "sha1-ry2LvJsE907hevK02QSPgHrNGKg=",
+          "dev": true
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "http://r.cnpmjs.org/which-module/download/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "http://r.cnpmjs.org/y18n/download/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "8.0.2",
+          "resolved": "http://r.cnpmjs.org/yargs/download/yargs-8.0.2.tgz",
+          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.0",
+            "read-pkg-up": "^2.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^7.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "7.0.0",
+          "resolved": "http://r.cnpmjs.org/yargs-parser/download/yargs-parser-7.0.0.tgz",
+          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0"
+          }
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+      "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "~0.4.1",
+        "mime": "^1.5.0",
+        "path-is-absolute": "^1.0.0",
+        "range-parser": "^1.0.3",
+        "time-stamp": "^2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "2.11.5",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz",
+      "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "array-includes": "^3.0.3",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.2",
+        "compression": "^1.7.3",
+        "connect-history-api-fallback": "^1.3.0",
+        "debug": "^3.1.0",
+        "del": "^3.0.0",
+        "express": "^4.16.2",
+        "html-entities": "^1.2.0",
+        "http-proxy-middleware": "^0.19.1",
+        "import-local": "^1.0.0",
+        "internal-ip": "1.2.0",
+        "ip": "^1.1.5",
+        "killable": "^1.0.0",
+        "loglevel": "^1.4.1",
+        "opn": "^5.1.0",
+        "portfinder": "^1.0.9",
+        "selfsigned": "^1.9.1",
+        "serve-index": "^1.9.1",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.1.5",
+        "spdy": "^4.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^5.1.0",
+        "webpack-dev-middleware": "1.12.2",
+        "yargs": "6.6.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "http://r.cnpmjs.org/webpack-sources/download/webpack-sources-1.4.3.tgz",
+      "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=",
+      "dev": true,
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "http://r.cnpmjs.org/source-map/download/source-map-0.6.1.tgz",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+          "dev": true
+        }
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
+      "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
+      "dev": true,
+      "requires": {
+        "http-parser-js": ">=0.4.0 <0.4.11",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "http://r.cnpmjs.org/which/download/which-1.3.1.tgz",
+      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "1.0.0",
+      "resolved": "http://r.cnpmjs.org/which-module/download/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true
+    },
+    "window-size": {
+      "version": "0.1.0",
+      "resolved": "http://r.cnpmjs.org/window-size/download/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+      "dev": true
+    },
+    "winston": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz",
+      "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==",
+      "requires": {
+        "@dabh/diagnostics": "^2.0.2",
+        "async": "^3.1.0",
+        "is-stream": "^2.0.0",
+        "logform": "^2.2.0",
+        "one-time": "^1.0.0",
+        "readable-stream": "^3.4.0",
+        "stack-trace": "0.0.x",
+        "triple-beam": "^1.3.0",
+        "winston-transport": "^4.4.0"
+      },
+      "dependencies": {
+        "async": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+          "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "winston-transport": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
+      "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
+      "requires": {
+        "readable-stream": "^2.3.7",
+        "triple-beam": "^1.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.7",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        }
+      }
+    },
+    "wordwrap": {
+      "version": "0.0.2",
+      "resolved": "http://r.cnpmjs.org/wordwrap/download/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+      "dev": true
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "http://r.cnpmjs.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "http://r.cnpmjs.org/wrappy/download/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "wrench": {
+      "version": "1.3.9",
+      "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.3.9.tgz",
+      "integrity": "sha1-bxPsNRRTF+spLKX2UxORskQRFBE="
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "http://r.cnpmjs.org/xtend/download/xtend-4.0.2.tgz",
+      "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "http://r.cnpmjs.org/yallist/download/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "6.6.0",
+      "resolved": "http://r.cnpmjs.org/yargs/download/yargs-6.6.0.tgz",
+      "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^3.0.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^1.4.0",
+        "read-pkg-up": "^1.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^1.0.2",
+        "which-module": "^1.0.0",
+        "y18n": "^3.2.1",
+        "yargs-parser": "^4.2.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "http://r.cnpmjs.org/y18n/download/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "4.2.1",
+      "resolved": "http://r.cnpmjs.org/yargs-parser/download/yargs-parser-4.2.1.tgz",
+      "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+      "dev": true,
+      "requires": {
+        "camelcase": "^3.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "http://r.cnpmjs.org/camelcase/download/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        }
+      }
+    },
+    "zrender": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz",
+      "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g=="
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..c749259
--- /dev/null
+++ b/package.json
@@ -0,0 +1,42 @@
+{
+  "name": "mobile-phone-shell-applet",
+  "version": "1.0.0",
+  "description": "色彩公园手机壳",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "browserslist": "^4.19.1",
+    "build": "^0.1.4",
+    "caniuse-lite": "^1.0.30001299",
+    "crypto-js": "^4.1.1",
+    "echarts": "^4.9.0",
+    "flyio": "^0.6.14",
+    "font-awesome": "^4.7.0",
+    "js-base64": "^3.7.5",
+    "js-md5": "^0.7.3",
+    "jsfeat": "^0.0.8",
+    "jssha": "^2.4.2",
+    "jweixin-module": "^1.6.0",
+    "moment": "^2.27.0",
+    "mpvue-echarts": "^0.3.2",
+    "qs": "^6.9.4",
+    "string-random": "^0.1.3",
+    "unifly": "^1.0.2",
+    "vuex": "^3.5.1"
+  },
+  "devDependencies": {
+    "webpack": "^3.12.0",
+    "webpack-dev-server": "^2.11.5"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://gitee.com/ruifeng-color-project/mobile-phone-shell-applet.git"
+  }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..a6f97d8
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,125 @@
+{
+	"pages": [{
+			"path": "pages/index/mall",
+			"style": {
+				"navigationBarTitleText": "色彩公园手机壳",
+				"enablePullDownRefresh": true,
+				"navigationStyle": "custom" //禁用uni-app默认的头部导航
+			}
+		},
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationStyle": "custom" //禁用uni-app默认的头部导航
+			}
+		},
+		{
+			"path": "pages/index/start-up",
+			"style": {
+				"navigationBarTitleText": "打印",
+				"enablePullDownRefresh": true,
+				"navigationStyle": "custom" //禁用uni-app默认的头部导航
+			}
+		},
+		{
+			"path": "pages/index/custom-size",
+			"style": {
+				"navigationBarTitleText": "自定义宽高",
+				"enablePullDownRefresh": false
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "#ffffff",
+		"navigationBarTitleText": "定制",
+		"navigationBarBackgroundColor": "#141319",
+		"backgroundColor": "#141319"
+	},
+	"subPackages": [{
+			"root": "pages/login",
+			"pages": [{
+				"path": "login",
+				"style": {
+					"navigationBarTitleText": "色彩公园手机壳"
+				}
+			}]
+		},
+		{
+			"root": "pages/mall",
+			"pages": [{
+					"path": "lineUp",
+					"style": {
+						"navigationBarTitleText": "排队信息",
+						"enablePullDownRefresh": true
+					}
+				},
+				{
+					"path": "experience",
+					"style": {
+						"navigationBarTitleText": "最近色彩站"
+					}
+				},
+				{
+					"path": "knowPhone",
+					"style": {
+						"navigationBarTitleText": "识别手机型号"
+					}
+				}
+			]
+		},
+		{
+			"root": "pages/mine",
+			"pages": [{
+					"path": "order",
+					"style": {
+						"navigationBarTitleText": "付款区"
+					}
+				},
+				{
+					"path": "orderNew",
+					"style": {
+						"navigationBarTitleText": ""
+					}
+				},
+				{
+					"path": "myorder",
+					"style": {
+						"navigationBarTitleText": "订单列表",
+						"enablePullDownRefresh": true
+					}
+				},
+				{
+					"path": "ordersize",
+					"style": {
+						"navigationBarTitleText": "查看尺码"
+					}
+				},
+				{
+					"path": "self_help_payment_details",
+					"style": {
+						"navigationBarTitleText": "打印"
+					}
+				},
+				{
+					"path": "self_help_payment_details_new",
+					"style": {
+						"navigationBarTitleText": "打印"
+					}
+				},
+				{
+					"path": "nothingmachineid",
+					"style": {
+						"navigationBarTitleText": "手机壳打印"
+					}
+				},
+				{
+					"path": "goodsordersize",
+					"style": {
+						"navigationBarTitleText": "商品尺码"
+					}
+				}
+			]
+		}
+	]
+}
diff --git a/pages/index/Signin.vue b/pages/index/Signin.vue
new file mode 100644
index 0000000..a3de0ad
--- /dev/null
+++ b/pages/index/Signin.vue
@@ -0,0 +1,244 @@
+<template>
+	<uni-popup ref="Signincenter" type="bottom">
+		<view class='dialog-container'>
+			<!-- 遮罩 -->
+			<view style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.5; z-index: 998; background: #131319;"></view>
+			<view style="width: 100%; height: 440upx; background: #eeeeee; overflow: hidden; position: relative; z-index: 999; ">
+				<view  @click="cose()" style="position: absolute; top: 0; right: 0;">
+					<image style="height: 30upx; width: 30upx; margin: 20upx;" src="../../static/icon_guanbi.png" mode=""></image>
+				</view>
+				<image src="../../static/logo.jpg" mode="aspectFill" style="width: 109upx; height: 98upx; display: block; margin: 36upx auto 25upx;"></image>
+				<view style=" text-align: center; font-size: 32upx; font-weight: 500; color: #131319;"> 欢迎来到{{startText}}小程序 </view>
+				<view style=" margin-top: 10upx; text-align: center; font-size: 24upx; font-weight: 500; color: #888888;"> 为了更好的服务,需要得到您的授权 </view>
+				<!-- 小程序登录、用户信息相关接口调整 -->
+				<button class="buttonGetUserInfo cssbut" hover-class="hover-class-bg" v-if="canIUseGetUserProfile" @tap="getUserProfile"> 获取头像昵称 </button>
+				<button v-else open-type="getUserInfo" @getuserinfo="getUserInfo" lang="zh_CN" class="buttonGetUserInfo cssbut" hover-class="hover-class-bg"> 获取头像昵称 </button>
+			</view>
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+	import userService from '@/service/UserService';
+	import uniPopup from './common/uni-popup/uni-popup.vue'
+	import Env from '@/util/Env.js';
+	export default {
+		components: {
+			uniPopup
+		},
+		computed: {
+			startText(){
+				return Env.getmalltext() || '色彩公园'
+			},
+		},
+		data() {
+			return {
+				canIUseGetUserProfile: false,
+			};
+		},
+		methods: {
+			cose(){
+				this.$refs['Signincenter'].close()
+			},
+			init(){
+				this.$nextTick(() => {
+					this.$refs['Signincenter'].open()
+				})
+				if (wx.getUserProfile) {
+				  this.canIUseGetUserProfile = true
+				}
+			},
+			getUserProfile(e) {
+				uni.getSetting({
+					success(res){
+						console.log('获取用户信息是否用户同意')
+						console.log(res.authSetting)
+					}
+				})
+				let that = this;
+			    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
+			    // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
+			    wx.getUserProfile({
+				  lang:'zh_CN',
+			      desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+			      success: (Userres) => {
+					  console.log('getUserInfo 获取头像昵称')
+					  console.log(Userres)
+					  that.$base.Userres = Userres
+					  uni.showLoading({title: '正在登录中...',mask: true});
+					  uni.login({
+					  	provider: 'weixin',
+					  	success: (weixinres) => {
+					  		//console.log('uni.login')
+					  		//console.log(weixinres)
+					  		if (weixinres.code) {
+					  			that.loginInfo = Userres.userInfo;
+					  			that.loginInfo.encryptedData = Userres.encryptedData;
+					  			that.loginInfo.iv = Userres.iv;
+					  			that.loginInfo.code = weixinres.code;
+					  			userService.setWxInfo(that.loginInfo);
+					  			userService.cacheWxInfo(that.loginInfo);
+					  			userService.login({
+					  				s: 'Init.init',
+					  				code: that.loginInfo.code,
+					  				nickname: that.loginInfo.nickName || '微信用户',
+					  				gender:that.loginInfo.gender,
+					  				portrait: that.loginInfo.avatarUrl,
+					  				encryptedData:that.loginInfo.encryptedData,
+					  				iv:that.loginInfo.iv,
+									promoter_id:that.$base.promoter_id ,// 推广的员的编号
+									machine_id:that.$base.machine_id,//用户进入设备id
+					  			}).then(result => {
+									uni.hideLoading();
+					  				uni.showToast({title: '登录成功',icon: 'none'});
+					  				// that.$emit('ok', true);
+					  				that.$refs['Signincenter'].close()
+					  			}).catch(err => {
+					  				uni.hideLoading();
+					  				uni.showToast({title: err.msg,icon: 'none'});
+					  			})
+					  		} else {
+					  			uni.hideLoading();
+					  			console.log('登录失败!' + res.errMsg)
+					  			uni.showToast({title: '登录失败!',icon: 'none'});
+					  		}
+					  	},
+					  	fail: (err) => {
+					  		uni.hideLoading();
+					  		console.error('uni.login授权登录失败:' + JSON.stringify(err));
+					  		uni.showToast({title: '授权登录失败',icon: 'none'});
+					  	}
+					  })
+			      },
+				  fail(err) {
+					uni.hideLoading();
+					console.log("wx.getUserProfile获取用户信息失败", err)
+					uni.showToast({title: '获取用户信息失败',icon: 'none'});
+				  }
+			    })
+			},
+			getUserInfo(e) {
+				let that = this;
+				// 已经授权,可以直接调用 getUserInfo 获取头像昵称
+				uni.getUserInfo({
+					success(Userres) {
+						console.log('getUserInfo 获取头像昵称')
+						console.log(Userres)
+						that.$base.Userres = Userres
+						uni.showLoading({title: '正在登录中...',mask: true});
+						uni.login({
+							provider: 'weixin',
+							success: (weixinres) => {
+								console.log('uni.login')
+								console.log(weixinres)
+								if (weixinres.code) {
+									that.loginInfo = Userres.userInfo;
+									that.loginInfo.encryptedData = Userres.encryptedData;
+									that.loginInfo.iv = Userres.iv;
+									that.loginInfo.code = weixinres.code;
+									userService.setWxInfo(that.loginInfo);
+									userService.cacheWxInfo(that.loginInfo);
+									userService.login({
+										s: 'Init.init',
+										code: that.loginInfo.code,
+										nickname: that.loginInfo.nickName,
+										gender:that.loginInfo.gender,
+										portrait: that.loginInfo.avatarUrl,
+										encryptedData:that.loginInfo.encryptedData,
+										iv:that.loginInfo.iv,
+										promoter_id:that.$base.promoter_id ,// 推广的员的编号
+										machine_id:that.$base.machine_id,//用户进入设备id
+									}).then(result => {
+										uni.hideLoading();
+										uni.showToast({title: '登录成功',icon: 'none'});
+										// that.$emit('ok', true);
+										that.$refs['Signincenter'].close()
+									}).catch(err => {
+										uni.hideLoading();
+										uni.showToast({title: err.msg,icon: 'none'});
+									})
+								} else {
+									uni.hideLoading();
+									console.error('uni.login授权登录失败:' + JSON.stringify(err));
+									uni.showToast({title: '授权登录失败',icon: 'none'});
+								}
+							},
+							fail: (err) => {
+								uni.hideLoading();
+								console.error('授权登录失败:' + JSON.stringify(err));
+								uni.showToast({title: '授权登录失败',icon: 'none'});
+							}
+						})
+					},
+					fail(err) {
+						uni.hideLoading();
+						console.log("wx.getUserProfile获取用户信息失败", err)
+						uni.showToast({title: '获取用户信息失败',icon: 'none'});
+					}
+				})
+						
+			},
+			// 打开权限设置页提示框
+			showSettingToast(e) {
+				const that = this
+				wx.showModal({
+					title: '温馨提示',
+					content: '为了更好体验小程序,请开启微信授权',
+					confirmText: '去设置',
+					showCancel: false,
+					success: function(res) {
+						if (res.confirm) {
+							// /打开授权设置
+							uni.openSetting({
+								success(res) {
+									if (res.authSetting['scope.userInfo']) {
+										that.getUserInfo(e)
+									} else {
+										that.showSettingToast(e)
+									}
+								},
+								fail(err) {
+									console.log(err)
+								}
+							})
+						}
+					}
+				})
+			},
+			onLoad() {},
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "./css/main.css";
+	/* 去除button默认样式 */
+	.cssbut {
+		background-color: transparent !important;
+		padding-left: 0 !important;
+		padding-right: 0 !important;
+		line-height: inherit !important;
+		border-radius: 0 !important;
+	}
+	.cssbut::after {
+		border: none !important;
+	}
+	/* 弹框 */
+	.dialog-container {
+		width: 100%;
+		height: 100%;
+	}
+	.buttonGetUserInfo{
+		text-align: center !important; 
+		margin: 49upx auto 0 !important; 
+		line-height: 70upx !important; 
+		width: 400upx !important; 
+		height: 70upx !important;
+		background: #F56364 !important; 
+		border-radius: 35upx !important; 
+		border: 0 !important; 
+		font-size: 36upx !important; 
+		font-weight: 400 !important; 
+		color: #FFFFFF  !important;
+	}
+</style>
diff --git a/pages/index/common/uni-popup/uni-popup.vue b/pages/index/common/uni-popup/uni-popup.vue
new file mode 100644
index 0000000..139b964
--- /dev/null
+++ b/pages/index/common/uni-popup/uni-popup.vue
@@ -0,0 +1,266 @@
+<template>
+	<view v-if="showPopup" class="uni-popup" @touchmove.stop.prevent="clear">
+		<uni-transition :mode-class="['fade']" :styles="maskClass" :duration="duration" :show="showTrans" @click="onTap" />
+		<uni-transition :mode-class="ani" :styles="transClass" :duration="duration" :show="showTrans" @click="onTap">
+			<view class="uni-popup__wrapper-box" @click.stop="clear">
+				<slot />
+			</view>
+		</uni-transition>
+	</view>
+</template>
+
+<script>
+	import uniTransition from '../uni-transition/uni-transition.vue'
+
+	/**
+	 * PopUp 弹出层
+	 * @description 弹出层组件,为了解决遮罩弹层的问题
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [top|center|bottom] 弹出方式
+	 * 	@value top 顶部弹出
+	 * 	@value center 中间弹出
+	 * 	@value bottom 底部弹出
+	 * @property {Boolean} animation = [ture|false] 是否开启动画
+	 * @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗
+	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
+	 */
+
+	export default {
+		name: 'UniPopup',
+		components: {
+			uniTransition
+		},
+		props: {
+			// 开启动画
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+			type: {
+				type: String,
+				default: 'center'
+			},
+			// maskClick
+			maskClick: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				duration: 300,
+				ani: [],
+				showPopup: false,
+				showTrans: false,
+				maskClass: {
+					'position': 'fixed',
+					'bottom': 0,
+					'top': 0,
+					'left': 0,
+					'right': 0,
+					'backgroundColor': 'rgba(0, 0, 0, 0.4)',
+					
+
+				},
+				transClass: {
+					'position': 'fixed',
+					'left': 0,
+					'right': 0,
+					
+				}
+			}
+		},
+		watch: {
+			type: {
+				handler: function(newVal) {
+					switch (this.type) {
+						case 'top':
+							this.ani = ['slide-top']
+							this.transClass = {
+								'position': 'fixed',
+								'left': 0,
+								'right': 0,
+							}
+							break
+						case 'bottom':
+							this.ani = ['slide-bottom']
+							this.transClass = {
+								'position': 'fixed',
+								'left': 0,
+								'right': 0,
+								'bottom': 0
+							}
+							break
+						case 'center':
+							this.ani = ['zoom-out', 'fade']
+							this.transClass = {
+								'position': 'fixed',
+								/* #ifndef APP-NVUE */
+								'display': 'flex',
+								'flexDirection': 'column',
+								/* #endif */
+								'bottom': 0,
+								'left': 0,
+								'right': 0,
+								'top': 0,
+								'justifyContent': 'center',
+								'alignItems': 'center'
+							}
+
+							break
+					}
+				},
+				immediate: true
+			}
+		},
+		created() {
+			if (this.animation) {
+				this.duration = 300
+			} else {
+				this.duration = 0
+			}
+		},
+		methods: {
+			clear(e) {
+				// TODO nvue 取消冒泡
+				e.stopPropagation()
+			},
+			open() {
+				this.showPopup = true
+				this.$nextTick(() => {
+					clearTimeout(this.timer)
+					this.timer = setTimeout(() => {
+						this.showTrans = true
+					}, 50);
+				})
+				/* this.$emit('change', {
+					show: true
+				}) */
+			},
+			close(type) {
+				this.showTrans = false
+				this.$nextTick(() => {
+					clearTimeout(this.timer)
+					this.timer = setTimeout(() => {
+						this.$emit('change', {
+							show: false
+						})
+						this.showPopup = false
+					}, 300)
+				})
+			},
+			onTap() {
+				if (!this.maskClick) return
+				this.close()
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup {
+		position: fixed;
+		/* #ifdef H5 */
+		top: var(--window-top);
+		/* #endif */
+		/* #ifndef H5 */
+		top: 0;
+		/* #endif */
+		bottom: 0;
+		left: 0;
+		right: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 9990;
+		/* #endif */
+	}
+
+	.uni-popup__mask {
+		position: absolute;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: $uni-bg-color-mask;
+		opacity: 0;
+	}
+
+	.mask-ani {
+		transition-property: opacity;
+		transition-duration: 0.2s;
+	}
+
+	.uni-top-mask {
+		opacity: 1;
+	}
+
+	.uni-bottom-mask {
+		opacity: 1;
+	}
+
+	.uni-center-mask {
+		opacity: 1;
+	}
+
+	.uni-popup__wrapper {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: absolute;
+	}
+
+	.top {
+		top: 0;
+		left: 0;
+		right: 0;
+		transform: translateY(-500px);
+	}
+
+	.bottom {
+		bottom: 0;
+		left: 0;
+		right: 0;
+		transform: translateY(500px);
+	}
+
+	.center {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex-direction: column;
+		/* #endif */
+		bottom: 0;
+		left: 0;
+		right: 0;
+		top: 0;
+		justify-content: center;
+		align-items: center;
+		transform: scale(1.2);
+		opacity: 0;
+	}
+
+	.uni-popup__wrapper-box {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: relative;
+	}
+
+	.content-ani {
+		// transition: transform 0.3s;
+		transition-property: transform, opacity;
+		transition-duration: 0.2s;
+	}
+
+
+	.uni-top-content {
+		transform: translateY(0);
+	}
+
+	.uni-bottom-content {
+		transform: translateY(0);
+	}
+
+	.uni-center-content {
+		transform: scale(1);
+		opacity: 1;
+	}
+</style>
diff --git a/pages/index/common/uni-transition/uni-transition.vue b/pages/index/common/uni-transition/uni-transition.vue
new file mode 100644
index 0000000..908a939
--- /dev/null
+++ b/pages/index/common/uni-transition/uni-transition.vue
@@ -0,0 +1,279 @@
+<template>
+	<view v-if="isShow" ref="ani" class="uni-transition" :class="[ani.in]" :style="'transform:' +transform+';'+stylesObject"
+	 @click="change">
+		 <slot></slot>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const animation = uni.requireNativePlugin('animation');
+	// #endif
+	/**
+	 * Transition 过渡动画
+	 * @description 简单过渡动画组件
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=985
+	 * @property {Boolean} show = [false|true] 控制组件显示或隐藏
+     * @property {Array} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
+     *  @value fade 渐隐渐出过渡
+     *  @value slide-top 由上至下过渡
+     *  @value slide-right 由右至左过渡
+     *  @value slide-bottom 由下至上过渡
+     *  @value slide-left 由左至右过渡
+     *  @value zoom-in 由小到大过渡
+     *  @value zoom-out 由大到小过渡
+	 * @property {Number} duration 过渡动画持续时间
+	 * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+	 */
+	export default {
+		name: 'uniTransition',
+		props: {
+			show: {
+				type: Boolean,
+				default: false
+			},
+			modeClass: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			duration: {
+				type: Number,
+				default: 300
+			},
+			styles: {
+				type: Object,
+				default () {
+					return {}
+				}
+			}
+		},
+		data() {
+			return {
+				isShow: false,
+				transform: '',
+				ani: { in: '',
+					active: ''
+				}
+			};
+		},
+		watch: {
+			show: {
+				handler(newVal) {
+					if (newVal) {
+						this.open()
+					} else {
+						this.close()
+					}
+				},
+				immediate: true
+			}
+		},
+		computed: {
+			stylesObject() {
+				let styles = {
+					...this.styles,
+					'transition-duration': this.duration / 1000 + 's'
+				}
+				let transfrom = ''
+				for (let i in styles) {
+					let line = this.toLine(i)
+					transfrom += line + ':' + styles[i] + ';'
+				}
+				return transfrom
+			}
+		},
+		created() {
+			// this.timer = null
+			// this.nextTick = (time = 50) => new Promise(resolve => {
+			// 	clearTimeout(this.timer)
+			// 	this.timer = setTimeout(resolve, time)
+			// 	return this.timer
+			// });
+		},
+		methods: {
+			change() {
+				this.$emit('click', {
+					detail: this.isShow
+				})
+			},
+			open() {
+				clearTimeout(this.timer)
+				this.isShow = true
+				this.transform = ''
+				this.ani.in = ''
+				for (let i in this.getTranfrom(false)) {
+					if (i === 'opacity') {
+						this.ani.in = 'fade-in'
+					} else {
+						this.transform += `${this.getTranfrom(false)[i]} `
+					}
+				}
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this._animation(true)
+					}, 50)
+				})
+
+			},
+			close(type) {
+				clearTimeout(this.timer)
+				this._animation(false)
+			},
+			_animation(type) {
+				let styles = this.getTranfrom(type)
+				// #ifdef APP-NVUE
+				if(!this.$refs['ani']) return
+				animation.transition(this.$refs['ani'].ref, {
+					styles,
+					duration: this.duration, //ms
+					timingFunction: 'ease',
+					needLayout: false,
+					delay: 0 //ms
+				}, () => {
+					if (!type) {
+						this.isShow = false
+					}
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				})
+				// #endif
+				// #ifndef APP-NVUE
+				this.transform = ''
+				for (let i in styles) {
+					if (i === 'opacity') {
+						this.ani.in = `fade-${type?'out':'in'}`
+					} else {
+						this.transform += `${styles[i]} `
+					}
+				}
+				this.timer = setTimeout(() => {
+					if (!type) {
+						this.isShow = false
+					}
+					this.$emit('change', {
+						detail: this.isShow
+					})
+
+				}, this.duration)
+				// #endif
+
+			},
+			getTranfrom(type) {
+				let styles = {
+					transform: ''
+				}
+				this.modeClass.forEach((mode) => {
+					switch (mode) {
+						case 'fade':
+							styles.opacity = type ? 1 : 0
+							break;
+						case 'slide-top':
+							styles.transform += `translateY(${type?'0':'-100%'}) `
+							break;
+						case 'slide-right':
+							styles.transform += `translateX(${type?'0':'100%'}) `
+							break;
+						case 'slide-bottom':
+							styles.transform += `translateY(${type?'0':'100%'}) `
+							break;
+						case 'slide-left':
+							styles.transform += `translateX(${type?'0':'-100%'}) `
+							break;
+						case 'zoom-in':
+							styles.transform += `scale(${type?1:0.8}) `
+							break;
+						case 'zoom-out':
+							styles.transform += `scale(${type?1:1.2}) `
+							break;
+					}
+				})
+				return styles
+			},
+			_modeClassArr(type) {
+				let mode = this.modeClass
+				if (typeof(mode) !== "string") {
+					let modestr = ''
+					mode.forEach((item) => {
+						modestr += (item + '-' + type + ',')
+					})
+					return modestr.substr(0, modestr.length - 1)
+				} else {
+					return mode + '-' + type
+				}
+			},
+			// getEl(el) {
+			// 	console.log(el || el.ref || null);
+			// 	return el || el.ref || null
+			// },
+			toLine(name) {
+				return name.replace(/([A-Z])/g, "-$1").toLowerCase();
+			}
+		}
+	}
+</script>
+
+<style>
+	.uni-transition {
+		transition-timing-function: ease;
+		transition-duration: 0.3s;
+		transition-property: transform, opacity;
+	}
+
+	.fade-in {
+		opacity: 0;
+	}
+
+	.fade-active {
+		opacity: 1;
+	}
+
+	.slide-top-in {
+		/* transition-property: transform, opacity; */
+		transform: translateY(-100%);
+	}
+
+	.slide-top-active {
+		transform: translateY(0);
+		/* opacity: 1; */
+	}
+
+	.slide-right-in {
+		transform: translateX(100%);
+	}
+
+	.slide-right-active {
+		transform: translateX(0);
+	}
+
+	.slide-bottom-in {
+		transform: translateY(100%);
+	}
+
+	.slide-bottom-active {
+		transform: translateY(0);
+	}
+
+	.slide-left-in {
+		transform: translateX(-100%);
+	}
+
+	.slide-left-active {
+		transform: translateX(0);
+		opacity: 1;
+	}
+
+	.zoom-in-in {
+		transform: scale(0.8);
+	}
+
+	.zoom-out-active {
+		transform: scale(1);
+	}
+
+	.zoom-out-in {
+		transform: scale(1.2);
+	}
+</style>
diff --git a/pages/index/components/NumSlider.vue b/pages/index/components/NumSlider.vue
new file mode 100644
index 0000000..5ce8578
--- /dev/null
+++ b/pages/index/components/NumSlider.vue
@@ -0,0 +1,170 @@
+<template>
+	<view class="m-slider" ref="slider" :style="{width: width + 'px'}">
+
+		<view class="u-slider-rail"></view>
+		<view class="u-slider-track" :style="{left: left +'px', width: (right - left) +'px'}"></view>
+		<view style=" transform: translateX(-50%); " class="u-slider-handle" ref="right"
+			@touchstart.stop.prevent="onRightMouseDown" @touchmove.stop.prevent="onRightMouseMove"
+			:style="{left: right +'px'}">
+			<view style="color: #ff5500; font-size: 30upx;"> {{defalutFilletData}} </view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'NumSlider',
+		props: {
+			min: { // 滑动输入条最小值
+				type: Number,
+				default: 0
+			},
+			max: { // 滑动输入条最大值
+				type: Number,
+				default: 100
+			},
+			initialMin: { // 滑动输入条初始最小值,默认在最左侧
+				type: Number,
+				default: 0
+			},
+			initialMax: { // 滑动输入条初始最大值,默认在最右侧
+				type: Number,
+				default: 60
+			},
+			width: { // 滑动输入条在页面中的宽度
+				type: Number,
+				default: 600
+			},
+			disabled: { // 是否禁用
+				type: Boolean,
+				default: false
+			},
+			range: { // 是否双滑块模式
+				type: Boolean,
+				default: false
+			},
+			leftX: {
+				type: Number,
+				default: 120
+			},
+			defalutFillet: {
+				type: Number,
+				default: 8
+			},
+
+		},
+		data() {
+			return {
+				left: '', // 左滑块距离滑动条左端的距离
+				right: '', // 右滑动距离滑动条左端的距离
+				defalutFilletData: 8,
+			}
+		},
+		computed: {
+			scale() {
+				return this.width / (this.max - this.min)
+			},
+			low() {
+				return Math.round(this.left / this.scale + this.min)
+			},
+			high() {
+				return Math.round(this.right / this.scale + this.min)
+			}
+		},
+		watch: {
+			low(to) {
+				this.$emit('lowChange', to) // 左滑块对应数字回调
+			},
+			high(to) {
+			 // 右滑块对应数字回调
+				this.defalutFilletData = Math.floor((to / 10) * 1.5); 
+					this.$emit('highChange', 	this.defalutFilletData)
+				//Math.floor((this.defalutFillet / 50) * to);
+				//console.log("to=" + to + "this.defalutFilletData=" + this.defalutFilletData
+
+			}
+		},
+
+		mounted() {
+			this.left = this.range ? (this.initialMin - this.min) * this.scale : 0
+			this.right = (this.initialMax - this.min) * this.scale
+		},
+
+		methods: {
+
+			onRightMouseMove(e) {
+				var moveX = e.changedTouches[0].pageX - this.leftX
+				if (moveX > this.width) {
+					this.right = this.width
+				} else if (moveX <= this.left) {
+					this.right = this.left
+				} else {
+					this.right = moveX
+				}
+			},
+
+			onRightMouseDown(e) { // 在滚动条上拖动右滑块
+				e.preventDefault();
+				var moveX = e.changedTouches[0].pageX - this.leftX
+				if (moveX > this.width) {
+					this.right = this.width
+				} else if (moveX <= this.left) {
+					this.right = this.left
+				} else {
+					this.right = moveX
+				}
+			},
+
+			init() {
+				this.left = this.range ? (this.initialMin - this.min) * this.scale : 0
+				this.right = (this.initialMax - this.min) * this.scale
+			},
+
+
+		},
+	}
+</script>
+<style lang="less" scoped>
+	@themeColor: rgb(121, 72, 234);
+
+	.m-slider {
+		display: inline-block;
+		height: 4px;
+		padding: 6px 0;
+		position: relative;
+		z-index: 9;
+
+		.u-slider-rail {
+			position: absolute;
+			z-index: 99;
+			height: 4px;
+			width: 100%;
+			background: #f5f5f5;
+			border-radius: 2px;
+		}
+
+		.u-slider-track {
+			position: absolute;
+			z-index: 99;
+			background: rgb(121, 72, 234);
+			border-radius: 4px;
+			height: 4px;
+		}
+
+		.u-slider-handle {
+			// 滑块
+			position: absolute;
+			z-index: 999;
+			width: 27px;
+			height: 27px;
+			line-height: 27px;
+			text-align: center;
+			top: -10px;
+			background: #fff;
+			border: 4px solid rgb(121, 72, 234);
+			border-radius: 50%;
+		}
+	}
+
+	.disabled {}
+</style>
diff --git a/pages/index/components/bgColor.vue b/pages/index/components/bgColor.vue
new file mode 100644
index 0000000..48837a8
--- /dev/null
+++ b/pages/index/components/bgColor.vue
@@ -0,0 +1,120 @@
+<template>
+	<!-- 贴图 -->
+	<view class="content" style="width: 100%; height: 100%; position: relative;overflow: hidden;" :style="{height: windowHeight +'px'}">
+		<refresh @interrupt="interrupt" @pushToInterrupt="pushToInterrupt" @finished="finished" @scrolltolower="g"
+		:scrollHeight="windowHeight">
+			<template slot="top">
+				<view style="color: #FFFFFF;position: absolute;  top: 0;width: 100%; text-align: center;" 
+				:style="'height:' + 40 + 'px; line-height:' + 40 + 'px;'">{{tip}}</view>
+			</template>
+			<template slot="content">
+				<view style="width:100%; margin: auto; height:calc(100% - 40upx); overflow: hidden;">
+					<view style="float: left; width: calc(100% / 3); margin: 40upx 0 0;" 
+						v-for="(item, index) in datalist" :key="index" @click="bgColorAssembly(item)">
+						<view style="width: 139upx; height: 255upx; margin: auto; position: relative;">
+							<view style="width: 139upx; height: 255upx; margin: auto; border-radius: 14px; overflow: hidden;" 
+							:style="'background:' + item.color"></view>
+						</view>
+					</view>
+					<view class="align-center" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);"
+					 v-if="datalist.length == 0">
+						<span class="iconfont icon-wushuju" style="font-size: 100upx; text-align: center; color: #B2B2B2;"></span>
+						<view style="color: #B2B2B2; text-align: center; line-height: 50upx;font-size: 24upx;">啊嘞,还是一片荒漠</view>
+					</view>
+				</view>
+			</template>
+			<template slot="bottom">
+				<view>
+				没有更多数据了
+				</view>
+			</template>
+		</refresh>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js';
+	import refresh from '@/components/xing-refresh/xing-refresh.vue';
+	export default {
+		props: {
+			windowHeight: {
+				type: Number,
+				default: 563
+			}
+		},
+		components: {
+			refresh
+		},
+		data() {
+			return {
+				queryPage: {
+					s: 'Material.colorList',
+					page:1,
+					per_page:20,
+				},
+				datalist: [], //作品、贴图列表
+				tip: ''
+			};
+		},
+		mounted() {
+			
+		},
+		methods: {
+			bgColorAssembly(item){
+				this.$emit('bgColorAssembly',item.color)
+			},
+			g(e){
+				uni.showLoading({
+					title: '正在加载中...'
+				})
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.datalist = this.datalist.concat(result.data)
+					this.queryPage.page += 1;
+					if (Math.ceil(result.total / result.per_page) <= this.queryPage.page) {
+						return setTimeout(() => {
+							uni.showToast({title: '没有更多数据了!',icon: 'none'});
+						}, 500);
+					}
+					uni.hideLoading();
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'})
+					uni.hideLoading();
+				});
+			},
+			interrupt(e) {
+				this.tip = '刷新中'
+				//模拟发送请求
+				setTimeout(e, 500);
+				this.tip = '刷新成功';
+				this.queryPage.page = 1
+				this.getShapeList()
+			},
+			pushToInterrupt() {
+				this.tip = '释放刷新';
+			},
+			finished() {
+				this.tip = '下拉刷新';
+			},
+			open() {
+				this.queryPage.page = 1
+				this.getShapeList()
+			},
+			getShapeList(){
+				this.datalist = []
+				uni.showLoading({title: '正在加载中...'})
+				//查询颜色列表
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.datalist = result.data
+					this.queryPage.page += 1;
+					uni.hideLoading();
+					this.tip = '';
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'})
+					uni.hideLoading();
+				});
+			}
+		}
+	}
+</script>
+<style lang="scss">
+</style>
\ No newline at end of file
diff --git a/pages/index/components/scrollView.vue b/pages/index/components/scrollView.vue
new file mode 100644
index 0000000..a18aa79
--- /dev/null
+++ b/pages/index/components/scrollView.vue
@@ -0,0 +1,386 @@
+<template>
+	<!-- 贴图 -->
+	<view v-if="showState" class="content" style="width: 100%; height: 100%; position: relative;overflow: hidden;"
+		:style="{height: windowHeight +'px',background: backColorVal}">
+		<refresh ref="refresh" @interrupt="interrupt" @pushToInterrupt="pushToInterrupt" @finished="finished"
+			@scrolltolower="g" :scrollHeight="windowHeight" :scrollTop="scrollViewTop" @scroll="scroll">
+			<template slot="top">
+				<view style="color: #FFFFFF;position: absolute;  top: 0;width: 100%; text-align: center;"
+					:style="'height:' + 40 + 'px; line-height:' + 40 + 'px;'">{{tip}}</view>
+			</template>
+			<template slot="content">
+				<view style="width:100%; margin: auto; height:calc(100% - 40upx); overflow: hidden;">
+					<view style="float: left; width: calc(100% / 3); margin: 10upx 0 10upx;"
+						v-for="(item, index) in datalist" :key="index" @click="Worksdetail(item)">
+						<view style="width: 139upx; height: 255upx; margin: auto; position: relative;">
+							<image
+								style="width: 139upx; height: 255upx; margin: auto; border-radius: 14px; overflow: hidden;"
+								:src="(item.image ? item.image:item.url) + '?x-oss-process=image/resize,lfit,w_112'"
+								mode="aspectFit"></image>
+							<view v-if="type != 99">
+								<view v-if="Number(item.price) >  0 && type != 99 " style="min-width: 39upx; position: absolute; top: 0; right: 0; 
+							   background: #EF5354; border-radius: 8upx 0upx 11upx 8upx; text-align: center; padding: 2upx 8upx;
+							   font-size: 18upx; font-weight: bold; color: #FFFFFF;">¥{{item.price}}</view>
+							</view>
+						</view>
+					</view>
+					<view class="align-center"
+						style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);"
+						v-if="datalist.length == 0">
+						<span class="iconfont icon-wushuju"
+							style="font-size: 100upx; text-align: center; color: #B2B2B2;"></span>
+						  <view style="color: #B2B2B2; text-align: center; line-height: 50upx;font-size: 24upx;">啊嘞,还是一片荒漠
+						</view>
+					</view>
+				</view>
+			</template>
+			<template slot="bottom">
+				<view>
+					没有更多数据了
+				</view>
+			</template>
+		</refresh>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js';
+	import refresh from '@/components/xing-refresh/xing-refresh.vue';
+	export default {
+		props: {
+			windowHeight: {
+				type: Number,
+				default: 563
+			}
+		},
+		components: {
+			refresh
+		},
+		data() {
+			return {
+				queryPage: {
+					s: 'Material.list',
+					page: 1,
+					per_page: 50,
+					is_revise: '1', //可调整
+					is_edit: '1', //模板属性
+					is_new: null, //最新
+					is_hot: null, //热门
+					machine_id: null, //设备id=
+					material_category_id: "", //
+					material_series_id: "",
+					goods_feature_id:null,
+				},
+				queryCollectionPage: {
+
+				},
+				historyQueryPage: {
+					goods_id: "", //产品Id
+					s: 'Works.myList',
+				}, //历史对象
+				Material_categorydatalist: [], //作品、贴图列表
+				datalist: [], //作品、贴图列表
+				Material_category: [], //贴图分类
+				currentId: -1,
+				/* 控制被选中 */
+				currentIndex: null,
+				/* 控制位置 */
+				tip: '',
+				showState: false,
+				type: 0, //默认 0
+				item: null,
+				scrollViewTop: 0, //滚动距离
+				oldScrollViewTop: 0, //旧数据到顶部位置
+				e: 0, //   弹窗类型
+				isWork: false, //是否作品
+				backColorVal:""
+			};
+		},
+		mounted() {
+
+		},
+		/**
+		 * 组件的公有方法列表
+		 */
+		methods: {
+
+			scroll(e) {
+				if (e.detail.scrollTop > 1) {
+					this.oldScrollViewTop = e.detail.scrollTop - 0.01
+				}
+			},
+
+			Worksdetail(item) {
+				item.isWork = this.isWork;
+				this.$emit('Worksdetail', item)
+			},
+
+			g(e) {
+				if (this.type == 99) {
+					this.getExcellentMaterialMore(this.item.queryPage)
+				} else {
+					uni.showLoading({
+						title: '正在加载中...'
+					})
+					homeservice.WorksList(this.queryPage).then(result => {
+						this.Material_categorydatalist = this.Material_categorydatalist.concat(result.data)
+						this.datalist = this.datalist.concat(result.data)
+						this.queryPage.page += 1;
+						if (Math.ceil(result.total / result.per_page) <= this.queryPage.page) {
+							return setTimeout(() => {
+								uni.showToast({
+									title: '没有更多数据了!',
+									icon: 'none'
+								});
+							}, 500);
+						}
+						uni.hideLoading();
+					}).catch(err => {
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						})
+						uni.hideLoading();
+					});
+				}
+			},
+
+			interrupt(e) {
+				this.tip = '刷新中'
+				setTimeout(e, 500);
+				this.tip = '刷新成功';
+				this.queryPage.page = 1
+				if (this.type == 99) {
+					this.queryCollectionPage.page = 1;
+					this.getExcellentMaterial(this.item.queryPage)
+				} else {
+					this.getShapeList()
+				}
+			},
+
+			pushToInterrupt() {
+				this.tip = '释放刷新';
+			},
+
+			finished() {
+				this.tip = '下拉刷新';
+			},
+
+			open(item) {
+				if(item.val){
+					this.backColorVal = item.val
+				}else{
+					this.backColorVal = "";
+				}
+				if (this.e != item.e) {
+					this.datalist = [];
+				}
+				this.queryPage.goods_feature_id = this.$base.goods_feature_id
+				this.isWork = false; //是否作品
+				this.e = item.e;
+				this.scrollViewTop = 0;
+				this.type = 0;
+				this.showState = false;
+				let loadData = false;
+				if (item.e == 23 || item.e == 2) {
+					if (this.queryPage.material_category_id == item.queryPage.material_category_id) {
+						if (this.queryPage.material_series_id != item.queryPage.material_series_id) {
+							loadData = true;
+						}
+					} else {
+						loadData = true;
+					}
+					if (this.datalist == null || this.datalist.length == 0) {
+						loadData = true;
+					}
+				} else if (item.e == 99) {
+					if (this.currentId != item.queryPage.currentId || this.currentId == -1) {
+						loadData = true;
+					}
+					if (this.datalist == null || this.datalist.length == 0) {
+						loadData = true;
+					}
+				}
+				this.queryPage = {
+					s: item.queryPage.s,
+					page: item.queryPage.page, //分页
+					per_page: item.queryPage.per_page, //分页
+					is_revise: item.queryPage.is_revise, //可调整
+					is_edit: item.queryPage.is_edit, //模板属性
+					machine_id: item.queryPage.machine_id, //设备id
+					goods_category_id: item.queryPage.goods_category_id, //星形接口列表增加,产品分类参数
+					material_category_id: item.queryPage.material_category_id, //贴图壁纸选择值一级分类
+					material_series_id: item.queryPage.material_series_id, //贴图壁纸选择值二级分类
+					is_new: item.queryPage.is_new, //最新
+					is_hot: item.queryPage.is_hot, //热门
+					goods_id: item.queryPage.goods_id, //商品id
+					is_under: item.queryPage.is_under, //贴图是否为背景图
+					partner_id: item.queryPage.partner_id ,//代理
+					goods_feature_id:this.$base.goods_feature_id
+				}
+				if (item.e == 2) { //贴图
+					if (loadData) {
+						this.queryPage.is_under = '0' //贴图标识
+						this.scrollViewTop = 0;
+						this.oldScrollViewTop = 0;
+						this.getShapeList()
+					} else {
+						this.scrollViewTop = this.oldScrollViewTop
+						this.showState = true;
+					}
+				} else if (item.e == 23) { //壁纸
+					if (loadData) {
+						this.queryPage.page = 1;
+						this.queryPage.is_under = '1' //壁纸标识
+						this.oldScrollViewTop = 0;
+						this.scrollViewTop = 0;
+						this.getShapeList()
+					} else {
+						this.scrollViewTop = this.oldScrollViewTop
+						this.showState = true;
+					}
+				} else if (item.e == 24) { //背景底色
+					this.queryPage.is_under = '1' //壁纸标识
+					this.queryPage.surface_color_series_id = this.$base.surfaceData.surface_color_series_id //色系编号
+					this.getShapeList()
+					this.oldScrollViewTop = 0;
+					this.scrollViewTop = 0;
+				} else if (item.e == 99) { //点赞贴图
+					if (loadData) {
+						this.scrollViewTop = 0;
+						this.oldScrollViewTop = 0;
+						this.type = 99;
+						this.queryCollectionPage = {
+							page: 1,
+							limit: 25
+						}
+						this.datalist = [];
+						this.item = item;
+						this.getExcellentMaterial(item.queryPage)
+					} else {
+						this.type = 99;
+						this.item = item;
+						if (item.queryPage.currentId == 0) {
+							this.isWork = true;
+						}
+						this.scrollViewTop = this.oldScrollViewTop
+						this.showState = true;
+					}
+				}
+			},
+
+			getExcellentMaterialMore(e) {
+				if (e.currentId == 0) {
+
+				} else {
+					let url = ''
+					uni.showLoading({
+						title: '正在加载中...'
+					})
+					this.isWork = false;
+					if (e.currentId == 1) url = '/douyin/Material/getMeMaterial'
+					else if (e.currentId == 1) url = '/douyin/Material/getMeCollection'
+					else if (e.currentId == 2) url = '/douyin/Material/getFollowMaterials'
+					this.$http.post(url, this.queryCollectionPage).then(result => {
+						this.showState = true
+						if (result.data == null || result.data == "") {
+							uni.showToast({
+								title: '没有更多数据了!',
+								icon: 'none'
+							});
+						} else {
+							this.Material_categorydatalist = this.Material_categorydatalist.concat(result.data.data);
+							this.datalist = this.datalist.concat(result.data.data);
+							this.queryCollectionPage.page += 1;
+							if (Math.ceil(result.total / result.per_page) <= this.queryCollectionPage.page) {
+								return setTimeout(() => {
+									uni.showToast({
+										title: '没有更多数据了!',
+										icon: 'none'
+									});
+								}, 500);
+							}
+						}
+						uni.hideLoading();
+					}).catch(err => {
+						this.showState = true
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						})
+						uni.hideLoading();
+					});
+				}
+			},
+
+			getExcellentMaterial(e) {
+				this.datalist = []
+				uni.showLoading({
+					title: '正在加载中...'
+				})
+				this.currentId = e.currentId;
+				if (e.currentId == 0) {
+					this.isWork = true;
+					this.historyQueryPage.goods_id = this.item.goods_id;
+					homeservice.WorksList(this.historyQueryPage).then(result => {
+						this.showState = true
+						this.datalist = result.data
+						uni.hideLoading();
+					}).catch(err => {
+						this.showState = true
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						})
+						uni.hideLoading();
+					});
+				} else {
+					let url = ''
+					if (e.currentId == 1) url = '/douyin/Material/getMeMaterial'
+					else if (e.currentId == 2) url = '/douyin/Material/getMeCollection'
+					else if (e.currentId == 3) url = '/douyin/Material/getFollowMaterials'
+					this.$http.post(url, this.queryCollectionPage).then(result => {
+						this.showState = true
+						this.Material_categorydatalist = result.data.data
+						this.datalist = result.data.data;
+						this.queryCollectionPage.page += 1;
+						uni.hideLoading();
+						this.tip = '';
+					}).catch(err => {
+						this.showState = true
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						})
+						uni.hideLoading();
+					});
+				}
+			},
+
+			//贴图列表
+			getShapeList() {
+				this.datalist = []
+				uni.showLoading({
+					title: '正在加载中...'
+				})
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.showState = true
+					this.Material_categorydatalist = result.data
+					this.datalist = result.data
+					this.queryPage.page += 1;
+					uni.hideLoading();
+					this.tip = '';
+				}).catch(err => {
+					this.showState = true
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					})
+					uni.hideLoading();
+				});
+			}
+		}
+	}
+</script>
+<style lang="scss">
+</style>
diff --git a/pages/index/components/switchBrands.vue b/pages/index/components/switchBrands.vue
new file mode 100644
index 0000000..bf67af6
--- /dev/null
+++ b/pages/index/components/switchBrands.vue
@@ -0,0 +1,1227 @@
+<template>
+	<view>
+		<!-- 品牌 -->
+		<uni-popup ref="brandscenter" type="center" @change="change" :style="{height: (MobilePhoneHeight * 0.8) +'px'}">
+			<view style="width: 690upx; margin:auto; display: flex; flex-direction: column;">
+				<view :style="{height: (MobilePhoneHeight * 0.82) +'px'}"
+					style="width:100%; background: #FFFFFF; border-radius: 30upx; position: relative;">
+					<view @click="cancelBrand()" style="position: absolute; top: 0upx; right: 0upx;">
+						<image src="../../../static/icon_guanbi.png" mode=""
+							style="height: 23upx; width: 23upx; padding: 21upx 33upx;"></image>
+					</view>
+					<view style="margin:62upx auto 82upx;font-size: 36upx; text-align: center;">
+						请选择手机品牌
+					</view>
+					<scroll-view scroll-y scroll-with-animation
+						:style="{height: (MobilePhoneHeight * 0.75) - 200*pixelRate +'px'}" style="box-sizing: border-box;white-space: nowrap;
+					width: 510upx; margin:0 auto; overflow: hidden; ">
+						<view v-for="(item,index) in catrgoryList" :key="index" @click="brandclick(item)">
+							<!-- 1-4 -->
+							<view v-if="catrgoryList.length > 0 && catrgoryList.length <= 4" style="margin:0 0 10upx;
+								display: flex;align-items: center; justify-content: center;
+								background: #EEEEEE;border-radius: 10upx;
+								height: 150upx; width: 510upx;" hover-class="brandactive"
+								:class="[brandtext == item.title ? 'brandactive':'' ]">
+								<view style="width: 150upx;">
+									<image :src="item.icon" mode="aspectFit"
+										  style="width: 80upx; height: 80upx; margin: auto; display: block;"></image>
+								</view>
+								<view style="font-size: 28upx; margin-top: 10upx; max-width: 360upx;
+									overflow: hidden; text-overflow: ellipsis; white-space: nowrap;word-break:break-all;">
+									{{item.title || ''}}
+								</view>
+							</view>
+							<!-- 5-6 -->
+							<view v-if="catrgoryList.length >= 5 && catrgoryList.length <= 6" style="float: left; margin:0 5upx 10upx; 
+								display: flex;align-items: center;
+								background: #EEEEEE;border-radius: 10upx;
+								height: 240upx; width: 240upx;" hover-class="brandactive"
+								:class="[brandtext == item.title ? 'brandactive':'' ]">
+								<view style="width: 100%;">
+									<!-- <view style=" height: 35upx">
+									  <view v-if="item.is_size == 1"   style="border-radius: 25upx 25upx 0upx 25upx; width:110upx; height: 35upx; background: #F5696A; color: #FFFFFF; font-size: 19upx; line-height: 35upx; text-align: center;" > 官方数据</view>
+									</view> -->
+									<image :src="item.icon" mode="aspectFit"
+										style="width: 60%; height: 80upx; margin: auto; display: block;"></image>
+									<view style="text-align: center; font-size: 28upx;  width: 95%; margin: auto;
+									overflow: hidden; text-overflow: ellipsis; white-space: nowrap;word-break:break-all;">
+										{{item.title || ''}}
+									</view>
+								</view>
+							</view>
+							<!-- 大于六个 -->
+							<view v-if="catrgoryList.length > 6" style="float: left; margin: 10upx;
+								display: flex;align-items: center;
+								background: #EEEEEE;border-radius: 10upx;
+								height: 150upx; width: 150upx;" hover-class="brandactive"
+								:class="[brandtext == item.title ? 'brandactive':'' ]">
+								<view style="width: 100%;">
+									<!-- <view style=" height: 35upx">
+									  <view v-if="item.is_size == 1"   style="border-radius: 25upx 25upx 0upx 25upx; width:110upx; height: 35upx; background: #F5696A; color: #FFFFFF; font-size: 19upx; line-height: 35upx; text-align: center;" > 官方数据</view>
+									</view> -->
+									<image :src="item.icon" mode="aspectFit"
+										style="width: 50%; height: 60upx; margin: auto; display: block;"></image>
+									<view style="text-align: center; font-size: 24upx;  width: 95%; margin: auto;
+									overflow: hidden; text-overflow: ellipsis; white-space: nowrap;word-break:break-all;">
+										{{item.title || ''}}
+									</view>
+								</view>
+							</view>
+						</view>
+					</scroll-view>
+
+					<view v-if="isShowCustomize"
+						style="text-align: center; color: rgba(121, 72, 234, 1); font-weight: 550;margin-top: 5upx;"
+						@click="toCustomSize()"> 自定义尺寸 </view>
+					<!-- 无数据 -->
+					<view v-if="catrgoryList.length < 0" style="text-align: center; color: #BEBEBE;">该设备没有库存</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 机型 -->
+		<uni-popup ref="modelShow" type="bottom" @change="change" style="position: fixed; z-index: 9998;"
+			:style="{height: MobilePhoneHeight +'px'}">
+			<view style="width: 750upx; margin:auto; display: flex; flex-direction: column;">
+				<view :style="{height: MobilePhoneHeight +'px'}"
+					style="width:100%; background: #FFFFFF; border-radius: 30upx 30upx 0 0; position: relative;">
+					<view @click="cancelModel()" style="position: absolute; top: 0upx; right: 0upx;">
+						<image src="../../../static/icon_guanbi.png" mode=""
+							style="height: 23upx; width: 23upx; padding: 21upx 33upx;"></image>
+					</view>
+					<view style="margin:62upx auto 82upx;font-size: 36upx; text-align: center;">
+						请选择手机型号
+					</view>
+					<scroll-view scroll-y scroll-with-animation
+						:style="{height: MobilePhoneHeight - 160*pixelRate +'px'}" style="box-sizing: border-box;
+					width: calc(100% - 40upx); margin:20upx auto; height: 1000upx; overflow: hidden;">
+						<view v-for="(item,index) in sizelist" :key="index"
+							style="float: left; width: calc(100% / 3); margin-bottom: 10upx;" @click="modelclick(item)">
+							
+							<view style=" height: 35upx">
+							  <view v-if="item.is_size == 1"   style="border-radius: 25upx 25upx 0upx 25upx; width:120upx; height: 35upx; background: #F5696A; color: #FFFFFF; font-size: 19upx; line-height: 35upx; text-align: center;" > 官方数据</view>
+							</view>
+							
+							<image :src="item.goods_pic" mode="aspectFit"
+								style="width: 160upx; height: 160upx; margin: auto; display: block;"></image>
+							<view style="font-size: 24upx;font-weight: 500;
+							 text-align: center; height: 66upx;
+							overflow: hidden; width: 100%;
+							display:-webkit-box;
+							-webkit-box-orient: vertical;
+							-webkit-line-clamp: 2;" :class="[goods_id == item.id ? 'modelactive':'' ]">{{item.name || ''}} </view>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 壳子 -->
+		<uni-popup ref="shellShow" type="bottom" @change="change" style="position: fixed; z-index: 9998;"
+			:style="{height: MobilePhoneHeight +'px'}">
+			<view style="width: 750upx; margin:auto; display: flex; flex-direction: column;">
+				<view :style="{height: MobilePhoneHeight +'px'}"
+					style="width:100%; background: #FFFFFF; border-radius: 30upx 30upx 0 0; position: relative;">
+					<view @click="shellModel()" style="position: absolute; top: 0upx; right: 0upx;">
+						<image src="../../../static/icon_guanbi.png" mode=""
+							style="height: 23upx; width: 23upx; padding: 21upx 33upx;"></image>
+					</view>
+					<!-- 定制壳自带壳 80 -->
+					<view style="display: flex; justify-content: center;height: 80upx;">
+						<view style="border-radius:0 0 0 40upx;" @click="customDhell" v-if="choose_surfaceState"
+							:class="['classification', { active: category == 0 }]">
+							定制壳
+						</view>
+						<view :class="['classification', { active: category == 1 }]" @click="selfContainedShell"
+							v-if="self_surfaceState">
+							自带手机壳
+						</view>
+					</view>
+					<!-- 定制壳 248 + 31-->
+					<view v-show="category == 0">
+						<view v-if="brands.length > 1"
+							style="display: flex; align-items: center; width: calc(100% - 40upx); margin:31upx auto 0;">
+							<image src="../../../static/icon_more_left.png" mode="" style="width: 64upx; height: 64upx;"
+								@click="leftTo()"></image>
+							<scroll-view class="scroll-container" :scroll-left="scrollLeft" @scroll="scrollLeftTo"
+								scroll-x scroll-with-animation :scroll-into-view="'s' + currentIndex">
+								<view :class="['scroll-item', { active: index == currentId }]" :id="'s' + index"
+									v-for="(item, index) in brands" :key="index" @tap="handleScroll(item, index)">
+									<image :src="item.preview + '?x-oss-process=image/resize,lfit,w_300'"
+										mode="aspectFit" style="width: 80upx; height: 160upx; margin:28upx auto 20upx;">
+									</image>
+									<view v-if="key == 2" style="font-size: 24upx; text-align: center; width: 95%; margin: auto;
+									overflow: hidden; text-overflow: ellipsis; white-space: nowrap;word-break:break-all;">
+										{{ item.name || ''}}
+									</view>
+								</view>
+							</scroll-view>
+							<image src="../../../static/icon_more_right.png" mode=""
+								style="width: 64upx; height: 64upx;" @click="rightTo()"></image>
+						</view>
+						<view :style="{height: MobilePhoneHeight - (80 + 248 + 31 + 112)*pixelRate +'px'}"
+							style="display: flex; align-items: center; justify-content: center;">
+							<view>
+								<!-- 图片 -->
+								<image @click="ordersize(brandsitem.id)" v-if="brands.length > 1"
+									:src="brandsitem.preview + '?x-oss-process=image/resize,lfit,w_750'" mode="widthFix"
+									style="width: 260upx; min-height: 260upx; margin:auto; display: block;"></image>
+								<view v-if="brands.length > 1"
+									style="font-size: 30upx; font-weight: 500;line-height: 22upx; text-align: center; margin-top: 10upx;">
+									{{ goods_id_e.modeltext || ''}}
+								</view>
+								<image @click="ordersize(brandsitem.id)" v-if="brands.length == 1"
+									:src="brandsitem.preview + '?x-oss-process=image/resize,lfit,w_750'" mode="widthFix"
+									style="width: 310upx; min-height: 310upx; margin:auto; display: block;"></image>
+								<view
+									style="font-size: 30upx; font-weight: 500;line-height: 22upx; text-align: center; margin-top: 10upx;">
+									{{ brandsitem.name || ''}}
+								</view>
+								<view @click="ordersize(brandsitem.id)"
+									style="font-size: 24upx; font-weight: 500; color: #864BC3; text-align: center; line-height: 50upx; margin-top: 20upx;">
+									材质详情>
+								</view>
+							</view>
+						</view>
+						<view class="determineBut" @click="determine(2)">确定</view>
+					</view>
+					<!-- 自带壳 -->
+					<view v-show="category == 1">
+						<scroll-view scroll-y scroll-with-animation
+							:style="{height: MobilePhoneHeight - 430*pixelRate +'px'}" style="box-sizing: border-box;white-space: nowrap;
+						width: 540upx; margin:50upx auto 0; overflow: hidden;">
+							<view v-for="(item,index) in backgroundColorData" :key="index"
+								@click="backgroundColor(item)" style="float: left; margin:0 4upx 8upx;
+								border-radius: 10upx;
+								border: 2upx solid #FFFFFF;
+								height: 96upx; width: 96upx;" :style="{background: item.color_code}"
+								:class="[surface_color_id_text == item.color_code ? 'backgroundColoractive':'' ]">
+								<span class="tooltiptext"
+									:class="[surface_color_id_text == item.color_code ? 'tooltiptextactive':'' ]">
+									{{item.name}}
+								</span>
+							</view>
+						</scroll-view>
+						<view style="font-size: 30upx; font-weight: 500; color: #F60C0C;
+						line-height: 50upx; text-align: center;">
+							请点选您当前的手机壳颜色
+						</view>
+						<view style="font-size: 30upx; font-weight: 500;line-height: 50upx; text-align: center;">
+							{{ goods_id_e.modeltext || ''}}
+						</view>
+						<view class="determineBut" @click="well()">确定</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 请选择颜色 -->
+		<uni-popup ref="colorcenter" type="center" @change="change" style="position: fixed; z-index: 9999;">
+			<view class="uni-share" style="width: 100%; margin: auto;">
+				<view style="width: 690upx; margin:auto; display: flex; flex-direction: column;">
+					<view
+						style="width:100%; min-height: 1000upx; background: #dcdcdc; border-radius: 30upx; position: relative;">
+						<view @click="colorCose()" style="position: absolute; top: 0upx; right: 0upx;">
+							<image src="../../../static/icon_guanbi.png" mode="aspectFill"
+								style="height: 23upx; width: 23upx; padding: 21upx 33upx;"></image>
+						</view>
+						<view style="margin:122upx auto 94upx;font-size: 36upx;text-align: center; color: #864BC3;">
+							请在扇区点选自带的手机壳颜色
+						</view>
+						<view style="width: 690upx; height: 500upx;"
+							v-if="chartData.series.length > 0 && chartDataState">
+							<canvas canvas-id="canvasPie" id="canvasPie" style="width: 690upx; height: 500upx;"
+								@touchstart="touchStart"></canvas>
+						</view>
+						<view v-else style="line-height: 500upx; text-align: center;">
+							暂无颜色推荐
+						</view>
+						<view class="determineButtn" @click="well()">确定</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 自带材质 -->
+		<mpvue-picker ref="mpvuePicker" :themeColor="'#53B2B0'" :mode="mode" :pickerValueDefault="pickerValueDefault"
+			@onChange="onChange" @onConfirm="onConfirm" @onCancel="onCancel" :pickerValueArray="pickerValueArray">
+		</mpvue-picker>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js';
+	import uniPopup from '../common/uni-popup/uni-popup.vue';
+	import mpvuePicker from '@/components/mpvue-picker/mpvuePicker.vue';
+	import uCharts from '@/js_sdk/u-charts/u-charts.js';
+	var _self;
+	var canvaPie = null;
+	export default {
+		props: {
+			// windowHeight: {
+			// 	type: Number,
+			// 	default: 1
+			// },
+			// pixelRate: {
+			// 	type: Number,
+			// 	default: 1
+			// },
+		},
+		components: {
+			uniPopup,
+			mpvuePicker
+		},
+		data() {
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				chartData: {
+					categories: [],
+					series: []
+				},
+				chartDataState: false,
+				mode: 'selector',
+				pickerValueArray: [],
+				pickerValueDefault: [0],
+				brands: [],
+				currentId: 0,
+				/* 控制被选中 */
+				currentIndex: 0,
+				/* 控制位置 */
+				brandsitem: null,
+				queryPage: {
+					s: 'Material.list',
+				},
+				category: 0, // 0:定制壳 1:自带壳
+				baseSetting: null, //获取设备是否开启支付、是否开放材质的接口
+				choose_surfaceState: false, // 是否开启材质选择 0:不开放 1:开放
+				self_surfaceState: false, // 是否开启自带材质 0:不开放 1:开放
+				texture: { //自带材质
+					materialScience: null, //名称
+					materialScienceId: null, //自带材质id
+					price: null, //金额
+				},
+				long: null,
+				catrgoryList: [],
+				sizelist: [],
+				brandtext: null,
+				modeltext: null,
+				goods_id: null,
+				dict_id: null,
+				machine_id: null,
+				key: null, //1直营配送站 2 万能通用版 3色彩自助站
+				goods_id_e: null,
+				sn: null,
+				titleHeight: 0,
+				MobilePhoneHeight: 0,
+				pixelRate: 1,
+				surface_id: 0, //材质对应的编号,没有的话就为0或者不传
+				surface_color: null, //材质颜色
+				surfaceName: null, //材质名称
+				surface_color_series_id: 0, //选择的色系编号,没有的话就不传或者为0
+				surface_color_id: 0, //选择的颜色编号,没有的话就不传或者为0
+				surface_color_series_id_text: null,
+				surface_color_id_text: null,
+				ColorSeriesData: null, //获取色彩主题的接口
+				switchBrandState: 0, //0正常 1跳过选择手机型号 2定制页选择材质
+				scrollLeft: 0,
+				old: {
+					scrollLeft: 0,
+					scrollWidth: 0
+				},
+				backgroundColorId: null,
+				backgroundColorData: [],
+				isShowCustomize: false, //是否显示自定义尺寸
+			};
+		},
+		mounted() {},
+		methods: {
+
+			//调转自定义页面
+			toCustomSize() {
+				this.$emit('toCustomSize')
+			},
+
+			backgroundColor(item) {
+				this.surface_color_series_id = item.surface_color_series_id //选择的色系编号,没有的话就不传或者为0
+				this.surface_color_id = item.id
+				this.surface_color_id_text = item.color_code
+			},
+
+			scrollLeftTo(e) {
+				this.old.scrollLeft = e.detail.scrollLeft
+				this.old.scrollWidth = e.detail.scrollWidth
+			},
+
+			leftTo() {
+				this.scrollLeft = this.old.scrollLeft
+				this.$nextTick(() => {
+					this.scrollLeft = 0
+				})
+			},
+			rightTo() {
+				this.scrollLeft = this.old.scrollLeft
+				let Width = uni.upx2px(540);
+				let cWidth = uni.upx2px(172);
+				if (this.brands.length > 3) {
+					this.scrollLeft = this.scrollLeft + cWidth
+				}
+			},
+			open(options) {
+				this.surface_color_series_id = 0 //选择的色系编号,没有的话就不传或者为0
+				this.surface_color_id = 0 //选择的颜色编号,没有的话就不传或者为0
+				this.surface_color_id_text = null //选择的颜色名称
+				this.category = 0 // 0:定制壳 1:自带壳
+				if (options.isShowCustomize) {
+					this.isShowCustomize = options.isShowCustomize
+				}else{
+					this.isShowCustomize = false
+				}
+				//获取导航条高度
+				let sys = this.$base.appInformation ? this.$base.appInformation : wx.getSystemInfoSync(); // 自定义页头适配
+				let navBarHeight = sys.screenHeight - sys.windowHeight - sys.statusBarHeight;
+				this.titleHeight = sys.statusBarHeight + 46
+				//获取屏幕宽高
+				let that = this
+				uni.getSystemInfo({
+					success: function(res) {
+						that.MobilePhoneHeight = res.windowHeight - that.titleHeight // 屏幕高度
+						that.pixelRate = res.windowWidth / 750;
+					},
+				})
+				if (options.switchBrandState == 0) { //0正常 1跳过选择手机型号 2定制页选择材质
+					this.$nextTick(() => {
+						this.$refs['brandscenter'].open()
+					})
+				}
+				if (options.machine_id != 'null') {
+					this.machine_id = options.machine_id;
+					this.key = options.key;
+					this.goods_id = options.goods_id;
+					this.sn = options.sn;
+					this.switchBrandState = options.switchBrandState
+				}
+				if (options.switchBrandState == 0) { //0正常 1跳过选择手机型号 2定制页选择材质
+					this.Customize_now() // 查询手机壳品牌
+				}
+				this.machineGetBaseSetting(options) // 获取设备是否开启支付、是否开放材质的接口
+			},
+			customDhell() { // 定制壳
+				this.category = 0
+			},
+			selfContainedShell() { // 自带壳
+				this.category = 1
+			},
+			colorCose() {
+				this.chartDataState = false
+				this.$refs['colorcenter'].close() //关闭颜色
+			},
+			imageTo(e) {
+				this.surface_color_series_id = 0 //选择的色系编号,没有的话就不传或者为0
+				this.surface_color_id = 0
+				let touchMoveX = e.touches[0].clientX;
+				let touchMoveY = e.touches[0].clientY - (250 * this.pixelRate + this.titleHeight);
+				let support
+				if ((touchMoveX > 165 && touchMoveX < 210) && (touchMoveY > 0 && touchMoveY < 140)) {
+					this.surface_color_series_id_text = '黑色色系'
+					this.surface_color_series_id = 1
+					support = this.ColorSeriesData.filter(function(item) {
+						return item.id == 1
+					})[0].support
+				} else if ((touchMoveX > 210 && touchMoveX < 375) && (touchMoveY > 0 && touchMoveY < 150)) { //白色
+					this.surface_color_series_id_text = '白色色系'
+					this.surface_color_series_id = 2
+					support = this.ColorSeriesData.filter(function(item) {
+						return item.id == 2
+					})[0].support
+				} else if ((touchMoveX > 170 && touchMoveX < 375) && (touchMoveY > 150 && touchMoveY < 312)) { //浅色
+					this.surface_color_series_id_text = '浅色色系'
+					this.surface_color_series_id = 4
+					support = this.ColorSeriesData.filter(function(item) {
+						return item.id == 4
+					})[0].support
+				} else if ((touchMoveX > 0 && touchMoveX < 165) && (touchMoveY > 0 && touchMoveY < 312)) { //深色
+					this.surface_color_series_id_text = '深色色系'
+					this.surface_color_series_id = 3
+					support = this.ColorSeriesData.filter(function(item) {
+						return item.id == 3
+					})[0].support
+				}
+				if (support.value == 1) {
+					this.getColorBySeries()
+				} else {
+					// uni.showToast({
+					// 	title: '不支持色系!',
+					// 	icon: 'none'
+					// });
+				}
+			},
+			getColorBySeries() {
+				this.$nextTick(() => {
+					this.$refs['colorcenter'].open()
+				})
+				// 获取主题下颜色
+				homeservice.userphoneappletsIndex({
+					s: 'Surface.getColorBySeries',
+					color_series_id: this.surface_color_series_id
+				}).then(result => {
+					this.chartData.series = []
+					result.forEach(item => {
+						this.chartData.series.push({
+							name: item.name,
+							data: 1,
+							color: item.color_code,
+							id: item.id,
+						})
+					})
+					this.chartDataState = true
+					this.cWidth = uni.upx2px(690);
+					this.cHeight = uni.upx2px(500);
+					this.showPie("canvasPie", this.chartData);
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.stopPullDownRefresh();
+					// uni.showToast({
+					// 	title: err.msg || err.data,
+					// 	icon: 'none'
+					// });
+				});
+			},
+			showPie(canvasId, chartData) {
+				_self = this;
+				canvaPie = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'pie',
+					fontSize: 11,
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					legend: {
+						"show": false,
+					}, //图例设置,是否显示图表下方各类别的标识
+					dataLabel: false, //是否在图表中显示数据标签内容值
+					dataPointShape: false, //是否在图表中显示数据点图形标识
+					extra: {
+						pie: {
+							lableWidth: 15
+						}
+					},
+				});
+			},
+			touchStart(e) {
+				_self = this;
+				_self.surface_color_id = 0
+				_self.surface_color_id_text = null
+				canvaPie.showToolTip(e, {
+					format: function(item) {
+						_self.surface_color_id = item.id
+						_self.surface_color_id_text = item.color
+						return item.name
+					}
+				})
+			},
+			well() {
+				var loading = false
+				if (loading) return;
+				if (this.surface_color_id == 0) { //自带
+					uni.showToast({
+						title: '请选择自带的手机壳颜色!',
+						icon: 'none'
+					});
+					return false;
+				}
+				loading = true
+				if (loading) {
+					this.chartDataState = false
+					this.$refs['colorcenter'].close()
+					this.determine(1)
+				}
+			},
+			loadbgImage(e) { //获取图片真实
+				var width = e.detail.width * this.pixelRate; //获取图片真实
+				var height = e.detail.height * this.pixelRate; //获取图片真实高度
+			},
+			ordersize(surface_id) {
+				if (this.key == 2) {
+					uni.navigateTo({
+						url: '../mine/goodsordersize?surface_id=' + surface_id
+					})
+				} else {
+					uni.navigateTo({
+						url: '../mine/goodsordersize?goods_id=' + surface_id
+					})
+				}
+			},
+			typeShow() {
+				this.$refs.mpvuePicker.show();
+			},
+			onConfirm(e) { //自带材质
+				this.texture.materialScience = e.label
+				this.texture.materialScienceId = e.value[0]
+				this.texture.price = this.pickerValueArray.filter(function(item) {
+					return item.value == e.value[0]
+				})[0].price
+			},
+			onChange(e) { //自带材质
+				this.texture.materialScience = e.label
+				this.texture.materialScienceId = e.value[0]
+				this.texture.price = this.pickerValueArray.filter(function(item) {
+					return item.value == e.value[0]
+				})[0].price
+			},
+			onCancel(e) { //自带材质
+				// console.log(e)
+			},
+			determine(e) {
+				if (this.key == 2) { //单机版
+					var loading = false
+					if (loading) return;
+					if (this.brandsitem == null && e == 2) { //定制
+						uni.showToast({
+							title: '请选择手机壳材质!',
+							icon: 'none'
+						});
+						return false;
+					}
+					if (this.texture.materialScienceId == null && e == 1) { //自带
+						uni.showToast({
+							title: '请选择手机壳材质!',
+							icon: 'none'
+						});
+						return false;
+					}
+					if (this.surface_color_id == 0 && e == 1) { //自带
+						uni.showToast({
+							title: '请选择手机壳颜色!',
+							icon: 'none'
+						});
+						return false;
+					}
+					loading = true
+					if (loading) {
+						if (e == 2) {
+							this.surface_id = this.brandsitem.id
+							this.surface_color = this.brandsitem.color
+							this.surfaceName = this.brandsitem.name
+							this.surface_color_series_id = 0
+							this.surface_color_id = 0
+							this.surface_color_series_id_text = null
+							this.surface_color_id_text = null
+						} else if (e == 1) {
+							this.surface_id = this.texture.materialScienceId
+							this.surface_color = null
+							this.surfaceName = null
+						}
+						this.$emit('goodsbrands', {
+							sn: this.sn,
+							goods_id_e: this.goods_id_e, //手机壳信息
+							surface_type: e, //材质类型 0:默认 1:自带壳 2:定制壳
+							surface_id: this.surface_id, //材质对应的编号,没有的话就为0或者不传
+							surface_color: this.surface_color, //材质颜色
+							surfaceName: this.surfaceName, //材质名称
+							surface_color_series_id: this.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+							surface_color_id: this.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+							surface_color_series_id_text: this.surface_color_series_id_text, //选择的色系编号名称
+							surface_color_id_text: this.surface_color_id_text, //选择的颜色编号
+							switchBrandState: this.switchBrandState,
+						})
+						this.$refs['shellShow'].close() //关闭手机壳子弹框
+					}
+				} else {
+					var loading = false
+					if (loading) return;
+					if (this.brandsitem == null) { //定制
+						uni.showToast({
+							title: '请选择手机壳材质!',
+							icon: 'none'
+						});
+						return false;
+					}
+					loading = true
+					if (loading) {
+						this.$base.goodsOldId = this.$base.goodsTemporaryId //产品id
+						// 自助机获取商品和货道
+						homeservice.queryList({
+							s: 'Product.machineDetail', //新接口
+							machine_id: this.machine_id,
+							id: this.brandsitem.id //商品id
+						}).then(result => {
+							this.modeltext = this.brandsitem.name //机型名
+							this.goods_id = this.brandsitem.id //产品id
+							this.dict_id = result.dict_id //产品属性id
+							this.goods_id_e = {
+								brandtext: this.brandsitem.name, // 品牌名
+								modeltext: this.brandsitem.name, // 机型商品名
+								goods_id: this.brandsitem.id, // 产品id
+								dict_id: result.dict_id, // 产品属性
+							}
+							this.$emit('goodsbrands', {
+								sn: this.sn,
+								goods_id_e: this.goods_id_e,
+								surface_type: 0, //材质类型 0:默认 1:自带壳 2:定制壳
+								surface_id: 0, //材质对应的编号,没有的话就为0或者不传
+								surface_color: null, //材质颜色
+								surfaceName: null, //材质名称
+								surface_color_series_id: 0, //选择的色系编号,没有的话就不传或者为0
+								surface_color_id: 0, //选择的颜色编号,没有的话就不传或者为0
+								surface_color_series_id_text: null,
+								surface_color_id_text: 'none', //手机底色
+								switchBrandState: 0,
+							})
+							this.$refs['shellShow'].close() //关闭手机壳子弹框
+						}).catch(err => {
+							// uni.showToast({
+							// 	title: err.msg,
+							// 	icon: 'none'
+							// });
+						});
+					}
+				}
+			},
+			handleScroll(item, index) {
+				this.brandsitem = item;
+				this.currentId = index;
+				this.currentIndex = Math.max(0, index - 1);
+			},
+			cancelBrand() {
+				this.$refs['brandscenter'].close()
+			},
+			cancelModel() {
+				this.$refs['modelShow'].close()
+			},
+			shellModel() {
+				this.$refs['shellShow'].close() //关闭手机壳子弹框
+			},
+			shellTo() {
+				this.$refs['modelShow'].close() //关闭机型弹框
+				// this.baseSetting.choose_surface = 1// 是否开启材质选择 0:不开放 1:开放
+				// this.baseSetting.self_surface = 1// 是否开启自带材质 0:不开放 1:开放
+				if (this.baseSetting.choose_surface == 1) { //开启材质选择
+					homeservice.userphoneappletsIndex({ // 获取定制壳 
+						s: 'Surface.getSurfaceByGoods',
+						machine_id: this.machine_id,
+						goods_id: this.goods_id || 83
+					}).then(result => {
+						this.brands = []
+						this.brandsitem = null
+						if (result.length > 0) {
+							this.brands = result
+							this.brandsitem = result[0]
+						}
+
+						//判断只有一个自定壳材质 直接调转Diy 界面
+						if (this.brands.length == 1 && this.baseSetting.self_surface == 0) {
+							this.determine(2)
+						} else {
+							this.shellwo()
+						}
+
+						//this.shellwo()
+						uni.stopPullDownRefresh();
+					}).catch(err => {
+						uni.stopPullDownRefresh();
+						uni.showToast({
+							title: err.msg || err.data,
+							icon: 'none'
+						});
+					});
+				} else {
+					this.shellwo()
+				}
+				// this.baseSetting.choose_surface = 1// 是否开启材质选择 0:不开放 1:开放
+				// this.baseSetting.self_surface = 1// 是否开启自带材质 0:不开放 1:开放
+				if (this.baseSetting.self_surface == 1) { //开启自带材质
+					// 获取自带壳
+					homeservice.userphoneappletsIndex({
+						s: 'Surface.getAllByCategory',
+						category: 1, // 1:自带壳 2:定制壳
+					}).then(result => {
+						if (result.length > 0) {
+							this.pickerValueArray = []
+							result.forEach((item, index) => {
+								this.pickerValueArray.push({
+									label: item.name,
+									value: item.id,
+									name: item.name,
+									id: item.id,
+									preview: item.preview,
+									price: item.price
+								})
+							})
+							// 默认第一个
+							this.texture.materialScience = this.pickerValueArray[0].label
+							this.texture.materialScienceId = this.pickerValueArray[0].value
+							this.texture.price = this.pickerValueArray[0].price
+						}
+						uni.stopPullDownRefresh();
+					}).catch(err => {
+						uni.stopPullDownRefresh();
+						uni.showToast({
+							title: err.msg || err.data,
+							icon: 'none'
+						});
+					});
+					// 获取色彩主题的接口
+					homeservice.userphoneappletsIndex({
+						s: 'Surface.getAllColorSeries'
+					}).then(result => {
+						this.ColorSeriesData = result
+						uni.stopPullDownRefresh();
+					}).catch(err => {
+						uni.stopPullDownRefresh();
+						uni.showToast({
+							title: err.msg || err.data,
+							icon: 'none'
+						});
+					});
+					// 获取色系所有的颜色
+					homeservice.userphoneappletsIndex({
+						s: 'Surface.getAllColor'
+					}).then(result => {
+						this.backgroundColorData = result
+						uni.stopPullDownRefresh();
+					}).catch(err => {
+						uni.stopPullDownRefresh();
+						uni.showToast({
+							title: err.msg || err.data,
+							icon: 'none'
+						});
+					});
+				}
+			},
+			shellwo() {
+				this.choose_surfaceState = false //关闭材质选项框
+				this.self_surfaceState = false //关闭自带选项框
+				if (this.baseSetting.choose_surface == 1 && this.baseSetting.self_surface == 1) {
+					if (this.brands.length > 0) {
+						this.choose_surfaceState = true
+						this.self_surfaceState = true
+					} else {
+						this.choose_surfaceState = false
+						this.self_surfaceState = false
+						this.category = 1
+					}
+				} else if (this.baseSetting.choose_surface == 0 && this.baseSetting.self_surface == 1) {
+					this.choose_surfaceState = false
+					this.self_surfaceState = false
+					this.category = 1
+				} else if (this.baseSetting.choose_surface == 1 && this.baseSetting.self_surface == 0) {
+					if (this.brands.length <= 0) {
+						this.changeChannel()
+						return;
+					}
+				}
+				this.currentId = 0
+				this.currentIndex = 0
+				this.pickerValueDefault = [0]
+				this.$nextTick(() => {
+					this.$refs['shellShow'].open() //打开手机壳子弹框
+				})
+			},
+			machineGetBaseSetting(options) { // 获取设备是否开启支付、是否开放材质的接口
+				// homeservice.machineGetBaseSetting({
+				// 	s: 'Machine.getBaseSetting',
+				// 	machine_id: this.machine_id,
+				// }).then(result => {
+				 	this.baseSetting = options.baseSetting
+					console.log(this.baseSetting);
+					if (options.switchBrandState == 1 || options.switchBrandState == 2) { //1跳过选择手机型号 2定制页选择材质
+						this.goods_id_e = {
+							brandtext: this.$base.appInformation.brand, // 品牌名
+							modeltext: this.$base.appInformation.model, // 机型名
+							goods_id: options.goods_id, // 产品id
+							dict_id: options.dict_id, // 产品属性
+						}
+						this.modeltext = this.$base.appInformation.model //机型名
+						this.goods_id = options.goods_id //产品id
+						this.dict_id = options.dict_id //产品属性id
+						// 测试数据
+						// this.baseSetting.choose_surface = 1// 是否开启材质选择 0:不开放 1:开放
+						// this.baseSetting.self_surface = 1// 是否开启自带材质 0:不开放 1:开放
+						if (this.key == 2) { //单机版
+							if (this.baseSetting.choose_surface == 0 && this.baseSetting.self_surface == 0) {
+								this.changeChannel()
+							} else {
+								this.shellTo()
+							}
+						} else { //自助版
+							if (this.$base.goodsOldId) {
+								this.$base.goodsTemporaryId = this.$base.goodsOldId //更新产品id
+							}
+							this.shellSelfHelp()
+						}
+					}
+			},
+			brandclick(e) {
+				// 获取设备指定品牌下的在线商品
+				homeservice.queryList({
+					s: 'Product.getBrandProducts', //新接口
+					goods_brand_id: e.id, //品牌id
+					machine_id: this.machine_id,
+					key: this.key
+				}).then(result => {
+					this.brandtext = e.title // 品牌名
+					this.$base.appInformation.brand = e.title // 品牌名
+					this.sizelist = result // 品牌机型
+					this.$refs['brandscenter'].close()
+					this.$nextTick(() => {
+						this.$refs['modelShow'].open()
+					})
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+			modelclick(e) {
+				// 自助机获取商品和货道
+				homeservice.queryList({
+					s: 'Product.machineDetail', //新接口
+					machine_id: this.machine_id,
+					id: e.id //品牌id
+				}).then(result => {
+					this.goods_id_e = {
+						brandtext: e.name, // 品牌名
+						modeltext: e.name, // 机型商品名
+						goods_id: e.id, // 产品id
+						dict_id: result.dict_id, // 产品属性
+					}
+					this.modeltext = e.name //机型名
+					this.$base.appInformation.model = e.name //机型名
+					this.goods_id = e.id //产品id
+					this.$base.goodsTemporaryId = e.id //更新产品id
+					this.dict_id = result.dict_id //产品属性id
+					// this.baseSetting.choose_surface = 1// 是否开启材质选择 0:不开放 1:开放
+					// this.baseSetting.self_surface = 1// 是否开启自带材质 0:不开放 1:开放
+					//console.log(this.baseSetting+"this.key="+this.key)
+					if (this.key == 2) { //单机版
+						if (this.baseSetting.choose_surface == 0 && this.baseSetting.self_surface == 0) {
+							this.changeChannel()
+						} else {
+							this.shellTo()
+						}
+					} else { //自助版
+						this.shellSelfHelp()
+					}
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+			shellSelfHelp() {
+				this.$refs['modelShow'].close() //关闭机型弹框
+				// 自助机获取商品同型号下不同的材质
+				homeservice.userphoneappletsIndex({
+					s: 'Product.getSameModes', //新接口
+					machine_id: this.machine_id,
+					key: this.key,
+					goods_id: this.$base.goodsTemporaryId //商品id
+				}).then(result => {
+					this.brands = []
+					this.brandsitem = null
+					if (result.length > 0) {
+						result.forEach(item => {
+							item.preview = item.surface_pic
+							item.price = item.sales_price
+						})
+						this.brands = result
+						this.brandsitem = result[0]
+					}
+
+					//判断只有一个自定壳材质 直接调转Diy 界面
+					if (this.brands.length == 1 && this.baseSetting.self_surface == 0) {
+						this.determine(2)
+					} else {
+						this.shellSelfHelpwo()
+					}
+
+					//this.shellSelfHelpwo()
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.stopPullDownRefresh();
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+			shellSelfHelpwo() {
+				this.choose_surfaceState = false //关闭材质选项框
+				this.self_surfaceState = false //关闭自带选项框
+				// 默认
+				this.currentId = 0
+				this.currentIndex = 0
+				this.pickerValueDefault = [0]
+				this.$nextTick(() => {
+					this.$refs['shellShow'].open() //打开手机壳子弹框
+				})
+			},
+			change(e) {},
+			//获取设备在线商品的品牌
+			Customize_now() {
+				homeservice.queryList({
+					s: 'Product.getBrands', //新接口
+					machine_id: this.machine_id,
+					key: this.key
+				}).then(result => {
+					this.catrgoryList = result;
+					this.$base.productfind = result //缓存下来
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+				this.sizelist = []
+				this.brandtext = null
+				this.modeltext = null
+				this.goods_id = null
+				this.dict_id = null
+			},
+			cancel_center() {
+				this.modeltext = null
+				this.goods_id = null
+				this.dict_id = null
+				this.sizelist = []
+			},
+			changeChannel() {
+				var loading = false
+				if (loading) return;
+				// if (this.goods_id == null) {
+				// 	uni.showToast({title: '请选择手机壳型号!',icon: 'none'});
+				// 	return false;
+				// }
+				loading = true
+				if (loading) {
+					this.$refs['modelShow'].close()
+					// 有设备判断设备是否正常
+					if (this.machine_id != undefined && this.machine_id != null && this.machine_id != '') {
+						if (this.key == 2) {
+							this.goodsbrandTo()
+						} else {
+							// 锁定库存// s: 'Order.lockAttrStock',
+							homeservice.queryList({
+								s: 'Order.newLockAttrStock',
+								machine_id: this.machine_id, //设备id
+								goods_id: this.goods_id, //产品
+								dict_id: this.dict_id, //产品属性id
+								old_sn: this.sn
+							}).then(result => {
+								this.$base.lockInventory = result //锁库存储存信息
+								this.sn = result.sn
+								uni.setStorage({
+									key: 'setgood',
+									data: {
+										sn: this.sn,
+										brandtext: this.brandtext,
+										modeltext: this.modeltext,
+										goods_id: this.goods_id
+									},
+									success: function() {
+										// console.log('success');
+									}
+								});
+								this.goodsbrandTo()
+							}).catch(err => {
+								uni.showToast({
+									title: err.msg || err.data,
+									icon: 'none'
+								});
+							});
+						}
+					} else {
+						this.goodsbrandTo()
+					}
+				}
+			},
+			goodsbrandTo() {
+				this.$emit('goodsbrands', {
+					sn: this.sn,
+					goods_id_e: this.goods_id_e,
+					surface_type: 0, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: 0, //材质对应的编号,没有的话就为0或者不传
+					surface_color: null, //材质颜色
+					surfaceName: null, //材质名称
+					surface_color_series_id: 0, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: 0, //选择的颜色编号,没有的话就不传或者为0
+					surface_color_series_id_text: null,
+					surface_color_id_text: 'none', //手机底色
+					switchBrandState: 0,
+				})
+			},
+		},
+		onShow(options) {
+			
+		},
+	}
+</script>
+
+<style lang="scss">
+	.classification {
+		width: 300upx;
+		height: 80upx;
+		line-height: 80upx;
+		text-align: center;
+		background: #EEEEEE;
+		border-radius: 0 0 40upx 0;
+		font-size: 36upx;
+		color: #666666;
+
+		&.active {
+			background: #864BC3 !important;
+			color: #FFFFFF !important;
+		}
+	}
+
+	// 分类
+	.scroll-container {
+		box-sizing: border-box;
+		white-space: nowrap;
+		width: 540upx;
+		margin: auto;
+
+		.scroll-item {
+			width: 152upx;
+			height: 248upx;
+			background: #F5F5F5;
+			border-radius: 20upx;
+			text-align: center;
+			display: inline-block;
+			margin: 0 10upx;
+			border: 4upx solid #F5F5F5;
+
+			&.active {
+				background: #FFFFFF !important;
+				border: 4upx solid #864BC3;
+			}
+
+			//  &.active::before {
+			// 	content: '...';
+			// 	position: absolute;
+			// 	left: calc(50% - 10px);
+			// 	top: 100%;
+			// 	width: 20px;
+			// 	margin-left: 0px;
+			// 	margin-top: -5px;
+			// 	border-top: 4px dotted #595959;
+			// }
+		}
+	}
+
+	.experiencebutton {
+		width: 230upx;
+		height: 70upx;
+		line-height: 70upx;
+		text-align: center;
+		color: #FFFFFF;
+		margin: 40upx auto 0;
+		border-radius: 35upx;
+		background: linear-gradient(to right, #834DC4, #1983D7);
+		font-size: 26upx;
+	}
+
+	.canbutton {
+		color: #FFFFFF;
+		font-size: 26upx;
+		width: 218upx;
+		height: 58upx;
+		line-height: 58upx;
+		border: 1px transparent solid;
+		border-radius: 30px;
+		position: relative;
+		margin: auto;
+		background: #292933;
+		text-align: center;
+	}
+
+	.canbutton:after {
+		content: '';
+		position: absolute;
+		top: -3px;
+		bottom: -3px;
+		left: -3px;
+		right: -3px;
+		background: linear-gradient(to right, #834DC4, #1983D7);
+		border-radius: 30px;
+		content: '';
+		z-index: -1;
+	}
+
+	// 品牌
+	.brandactive {
+		background: #E4D0F6 !important;
+	}
+
+	.backgroundColoractive {
+		border: 2upx #834DC4 solid !important;
+	}
+
+	.tooltiptext {
+		visibility: hidden;
+		min-width: 120upx;
+		background-color: black;
+		color: #fff;
+		text-align: center;
+		border-radius: 6upx;
+		padding: 5upx 0;
+		font-size: 20upx;
+		/* 定位 */
+		position: fixed;
+		z-index: 1;
+	}
+
+	.tooltiptextactive {
+		visibility: visible;
+	}
+
+	// 型号
+	.model {
+		padding: 0upx 20upx;
+		height: 60upx;
+		line-height: 60upx;
+		background: #141319;
+		text-align: center;
+		color: #FFFFFF;
+		border-radius: 30upx;
+		margin-right: 20upx;
+		font-size: 28upx;
+	}
+
+	.modelactive {
+		color: #553177 !important;
+	}
+
+	.determineBut {
+		background: linear-gradient(92deg, #178CE6, #984ACE);
+		color: #FFFFFF;
+		position: fixed;
+		bottom: 110upx;
+		text-align: center;
+		left: 0;
+		right: 0;
+		width: 251upx;
+		height: 77upx;
+		line-height: 77upx;
+		border-radius: 38upx;
+		font-size: 31upx;
+		margin: auto;
+	}
+
+	.determineButtn {
+		width: 251upx;
+		margin: 34upx auto 0;
+		height: 77upx;
+		line-height: 77upx;
+		text-align: center;
+		background: linear-gradient(92deg, #178CE6, #984ACE);
+		opacity: 0.86;
+		border-radius: 38upx;
+		font-size: 31upx;
+		font-weight: 500;
+		color: #FFFFFF;
+	}
+</style>
diff --git a/pages/index/components/textsettings.vue b/pages/index/components/textsettings.vue
new file mode 100644
index 0000000..8f19292
--- /dev/null
+++ b/pages/index/components/textsettings.vue
@@ -0,0 +1,1033 @@
+<template>
+	<view>
+
+		<view style="position: fixed;width: 100%" :style="{bottom: inputBottom+'px'}">
+			<view v-if="show && text != 'typeface'"
+				style="width: 100%; height: 95upx; display: flex; flex-direction: row; ">
+				<view
+					style="width: 280upx; height: 100%; background: #292933; border-top-right-radius: 60upx;display: flex; flex-direction: row; ">
+					<image v-if="bg_text_color"
+						style="width: 47upx; height: 47upx; display: block;margin-top: 45upx; margin-left:45upx;"
+						src="../../../static/img/icon_qiehuan_on.png" mode="aspectFill" @click="bgtextcolor"></image>
+					<image v-else
+						style="width: 47upx; height: 47upx; display: block;margin-top: 45upx; margin-left:45upx;"
+						src="../../../static/img/icon_qiehuan.png" mode="aspectFill" @click="bgtextcolor"></image>
+					<view style="width: 80upx; margin-top: 50upx;margin-left: 50upx;" @click="typefaceshow('share')">
+						<text style="font-size: 34upx; color: #FFFFFF;">字体</text>
+					</view>
+				</view>
+			</view>
+
+			<view style="width: 100% ;background: #292933;">
+				<!-- 字体 -->
+				<view v-if="show && text != 'typeface'" style="display: flex;align-items: center; justify-items: center; border-bottom: 2upx solid #000000;
+			height: 98upx; ">
+					<view
+						style="width: 601upx; height: 57upx; background: rgb(255,255,255,0.1); margin: 21upx 41upx 21upx 21upx; border-radius: 10upx;">
+						<input :fixed="true" :auto-height="true" :show-confirm-bar="false" :cursor-spacing="73"
+							:adjust-position="false" type="text" maxlength="24" @input="textInput"
+							 @focus="focusTextarea" @blur="blurTextarea"
+							v-model="data.currentText" placeholder="请输入文字内容..."
+							style="font-size: 34upx; font-weight: 400; height: 57upx; line-height: 57upx; padding: 0upx 0 0upx 20upx; color: #FFFFFF;" />
+					</view>
+					<view style="width: 1px; height: 28upx; background: #FFFFFF;"></view>
+					<image style="width: 43upx; height: 30upx; display: block;margin: auto;"
+						src="../../../static/icon/icon_determine.png" mode="aspectFill" @click="cancel('share')">
+					</image>
+				</view>
+				<view v-if="text == 'typeface'" style="border-bottom: 2upx solid #000000;">
+					<scroll-view style="width: calc(100% - 40upx); margin: auto; height:598upx; overflow: hidden;"
+						scroll-y scroll-with-animation>
+						<view v-for="(item, index) in typefacedata"
+							:style="{'font-family':item.textlong == true ? item.key : item.key + 'ttf','color': data.itemList[data.cidx].font_dict_id == item.id ? '#F56364 !important' : 'none'}"
+							@click="typefaceClick(item, index)" :key="index"
+							style="font-size: 36upx; color: #FFFFFF; padding:22upx 0 21upx; text-align: center;">
+							<!-- 色彩公园 {{item.title}} color: item.textlong == true ? '#ffffff' : '#BEBEBE'-->
+							<text style="font-size: 20upx;">
+								<text style="font-size: 32upx;"
+									:style="{'color': data.itemList[data.cidx].font_dict_id == item.id ? '#F56364 !important' : '#ffffff'}">
+									色彩公园
+								</text>
+								<text v-if="item.remark != ''">
+									{{item.long == true ? '' : '(点击加载)'}}
+								</text>
+								<text v-if="item.remark != ''" style="color: #F56364;">
+									{{item.textlong == false ? '(下载失败,点击重新下载)' : ''}}
+								</text>
+							</text>
+						</view>
+					</scroll-view>
+				</view>
+
+				<view v-if="show && text != 'typeface'"
+					style="display: flex; height: 100upx; padding: 38upx 0 41upx; align-items: center;">
+					<!-- 颜色 开始-->
+					<scroll-view style="box-sizing: border-box; white-space: nowrap; 
+				  margin-left: 35upx; margin-right: 35upx;margin-bottom: 30upx; margin-top: 40upx; width: calc(100% - 70upx);"
+						scroll-x scroll-with-animation>
+						<view style="text-align: center; display: inline-block; padding-left: 20upx;"
+							v-for="(item,index) in colorList" :key="index" @click.stop="workcolor(item.color)">
+							<view v-if="data.itemList[data.cidx]">
+								<view v-if="data.itemList[data.cidx].font_color == item.color && !bg_text_color"
+									style="width: 68upx; height: 68upx; background: #000000; border: 4upx solid #854AC2; border-radius: 50%;"
+									:style="{background:item.color}"></view>
+								<view v-else-if="data.itemList[data.cidx].under_color == item.color && bg_text_color"
+									style="width: 68upx; height: 68upx; background: #000000; border: 4upx solid #854AC2; border-radius: 50%;"
+									:style="{background:item.color}"></view>
+								<view v-else
+									style="width: 68upx; height: 68upx; background: #000000; border: 4upx solid #ffffff; border-radius: 50%;"
+									:style="{background:item.color}"></view>
+							</view>
+							<view v-else
+								style="width: 68upx; height: 68upx; background: #000000; border: 4upx solid #ffffff; border-radius: 50%;"
+								:style="{background:item.color}"></view>
+						</view>
+					</scroll-view>
+					<!-- 颜色 结束-->
+					<!-- 背景 -->
+					<!-- <view style="width: calc(100% / 7);" @click="bgtextcolor">
+					<image style="width: 69upx; height: 69upx; display: block;margin: auto;" :src="bg_text_color ? '../../../static/icon/icon_qiehuan_one.png' : '../../../static/icon/icon_qiehuan.png'"
+					 mode="aspectFill"></image>
+				</view> -->
+					<!-- 颜色 -->
+					<!-- <view style="width: calc(100% / 7);" @click.stop="workcolor('#000000')">
+					<view v-if="data.itemList[data.cidx].font_color == '#000000' && !bg_text_color" style="width: 60upx; height: 60upx; background: #000000; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else-if="data.itemList[data.cidx].under_color == '#000000' && bg_text_color" style="width: 60upx; height: 60upx; background: #000000; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else style="width: 68upx; height: 68upx; background: #000000; border-radius: 50%;"></view>
+				</view>
+				<view style="width: calc(100% / 7);" @click.stop="workcolor('#FFFFFF')">
+					<view v-if="data.itemList[data.cidx].font_color == '#FFFFFF' && !bg_text_color" style="width: 60upx; height: 60upx; background: #FFFFFF; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else-if="data.itemList[data.cidx].under_color == '#FFFFFF' && bg_text_color" style="width: 60upx; height: 60upx; background: #FFFFFF; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else style="width: 68upx; height: 68upx; background: #FFFFFF; border-radius: 50%;"></view>
+				</view>
+				<view style="width: calc(100% / 7);" @click.stop="workcolor('#E60012')">
+					<view v-if="data.itemList[data.cidx].font_color == '#E60012' && !bg_text_color" style="width: 60upx; height: 60upx; background: #E60012; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else-if="data.itemList[data.cidx].under_color == '#E60012' && bg_text_color" style="width: 60upx; height: 60upx; background: #E60012; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else style="width: 68upx; height: 68upx; background: #E60012; border-radius: 50%;"></view>
+				</view>
+				<view style="width: calc(100% / 7);" @click.stop="workcolor('#060CDE')">
+					<view v-if="data.itemList[data.cidx].font_color == '#060CDE' && !bg_text_color" style="width: 60upx; height: 60upx; background: #060CDE; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else-if="data.itemList[data.cidx].under_color == '#060CDE' && bg_text_color" style="width: 60upx; height: 60upx; background: #060CDE; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else style="width: 68upx; height: 68upx; background: #060CDE; border-radius: 50%;"></view>
+				</view>
+				<view style="width: calc(100% / 7);" @click.stop="workcolor('#E65C00')">
+					<view v-if="data.itemList[data.cidx].font_color == '#E65C00' && !bg_text_color" style="width: 60upx; height: 60upx; background: #E65C00; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else-if="data.itemList[data.cidx].under_color == '#E65C00' && bg_text_color" style="width: 60upx; height: 60upx; background: #E65C00; border: 4upx solid #EF6262; border-radius: 50%;"></view>
+					<view v-else style="width: 68upx; height: 68upx; background: #E65C00; border-radius: 50%;"></view>
+				</view> -->
+					<!-- 加粗 -->
+					<!-- <view style="width: calc(100% / 7);" @click.stop='workweight'>
+					<view v-if="data.itemList[data.cidx].font_style != 'bold'" style="width: 68upx; height: 68upx; text-align: center; background: #282A32; border-radius: 5px;">
+						<text style="font-size: 34upx; font-weight: 800; color: #666666; line-height: 68upx;">B</text>
+					</view>
+					<view v-else style="width: 68upx; height: 68upx; text-align: center; background: #F56364;  border-radius: 5px;">
+						<text style="font-size: 34upx; font-weight: 800; color: #fff; line-height: 68upx;">B</text>
+					</view>
+				</view> -->
+					<!-- 字体 -->
+				</view>
+				<view v-if="!show" style="position: absolute; bottom: 100upx; width: 100%; background: #292933;">
+					<!-- 修改 -->
+					<view v-if="text == 'modify'" style="display: flex;align-items: center; justify-items: center; border-bottom: 1upx solid #000000;
+				height: 99upx;">
+						<view
+							style="width: 710upx; height: 57upx; background: rgb(255,255,255,0.1); margin: 20upx 40upx 20upx 20upx; border-radius: 10upx;">
+							<input :fixed="true" :auto-height="true" :show-confirm-bar="false" :cursor-spacing="73"
+								:adjust-position="false" type="text" maxlength="32" @input="textInput"
+								@focus="focusTextarea" @blur="blurTextarea" v-model="data.currentText"
+								placeholder="请输入文字内容..."
+								style="font-size: 34upx; font-weight: 400; height: 57upx; line-height: 57upx; padding: 0upx 0 0upx 20upx; color: #FFFFFF;" />
+						</view>
+					</view>
+					<!-- 字体 -->
+					<view v-if="text == 'typeface'" style="border-bottom: 1upx solid #000000;">
+						<scroll-view style="width: calc(100% - 40upx); margin: auto; height:300upx; overflow: hidden;"
+							scroll-y scroll-with-animation>
+							<view v-for="(item, index) in textlist"
+								:style="{'font-family': item.fontname,'color': data.itemList[data.cidx].font_family == item.fontname ? '#F56364' : 'none'}"
+								@click="typefaceClick(item,index)" :key="index"
+								style="font-size: 40upx; color: #FFFFFF; margin: 10upx;">
+								{{item.text}}
+								<text
+									style="font-size: 20upx; color: #F56364;">{{item.textlong ? '' : '(该字体加载失败)'}}</text>
+							</view>
+						</scroll-view>
+					</view>
+					<!-- 颜色 -->
+					<view v-if="text == 'color'"
+						style="display: flex; height: 68upx; padding: 38upx 0 41upx;border-bottom: 1upx solid #000000;">
+						<!-- 背景 -->
+						<view style="width: calc(100% / 7);" @click="bgtextcolor">
+							<image style="width: 69upx; height: 69upx; display: block;margin: auto;"
+								:src="bg_text_color ? '../../../static/icon/icon_qiehuan_one.png' : '../../../static/icon/icon_qiehuan.png'"
+								mode="aspectFill"></image>
+						</view>
+						<!-- 颜色 -->
+						<view style="width: calc(100% / 7);" @click.stop="workcolor('#000000')">
+							<view v-if="data.itemList[data.cidx].font_color == '#000000' && !bg_text_color"
+								style="width: 60upx; height: 60upx; background: #000000; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else-if="data.itemList[data.cidx].under_color == '#000000' && bg_text_color"
+								style="width: 60upx; height: 60upx; background: #000000; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else style="width: 68upx; height: 68upx; background: #000000; border-radius: 50%;">
+							</view>
+						</view>
+						<view style="width: calc(100% / 7);" @click.stop="workcolor('#FFFFFF')">
+							<view v-if="data.itemList[data.cidx].font_color == '#FFFFFF' && !bg_text_color"
+								style="width: 60upx; height: 60upx; background: #FFFFFF; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else-if="data.itemList[data.cidx].under_color == '#FFFFFF' && bg_text_color"
+								style="width: 60upx; height: 60upx; background: #FFFFFF; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else style="width: 68upx; height: 68upx; background: #FFFFFF; border-radius: 50%;">
+							</view>
+						</view>
+						<view style="width: calc(100% / 7);" @click.stop="workcolor('#E60012')">
+							<view v-if="data.itemList[data.cidx].font_color == '#E60012' && !bg_text_color"
+								style="width: 60upx; height: 60upx; background: #E60012; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else-if="data.itemList[data.cidx].under_color == '#E60012' && bg_text_color"
+								style="width: 60upx; height: 60upx; background: #E60012; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else style="width: 68upx; height: 68upx; background: #E60012; border-radius: 50%;">
+							</view>
+						</view>
+						<view style="width: calc(100% / 7);" @click.stop="workcolor('#060CDE')">
+							<view v-if="data.itemList[data.cidx].font_color == '#060CDE' && !bg_text_color"
+								style="width: 60upx; height: 60upx; background: #060CDE; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else-if="data.itemList[data.cidx].under_color == '#060CDE' && bg_text_color"
+								style="width: 60upx; height: 60upx; background: #060CDE; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else style="width: 68upx; height: 68upx; background: #060CDE; border-radius: 50%;">
+							</view>
+						</view>
+						<view style="width: calc(100% / 7);" @click.stop="workcolor('#E65C00')">
+							<view v-if="data.itemList[data.cidx].font_color == '#E65C00' && !bg_text_color"
+								style="width: 60upx; height: 60upx; background: #E65C00; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else-if="data.itemList[data.cidx].under_color == '#E65C00' && bg_text_color"
+								style="width: 60upx; height: 60upx; background: #E65C00; border: 4upx solid #EF6262; border-radius: 50%;">
+							</view>
+							<view v-else style="width: 68upx; height: 68upx; background: #E65C00; border-radius: 50%;">
+							</view>
+						</view>
+						<!-- 加粗 -->
+						<view style="width: calc(100% / 7);" @click.stop='workweight'>
+							<view v-if="data.itemList[data.cidx].font_style != 'bold'"
+								style="width: 68upx; height: 68upx; text-align: center; background: #282A32; border-radius: 5px;">
+								<text
+									style="font-size: 34upx; font-weight: 800; color: #666666; line-height: 68upx;">B</text>
+							</view>
+							<view v-else
+								style="width: 68upx; height: 68upx; text-align: center; background: #F56364;  border-radius: 5px;">
+								<text
+									style="font-size: 34upx; font-weight: 800; color: #fff; line-height: 68upx;">B</text>
+							</view>
+						</view>
+					</view>
+				</view>
+				<!-- 切换 -->
+				<view v-if="!show" class="tooltextone">
+					<view style="width: calc(100% - 125upx);display: flex; justify-content: center;">
+						<view class="tooltext_li" @click="modify('modify')">
+							<image style="width: 50upx; height: 50upx; display: block;margin: auto;"
+								src="../../../static/icon/diy_icon_editor_default.png" mode=""></image>
+							<view class="tooltext_li_text">修改</view>
+						</view>
+						<view class="tooltext_li" @click="color('color')">
+							<image style="width: 50upx; height: 50upx; display: block;margin: auto;"
+								src="../../../static/icon/replace.png" mode=""></image>
+							<view class="tooltext_li_text">颜色</view>
+						</view>
+						<view class="tooltext_li" @click="keyboard">
+							<image style="width: 50upx; height: 50upx; display: block;margin: auto;"
+								src="../../../static/icon/diy_icon_on_default.png" mode=""></image>
+							<view class="tooltext_li_text">键盘</view>
+						</view>
+					</view>
+					<view style="width: 125upx;" @click="cancel('share')">
+						<view style="display: flex; padding:36upx 0;">
+							<view style="width: 1px; height: 28upx; background: #FFFFFF;"></view>
+							<image style="width: 43upx; height: 30upx; display: block;margin: auto;"
+								src="../../../static/icon/icon_determine.png" mode="aspectFill"></image>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import loadFont from '@/util/loadFont.js'
+	import homeservice from '@/service/homeservice.js';
+
+	var app = getApp(); // 当前APP实例
+
+	export default {
+		props: {
+
+		},
+		components: {
+
+		},
+		data() {
+			return {
+				show: true,
+				data: null,
+				bg_text_color: null,
+				inputBottom: 0,
+				text: 'modify',
+				textlist: [{
+						text: '仓耳小丸子',
+						url: 'url("https://tprint.refinecolor.com/text/CangErXiaoWanZi.ttf")',
+						fontname: '仓耳小丸子',
+						lineheight: 1.26,
+						long: false,
+						textlong: null
+					},
+					{
+						text: '千图小兔体',
+						url: 'url("https://tprint.refinecolor.com/text/Qiantu_rabbit.ttf")',
+						fontname: '千图小兔体',
+						lineheight: 1.2,
+						long: false,
+						textlong: null
+					},
+					{
+						text: '站酷酷黑',
+						url: 'url("https://tprint.refinecolor.com/text/Stand_cool_black.ttf")',
+						fontname: '站酷酷黑',
+						lineheight: 1.14,
+						long: false,
+						textlong: null
+					},
+					{
+						text: '站酷快乐体',
+						url: 'url("https://tprint.refinecolor.com/text/Standing_cool_happy_body.ttf")',
+						fontname: '站酷快乐体',
+						lineheight: 1.14,
+						long: false,
+						textlong: null
+					},
+					{
+						text: '站酷庆科黄油体',
+						url: 'url("https://tprint.refinecolor.com/text/ZhankuQingkeButterBody.ttf")',
+						fontname: '站酷庆科黄油体',
+						lineheight: 1.18,
+						long: false,
+						textlong: null
+					},
+					{
+						text: '字体视界法棍体',
+						url: 'url("https://tprint.refinecolor.com/text/Font_horizon_method_stick_body.ttf")',
+						fontname: '字体视界法棍体',
+						lineheight: 1.14,
+						long: false,
+						textlong: null
+					},
+				],
+				typefacedata: null,
+				colorList: [{
+						color: '#000000',
+						index: '01'
+					},
+					{
+						color: '#FFFFFF',
+						index: '01'
+					},
+					{
+						color: '#7f2a3f',
+						index: '01'
+					}, {
+						color: '#e24187',
+						index: '03'
+					}, {
+						color: '#f5305d',
+						index: '04'
+					}, {
+						color: '#de4156',
+						index: '05'
+					}, {
+						color: '#fe42cd',
+						index: '06'
+					}, {
+						color: '#f48b9a',
+						index: '07'
+					}, {
+						color: '#ec8191',
+						index: '08'
+					}, {
+						color: '#f9aeb5',
+						index: '09'
+					}, {
+						color: '#f21d5f',
+						index: '10'
+					}, {
+						color: '#cc3739',
+						index: '11'
+					}, {
+						color: '#dd5047',
+						index: '12'
+					}, {
+						color: '#e24187',
+						index: '13'
+					}, {
+						color: '#fa6449',
+						index: '14'
+					}, {
+						color: '#e8495b',
+						index: '15'
+					}, {
+						color: '#fb7162',
+						index: '16'
+					}, {
+						color: '#f6afd1',
+						index: '17'
+					}, {
+						color: '#fbb6b9',
+						index: '18'
+					}, {
+						color: '#db6f27',
+						index: '21'
+					}, {
+						color: '#ed702e',
+						index: '22'
+					}, {
+						color: '#f99627',
+						index: '23'
+					}, {
+						color: '#eb8926',
+						index: '24'
+					}, {
+						color: '#edc3aa',
+						index: '25'
+					}, {
+						color: '#e1d8cf',
+						index: '26'
+					}, {
+						color: '#deebc5',
+						index: '27'
+					}, {
+						color: '#fccdc7',
+						index: '28'
+					}, {
+						color: '#dbbdd2',
+						index: '29'
+					}, {
+						color: '#e8a321',
+						index: '31'
+					}, {
+						color: '#db6f27',
+						index: '32'
+					}, {
+						color: '#edb74b',
+						index: '33'
+					}, {
+						color: '#e8b741',
+						index: '34'
+					}, {
+						color: '#fef052',
+						index: '35'
+					}, {
+						color: '#ffd684',
+						index: '36'
+					}, {
+						color: '#e2d958',
+						index: '37'
+					}, {
+						color: '#e2e5d0',
+						index: '38'
+					}, {
+						color: '#ba9431',
+						index: '41'
+					}, {
+						color: '#797f5d',
+						index: '42'
+					}, {
+						color: '#536d50',
+						index: '43'
+					}, {
+						color: '#d8b53f',
+						index: '44'
+					}, {
+						color: '#d4c172',
+						index: '45'
+					}, {
+						color: '#32b75c',
+						index: '46'
+					}, {
+						color: '#90D15B',
+						index: '47'
+					}, {
+						color: '#c5d52a',
+						index: '48'
+					}, {
+						color: '#e8e098',
+						index: '49'
+					}, {
+						color: '#1b6661',
+						index: '50'
+					}, {
+						color: '#3b4f4d',
+						index: '51'
+					}, {
+						color: '#336559',
+						index: '52'
+					}, {
+						color: '#01776e',
+						index: '53'
+					}, {
+						color: '#2e7662',
+						index: '54'
+					}, {
+						color: '#439877',
+						index: '55'
+					}, {
+						color: '#0ba066',
+						index: '56'
+					}, {
+						color: '#318488',
+						index: '57'
+					}, {
+						color: '#6fd3c9',
+						index: '58'
+					}, {
+						color: '#b9d3ac',
+						index: '59'
+					}, {
+						color: '#0e898e',
+						index: '61'
+					}, {
+						color: '#317194',
+						index: '62'
+					}, {
+						color: '#029bc7',
+						index: '63'
+					}, {
+						color: '#2a8ec9',
+						index: '64'
+					}, {
+						color: '#57c9d3',
+						index: '65'
+					}, {
+						color: '#65b3df',
+						index: '67'
+					}, {
+						color: '#8bd0d7',
+						index: '68'
+					}, {
+						color: '#4B4881',
+						index: '69'
+					}, {
+						color: '#77A1CB',
+						index: '70'
+					}, {
+						color: '#3051BB',
+						index: '71'
+					}, {
+						color: '#2E41A7',
+						index: '72'
+					}, {
+						color: '#704CAE',
+						index: '73'
+					}, {
+						color: '#385BD1',
+						index: '74'
+					}, {
+						color: '#E0DFED',
+						index: '75'
+					}, {
+						color: '#A6BDE9',
+						index: '76'
+					}, {
+						color: '#B3B9DD',
+						index: '77'
+					}, {
+						color: '#7942A8',
+						index: '81'
+					}, {
+						color: '#8F52BA',
+						index: '82'
+					}, {
+						color: '#9680C0',
+						index: '83'
+					}, {
+						color: '#CD82BB',
+						index: '84'
+					}, {
+						color: '#8E2A80',
+						index: '85'
+					}, {
+						color: '#E24CB0',
+						index: '86'
+					}, {
+						color: '#CC2A75',
+						index: '87'
+					}, {
+						color: '#ED89D2',
+						index: '88'
+					}, {
+						color: '#F562B6',
+						index: '89'
+					}, {
+						color: '#8B3B32',
+						index: '91'
+					}, {
+						color: '#593A35',
+						index: '92'
+					}, {
+						color: '#7A3C2D',
+						index: '93'
+					}, {
+						color: '#7D2E21',
+						index: '94'
+					}, {
+						color: '#935A47',
+						index: '95'
+					}, {
+						color: '#A05047',
+						index: '96'
+					}, {
+						color: '#E39476',
+						index: '97'
+					}, {
+						color: '#4E3F3C',
+						index: '98'
+					}, {
+						color: '#5A4939',
+						index: '99'
+					}, {
+						color: '#EDE8EC',
+						index: '100'
+					}, {
+						color: '#C0813A',
+						index: '101'
+					}, {
+						color: '#77432E',
+						index: '102'
+					}, {
+						color: '#C17748',
+						index: '103'
+					}, {
+						color: '#C7AC39',
+						index: '104'
+					}, {
+						color: '#DBA179',
+						index: '107'
+					}, {
+						color: '#D8D3D0',
+						index: '109'
+					}, {
+						color: '#091A22',
+						index: '120'
+					}, {
+						color: '#CA3A32',
+						index: '121'
+					}, {
+						color: '#FAAB60',
+						index: '122'
+					}, {
+						color: '#CADEAD',
+						index: '123'
+					}, {
+						color: '#C7D858',
+						index: '124'
+					}, {
+						color: '#F264D0',
+						index: '125'
+					}, {
+						color: '#F77ADC',
+						index: '126'
+					}, {
+						color: '#FAE7D9',
+						index: '131'
+					}, {
+						color: '#E6D9D1',
+						index: '132'
+					}, {
+						color: '#EBCDB1',
+						index: '133'
+					}, {
+						color: '#E2DCCC',
+						index: '134'
+					}, {
+						color: '#FAD9D2',
+						index: '135'
+					}, {
+						color: '#E1C2BD',
+						index: '136'
+					}, {
+						color: '#E5BBCF',
+						index: '137'
+					}, {
+						color: '#F7BACC',
+						index: '138'
+					}, {
+						color: '#E9CBC1',
+						index: '139'
+					}, {
+						color: '#EBB89F',
+						index: '140'
+					}, {
+						color: '#E6D09E',
+						index: '141'
+					}, {
+						color: '#E2B78D',
+						index: '142'
+					}, {
+						color: '#D1E4EB',
+						index: '143'
+					}, {
+						color: '#B9D9EE',
+						index: '144'
+					}, {
+						color: '#CFD0E2',
+						index: '145'
+					}, {
+						color: '#CECFF0',
+						index: '146'
+					}, {
+						color: '#D6C3E3',
+						index: '147'
+					}, {
+						color: '#E3F0C5',
+						index: '163'
+					}, {
+						color: '#DAD792',
+						index: '164'
+					}, {
+						color: '#D4D4BC',
+						index: '166'
+					}, {
+						color: '#C0D0AB',
+						index: '167'
+					}, {
+						color: '#D7C6A8',
+						index: '169'
+					}, {
+						color: '#D9E9E8',
+						index: '171'
+					}, {
+						color: '#B4E0C7',
+						index: '172'
+					}, {
+						color: '#D6E2BA',
+						index: '173'
+					}, {
+						color: '#E3E5D0',
+						index: '174'
+					}, {
+						color: '#C1D39A',
+						index: '175'
+					}, {
+						color: '#AFE4E6',
+						index: '178'
+					}, {
+						color: '#92DDE2',
+						index: '179'
+					}, {
+						color: '#DBE0E6',
+						index: '182'
+					}, {
+						color: '#8FBFF0',
+						index: '183'
+					}, {
+						color: '#9DCDE1',
+						index: '185'
+					}, {
+						color: '#BBC4BF',
+						index: '196'
+					}, {
+						color: '#E484A9',
+						index: '198'
+					}, {
+						color: '#BBC4BF',
+						index: 'GG3'
+					}, {
+						color: '#494A4C',
+						index: 'CG9'
+					}, {
+						color: '#C2CEDA',
+						index: 'BG1'
+					}, {
+						color: '#C1C3D3',
+						index: 'BG3'
+					}, {
+						color: '#8696A3',
+						index: 'BG5'
+					}, {
+						color: '#646A76',
+						index: 'BG7'
+					}, {
+						color: '#415361',
+						index: 'BG9'
+					}, {
+						color: '#DFDEE3',
+						index: 'WG.5'
+					}, {
+						color: '#CBC6CC',
+						index: 'WG1'
+					}, {
+						color: '#B6B0B2',
+						index: 'WG2'
+					}, {
+						color: '#C5BBBA',
+						index: 'WG3'
+					}, {
+						color: '#958A92',
+						index: 'WG4'
+					}, {
+						color: '#837477',
+						index: 'WG5'
+					}, {
+						color: '#8A7E7E',
+						index: 'WG6'
+					}, {
+						color: '#4D4342',
+						index: 'WG9'
+					}
+				],
+			};
+		},
+		onShow() {
+
+		},
+		onLoad() {
+
+		},
+		mounted() {
+
+		},
+		/**
+		 * 组件的公有方法列表
+		 */
+		methods: {
+
+			//过滤字符串
+			filterTextInput(textStr) {
+				let content = textStr.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.\,\?\<\>\。\,\-\——\=\;\@\!\!\+\$\%\*\(\)\#\&\*]/g, '');
+				let that = this;
+				setTimeout(function() {
+					that.data.currentText = content;
+					that.$emit('textInput', content)
+				}, 0);
+			},
+
+			typefaceshow(e) {
+				this.$emit('typefaceshow', e)
+			},
+
+			keyboard(e) {
+				this.inputBottom = 0
+			},
+
+			typeface(e) {
+				this.text = e
+				this.inputBottom = 0
+			},
+			
+			typefaceClick(e, index) {
+				if ((index + 1) == this.typefacedata.length) {
+					if (e.textlong == true) {
+						this.$emit('typefaceClick', e)
+					} else {
+						if (e.remark != '') {
+							this.loadFont(e)
+						} else {
+							this.$emit('typefaceClick', e)
+						}
+					}
+				} else {
+					this.$emit('typefaceClick', e)
+				}
+				// if(e.textlong == true){
+				// 	this.$emit('typefaceClick', e)
+				// }else{
+				// 	if(e.remark != ''){
+				// 		this.loadFont(e)
+				// 	}else{
+				// 		this.$emit('typefaceClick', e)
+				// 	 }
+				//}
+			},
+			loadFont(textlist) {
+				let that = this;
+				uni.showLoading({
+					title: '字体下载中...',
+					mask: true,
+				});
+				wx.loadFontFace({
+					global: true,
+					family: textlist.key,
+					source: 'url(' + textlist.remark + ')',
+					desc: {
+						weight: 100
+					},
+					success: function(message) {
+						textlist.textlong = true
+					},
+					fail: function(message) {
+						textlist.textlong = false
+					},
+					complete(res) {
+						uni.hideLoading();
+						//wx.showToast({title: '字体下载完成',icon: 'success',duration: 2000});
+						textlist.long = true
+						that.setData({
+							typefacedata: that.typefacedata
+						});
+						that.$emit('typefaceClick', textlist)
+					}
+				})
+			},
+			setData(obj) {
+				let that = this;
+				let keys = [];
+				let val, data;
+				Object.keys(obj).forEach(function(key) {
+					keys = key.split('.');
+					val = obj[key];
+					data = that.$data;
+					keys.forEach(function(key2, index) {
+						if (index + 1 == keys.length) {
+							that.$set(data, key2, val);
+						} else {
+							if (!data[key2]) {
+								that.$set(data, key2, {});
+							}
+						}
+						data = data[key2];
+					})
+				});
+			},
+			color(e) {
+				this.text = e
+				this.inputBottom = 0
+			},
+			modify(e) {
+				this.text = e
+				this.inputBottom = 0
+			},
+			focusTextarea(e) {
+				this.inputBottom = e.detail.height;
+			},
+			blurTextarea(e) {
+				this.inputBottom = 0;
+			},
+			textInput(e) {
+				this.filterTextInput(e.detail.value);
+				//let content = this.data.currentText.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.\,\?\<\>\。\,\-\——\=\;\@\!\!\+\$\%\*\(\)\#\&\*]/g, '');
+				//this.$emit('textInput', content)
+			},
+			cancel(e) {
+				this.$emit('cancel', e)
+			},
+			workcolor(e) {
+				this.$emit('workcolor', e)
+			},
+			workweight(e) {
+				this.$emit('workweight', e)
+			},
+			bgtextcolor(e) {
+				this.$emit('bgtextcolor', e)
+			},
+			open(data) {
+				this.data = data.data
+				this.bg_text_color = data.bg_text_color
+				this.text = data.text
+				if (this.text == 'typeface') {
+					this.typeface('typeface')
+					this.inputBottom = 'none'
+				}
+				if (this.$base.typefacedata.length > 0) {
+					this.typefacedata = this.$base.typefacedata
+					//console.log(this.$base.typefacedata)
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tooltextone {
+		position: absolute;
+		bottom: 0;
+		z-index: 1000;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		height: 100upx;
+		background: #292933;
+
+		.tooltext_li {
+			width: 25%;
+
+			.tooltext_li_top {
+				border-radius: 50%;
+				text-align: center;
+				width: 41upx;
+				height: 41upx;
+				border: 1upx solid #FFFFFF;
+				display: block;
+				padding: 2upx;
+				margin: 2upx auto;
+
+				.tooltext_li_top_icon {
+					color: #FFFFFF;
+					font-size: 26upx;
+					line-height: 41upx;
+					text-align: center;
+				}
+			}
+
+			.tooltext_li_text {
+				text-align: center;
+				color: #FFFFFF;
+				font-size: 22upx;
+			}
+		}
+	}
+
+	@font-face {
+		font-family: 'Stand_cool_blackttf';
+		src: url('data:font/truetype;charset=utf-8;base64,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') format('truetype');
+		font-weight: normal;
+		font-style: normal;
+		font-display: swap;
+	}
+
+	@font-face {
+		font-family: 'CangErXiaoWanZittf';
+		src: url('data:font/truetype;charset=utf-8;base64,AAEAAAAOAIAAAwBgRkZUTYxgdxUAAAyYAAAAHEdERUYAKQANAAAMeAAAAB5PUy8ypWh5tAAAAWgAAABgY21hcAIIjDUAAAHgAAABWmN2dCAAIQJ5AAADPAAAAARnYXNw//8AAwAADHAAAAAIZ2x5Znpt8q4AAANQAAACPGhlYWQZqZPqAAAA7AAAADZoaGVhB4cC4AAAASQAAAAkaG10eAxuALkAAAHIAAAAFmxvY2EBcAICAAADQAAAABBtYXhwAA8AYQAAAUgAAAAgbmFtZXh/J3gAAAWMAAAGlHBvc3T3xaShAAAMIAAAAFAAAQAAAAEAALFcJkBfDzz1AAsD6AAAAADa24hUAAAAANvgx7gAIf+pA60DUAAAAAgAAgAAAAAAAAABAAAD2P7zAAAD6AAAAAADrQABAAAAAAAAAAAAAAAAAAAABAABAAAABwAxAAcAAAAAAAIAAAAAAAAAAAAAAC4AAAAAAAQD6AGQAAUAAAKKAlgAAABLAooCWAAAAV4AMgFBAAACAgQAAAAAAAAAgAAAAxAAAAAAAAASAAAAAFRTQU4AQFFsgnIDcP+IAAAD2AENAAQAAQAAAAACFwLJAAAAIAABA+gAIQAAAAAD6AAAA+gARwBgAFEAVgAAAAAAAwAAAAMAAAAcAAEAAAAAAFQAAwABAAAAHAAEADgAAAAKAAgAAgACUWxW7V9pgnL//wAAUWxW7V9pgnL//66XqRegnH2UAAEAAAAAAAAAAAAAAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACECeQAAACoAKgAqAF4AkADoAR4AAgAhAAABKgKaAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCxAwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIREnMxEjIQEJ6MfHApr9ZiECWAAAAwBH/6kDrQNDAAMAEQAYAAATJxMXARMHJwUnNzYTFwIHJScDFhcGByYDm1TNXAEthVgo/dsHJGNoqmNrAUAsJ7HOLz+yeQFwKgGoIP3H/uwsYTVdA9MBPSr+/9gYawJ+4HVGJJgBHQAEAGD/7gOKAwgAAwASABYAGgAAASE1IQUjNSEVIxUzNxUhESMDIwEhESEXIREhAkr+tAFM/rNTAf1lMFL+8yI0mgIM/coCNrf81gMqAkM/v0BA8lR3ARX+2wIj/XxPAxoAAAAABwBR/7wDoAM/AAMADAAQABQAKAAsADAAAAETFwsBFwcnNwcnNxcnFwcnNyclFwMXBycVIxEHJxMjNTM1MxUzFSMVBScTFxMBJwEB9XaigulvSGkGUSRHM6tMSj0DNAEjUySWPW5yfUekrs5yo6MBBT/WSin+8TkBAwGyASMy/tABGRvRJBQVjBN8QYIhiBmElnz+QY4+evYBAcIwAQQ/Pz8/QBIvATQn/u/+xzgBLwAEAFb/zQONA1AAAwAHAAsAHAAAAQcFNxcjFTMhMzUjARUhESclFwchNxcHMxEhESEBNHoBL3Mmnp7+om9vAmn83RQA/zscASUnPqbP/f0BwgLMcwF0sbCw/mKwAnUd8S0aJzmf/tb+yQAAAAAAABwBVgABAAAAAAAAACQAVAABAAAAAAABAAkAjwABAAAAAAACAAcAqQABAAAAAAADAB0A7QABAAAAAAAEAAkBIQABAAAAAAAFADsBowABAAAAAAAGAAoB9QABAAAAAAAHAEsCmAABAAAAAAAIABQDFgABAAAAAAAJABQDXQABAAAAAAAKABwDrAABAAAAAAALABYD9wABAAAAAAAMABYEPAABAAAAAAANAEQE+QADAAEECQAAAFIAAAADAAEECQABABQAeQADAAEECQACAA4AmQADAAEECQADADoAsQADAAEECQAEABQBCwADAAEECQAFAHYBKwADAAEECQAGABQB3wADAAEECQAHAJYCAAADAAEECQAIADAC5AADAAEECQAJADADKwADAAEECQAKADgDcgADAAEECQALACwDyQADAAEECQAMACwEDgADAAEECQANAKQEUwCpAFMAFwBOAKwATgDTAIAAMwBlAIcAWwBXAGIAgABnAC8AZwAJAJYAUABRAGwAUwD4ADAAAgBPAN0AdQBZAGIAQABnAAkAZwBDAFIAKQAwAAIAAKlTF07CTu4zZVtXYmcvZwlQUWxTvzACT3VZYkBnCWdDUikwAgAATgDTAIAAMwBcAA8ATgA4AFsAUAAATu4zXA9OOFtQAABSAGUAZwB1AGwAYQByAABSZWd1bGFyAAAxAC4AMAAwADAAOwBUAFMAQQBOADsAVABzAGEAbgBnAGUAcgBYAFcAWgA7AFQAUwBBAE4ARwBFAFIAADEuMDAwO1RTQU47VHNhbmdlclhXWjtUU0FOR0VSAABOANMAgAAzAFwADwBOADgAWwBQAABO7jNcD044W1AAAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAwADAAOwBQAFMAIAAxAC4AMAAwADEAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA4ADgAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA2ADQANwA4ADAAMAAAVmVyc2lvbiAxLjAwMDtQUyAxLjAwMTtob3Rjb252IDEuMC44ODttYWtlb3RmLmxpYjIuNS42NDc4MDAAAFQAcwBhAG4AZwBlAHIAWABXAFoAAFRzYW5nZXJYV1oAAFQAcwBhAG4AZwBlAHIAWABXAFoAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABCAGUAaQBqAGkAbgBnACAAVABzAGEAbgBnAGUAcgAgAEMAaABhAHIAYQBjAHQAZQByACAAVABlAGMAaABuAG8AbABvAGcAeQAgAEMAbwAuACwAIABMAHQAZAAuAABUc2FuZ2VyWFdaIGlzIGEgdHJhZGVtYXJrIG9mIEJlaWppbmcgVHNhbmdlciBDaGFyYWN0ZXIgVGVjaG5vbG9neSBDby4sIEx0ZC4AAFMAFwBOAKwATgDTAIAAMwBlAIcAWwBXAGIAgABnAC8AZwAJAJYAUABRAGwAUwD4AABTF07CTu4zZVtXYmcvZwlQUWxTvwAAUwAXAE4ArABOANMAgAAzAGUAhwBbAFcAYgCAAGcALwBnAAkAlgBQAFEAbABTAPgAAFMXTsJO7jNlW1diZy9nCVBRbFO/AABDAGgAaQBuAGUAcwBlACAAZgBvAG4AdAAgAGYAbwByACAAYQBuAHkAIABzAHkAcwB0AGUAbQAuAABDaGluZXNlIGZvbnQgZm9yIGFueSBzeXN0ZW0uAAByAG8AZABnAGUAcgAuAGwAaQB1AEAAbwB1AHQAbABvAG8AawAuAGMAbwBtAAByb2RnZXIubGl1QG91dGxvb2suY29tAAByAG8AZABnAGUAcgAuAGwAaQB1AEAAbwB1AHQAbABvAG8AawAuAGMAbwBtAAByb2RnZXIubGl1QG91dGxvb2suY29tAABlAOAAiwC6AGAAqABOAOUATwBVAHkAzQBlALkAXwAPAE8AfwB1ACgAiwDlAFsAVwBPAFMA/wAMAGAAqABfAMUAmAB7AE4AiwBRAEgAgwC3AF8AlwBTABcATgCsAE4A0wCAADMAZQCHAFsAVwBiAIAAZwAvAGcACQCWAFAAUQBsAFMA+AB2AIQAawBjAF8ADwBOAGYAlwBiAIsAuABTAO8AMAACAABliLxgrE6MT1V56mVfD09/dSiMW1dPU9gMYKxfgXtOUUjhX1MXTsJO7jNlW1diZy9nCVBRbFO/dmtjXw9OZmL8U5UwAgAAAgAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQACAQIBAwEEAQUHdW5pNTE2Qwd1bmk1NkVEB3VuaTVGNjkHdW5pODI3MgAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAYAAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA2tuIVAAAAADb4Me4') format('truetype');
+		font-weight: normal;
+		font-style: normal;
+		font-display: swap;
+	}
+
+	@font-face {
+		font-family: 'horizon_method_stick_bodyttf';
+		src: url('data:font/truetype;charset=utf-8;base64,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') format('truetype');
+		font-weight: normal;
+		font-style: normal;
+		font-display: swap;
+	}
+
+	@font-face {
+		font-family: 'Qiantu_rabbitttf';
+		src: url('data:font/truetype;charset=utf-8;base64,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') format('truetype');
+		font-weight: normal;
+		font-style: normal;
+		font-display: swap;
+	}
+
+	@font-face {
+		font-family: 'Standing_cool_happy_bodyttf';
+		src: url('data:font/truetype;charset=utf-8;base64,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') format('truetype');
+		font-weight: normal;
+		font-style: normal;
+		font-display: swap;
+	}
+</style>
diff --git a/pages/index/components/wallpaper.vue b/pages/index/components/wallpaper.vue
new file mode 100644
index 0000000..6f27e05
--- /dev/null
+++ b/pages/index/components/wallpaper.vue
@@ -0,0 +1,228 @@
+<template>
+	<view>
+		<view style="width:630upx; margin:auto; display: flex; flex-direction: column;">
+			<view style="width:100%; min-height: 741upx; background: #282932; border-radius: 10upx; position: relative;">
+				<view @click="cancel()" style="position: absolute; top: 0upx; right: 0upx;">
+					<image src="../../static/mine/icon_guanbi.png" mode=""
+					style="height: 23upx; width: 23upx; padding: 21upx 33upx;"></image>
+				</view>
+				<!-- 品牌 -->
+				<view v-if="sizelist.length == 0">
+					<view style="margin:46upx auto 52upx;font-size: 36upx; color: #FFFFFF; text-align: center;">
+						请选择定制手机壳品牌
+					</view>
+					<!-- 无数据 -->
+					<view v-if="catrgoryList.length == null" style="text-align: center; color: #BEBEBE;">该设备没有库存</view>
+					<scroll-view scroll-y scroll-with-animation style="box-sizing: border-box;white-space: nowrap;
+					width: 288upx; margin:30upx auto; height: 600upx; overflow: hidden;">
+						<view v-for="(item,index) in catrgoryList" :key="index" @click="brandclick(item)"
+						:class="[brandtext == item.title ? 'brandactive':'' ]"
+						style="margin-bottom: 10upx; display: flex;align-items: center;
+						background: #373743;border-radius: 10upx;height: 90upx; line-height: 90upx; justify-content: center; overflow: hidden;">
+							<view style="width: 45%;">
+								<image :src="item.icon" mode="aspectFit" style="width: 30%; height: 60upx; margin-right: 26upx; float: right;"></image>
+							</view>
+							<view style="width: 55%;">
+								<view style="text-align: left; color: #FFFFFF; font-size: 28upx;" >{{item.title}} </view>
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+				<!-- 机型 -->
+				<!-- <view v-if="sizelist.length > 0">
+					<view style="margin:46upx auto 52upx;font-size: 36upx; color: #FFFFFF; text-align: center;">
+						请选择手机壳型号
+					</view>
+					<scroll-view scroll-y scroll-with-animation style="box-sizing: border-box;white-space: nowrap;
+					width: calc(100% - 60upx); margin:30upx auto; height: 500upx; overflow: hidden;">
+						<view v-for="(item,index) in sizelist" :key="index" style="float: left; margin-bottom: 20upx;">
+							<view class="model" :class="[modeltext == item.title ? 'modelactive':'' ]" @click="modelclick(item)">{{item.title}} </view>
+						</view>
+					</scroll-view>
+					<view style="width:100%; display: flex; height: 100upx; align-items: center;border-radius:0 0 10upx 10upx; position: relative;z-index: 3; margin-bottom: 20upx;">
+						<view @click.stop="cancel_center()"  style="width:50%;">
+							<view class="canbutton">返回</view>
+						</view>
+						<view @click.stop="changeChannel()" style="width:50%;">
+							<view class="experiencebutton" style="margin: auto;">
+								确定
+							</view>
+						</view>
+					</view>
+				</view> -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js';
+	export default {
+		props: {
+			// sn: {
+			// 	type: Number
+			// }
+		},
+		components: {
+			
+		},
+		data() {
+			return {
+				queryPage: {
+					s: 'Material.list',
+				},
+				long: null,
+				catrgoryList:null,
+				sizelist: [],
+				brandtext:null,
+				modeltext:null,
+				goods_id:null,
+				dict_id:null,
+				key:null,//1直营配送站 2 万能通用版 3色彩自助站
+				machine_id:null,
+				goods_id_e:null,
+			};
+		},
+		mounted() {
+			
+		},
+		/**
+		 * 组件的公有方法列表
+		 */
+		methods: {
+			cancel(){
+				this.$emit('brandscenterclose')
+			},
+			open(options) {
+				this.catrgoryList = this.$base.productfind
+				console.log(options)
+				if (options.machine_id != 'null') {
+					this.machine_id = options.machine_id;
+					this.goods_id = options.goods_id;
+					this.Customize_now()// 随机壁纸
+				}
+			},
+			brandclick(e){
+				this.brandtext = e.title
+				this.sizelist = e.sub
+			},
+			// 随机壁纸
+			Customize_now(){
+				homeservice.queryList({
+					s: 'Material.randomMaterial',
+					machine_id:this.machine_id,
+					goods_id:this.goods_id
+				}).then(result => {
+					// this.catrgoryList = result[0].brand;
+					// this.$base.productfind = result[0].brand
+					console.log(result)
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'});
+				});
+				//查询颜色列表
+				homeservice.queryList({
+					s: 'Material.colorList',
+					page:1,
+					per_page:20,
+				}).then(result => {
+					console.log(result)
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'});
+				});
+				//查询分类
+				// key=0贴图或者key=1壁纸
+				homeservice.queryList({
+					s: 'Material.category',
+					machine_id:this.machine_id,
+					key:0
+				}).then(result => {
+					console.log(result)
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'});
+				});
+				//查询分类下系列
+				homeservice.queryList({
+					s: 'Material.seriesList',
+					category_id:33,
+				}).then(result => {
+					console.log(result)
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'});
+				});
+				//查询分类下面列表
+				homeservice.queryList({
+					s: 'Material.list',
+					machine_id:this.machine_id,//设备id
+					material_category_id:0, //一级分类
+					material_series_id:0,//二级分类
+					is_new:1,//最新
+					is_hot:1,//热门
+					is_recommend:1,//推荐
+					is_under:0, //贴图是否为背景图
+					partner_id:14, 
+					goods_id:24, //商品id
+					page:1,//分页
+					per_page:20,//分页
+				}).then(result => {
+					console.log(result)
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'});
+				});
+			}
+		},
+		onShow(options) {
+			
+		},
+	}
+</script>
+
+<style lang="scss">
+	.experiencebutton{
+		width: 230upx; height: 70upx; line-height: 70upx; text-align: center; color: #FFFFFF;
+		margin:40upx auto 0; border-radius: 35upx; background: linear-gradient(to right,#834DC4,#1983D7);
+		font-size: 26upx;
+	}
+	.canbutton{
+			color: #FFFFFF;
+			font-size: 26upx;
+			width: 218upx;
+			height: 58upx; 
+			line-height: 58upx;
+			border: 1px transparent solid;
+			border-radius: 30px;
+			position: relative;
+			margin: auto;
+			background: #292933;
+			text-align: center;
+	}
+	.canbutton:after{
+			content:'';
+			position: absolute;
+			top: -3px; bottom: -3px;
+			left: -3px; right: -3px;
+			background: linear-gradient(to right,#834DC4,#1983D7);
+			border-radius: 30px;
+			content: '';
+			z-index: -1;
+	}
+	// 品牌
+	.brandactive{
+		background: #141319 !important;
+		color: #FFFFFF !important;
+	}
+	// 型号
+	.model{
+		padding: 0upx 20upx;
+		height: 60upx;
+		line-height: 60upx;
+		background: #141319; 
+		text-align: center;
+		color: #FFFFFF; 
+		border-radius: 30upx;
+		margin-right: 20upx;
+		font-size: 28upx;
+	}
+	.modelactive{
+		color: #1A7DCD;
+	}
+</style>
diff --git a/pages/index/css/css.css b/pages/index/css/css.css
new file mode 100644
index 0000000..0eae414
--- /dev/null
+++ b/pages/index/css/css.css
@@ -0,0 +1,48 @@
+/* 隐藏滚动条 */
+::-webkit-scrollbar {
+	width: 0;
+	height: 0;
+	color: transparent;
+	display: none;
+}
+
+/* 无数据 */
+.noData {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+}
+
+.noData_img {
+	width: 513upx;
+	height: 251upx;
+	display: block;
+	margin: 0 auto 36upx;
+}
+
+.noData_title {
+	color: #FFFFFF;
+	text-align: center;
+	font-size: 36upx;
+}
+
+.noData_text {
+	margin-top: 35upx;
+	font-size: 30upx;
+	font-weight: 400;
+	color: #999999;
+}
+
+.noData_but {
+	width: 230upx;
+	height: 70upx;
+	line-height: 70upx;
+	text-align: center;
+	color: #F56364;
+	margin:140upx auto 0;
+	border: 1upx solid #F56364;
+	border-radius: 35upx;
+}
+
+/* 啊嘞,附近没有T恤定制站哦 */
diff --git a/pages/index/css/main.css b/pages/index/css/main.css
new file mode 100644
index 0000000..59928bb
--- /dev/null
+++ b/pages/index/css/main.css
@@ -0,0 +1,128 @@
+/* 轮播圆点样式修改 */
+/* .swiper{
+	height: 390upx; width: 690upx; border-radius: 10upx; overflow: hidden; margin:auto;
+}
+.swiper-box {
+	position: relative;
+	width: 100%;
+}
+
+.dots {
+	display: flex;
+	justify-content: center;
+}
+
+.dots .dot {
+	color: #FFFFFF;
+	font-size: 18upx;
+	margin-right: 10upx;
+} */
+/* 轮播圆点样式修改 */
+.swiper-box {
+	position: relative;
+	width: 100%;
+}
+.swiper{
+	height: 200upx;
+	width: 690upx; 
+	border-radius: 10upx; 
+	overflow: hidden; 
+	margin:auto;
+}
+.swiper-item{
+	/* height: ; */
+}
+
+.dots {
+	position: absolute;
+	left: 0;
+	right: 0;
+	bottom: 22upx;
+	display: flex;
+	justify-content: center;
+}
+
+.dots .dot {
+	color: #F56364;
+	font-size: 22upx;
+}
+/*弹性布局*/
+
+.flex {
+	display: -webkit-box;
+	display: -moz-box;
+	display: -ms-flexbox;
+	display: -webkit-flex;
+	display: flex;
+	display: box;
+	flex-wrap: wrap;
+}
+
+.line1 {
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	font-size: 36upx; font-weight: 200; color: #FFFFFF;
+}
+
+.commonbottom{
+	width: 750upx; height: 1upx; border-top: 1upx solid #F1F3F6; opacity: 0.05;
+}
+
+.commonHead {
+	width: 100%;
+	height: 128rpx;
+	box-sizing: border-box;
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	overflow: hidden;
+	position: relative;
+	z-index: 10;
+}
+
+.commonHead-wrap {
+	width: 100%;
+	position: absolute;
+	overflow: hidden;
+	left: 0;
+	bottom: 0;
+	height: 45px;
+	line-height: 45px;
+}
+
+.commonHead_left {
+	width: 100rpx;
+	height: 100%;
+	position: absolute;
+	left: 0;
+	top: 0
+}
+
+.commonHead_left_back {
+	width: 100%;
+	height: 100%;
+	background-size: 40rpx 40rpx;
+	background-repeat: no-repeat;
+	background-position: center;
+	display: flex; align-items: center;
+}
+
+.commonHead_left_back_img{
+	width: 60upx; height: 60upx; display: block; border-radius: 50%;
+	margin-left:31upx; align-items: center; overflow: hidden;
+}
+
+.commonHead_right {
+	width: 100%;
+	height: 100%;
+	/* line-height: 88rpx; */
+	text-align: center;
+	font-size: 30rpx;
+	overflow: hidden;
+	justify-content: flex-end;
+}
+
+.commonHead_right_text {
+	width: 280rpx;
+	margin: 0 auto;
+}
diff --git a/pages/index/custom-size.vue b/pages/index/custom-size.vue
new file mode 100644
index 0000000..a1551c7
--- /dev/null
+++ b/pages/index/custom-size.vue
@@ -0,0 +1,747 @@
+<template>
+	<view class="edit-address full-height full-width">
+		<view class="form full-width">
+
+			<!-- 自定义 -->
+			<view v-if="!preview" class="full-width" scroll-y style="height: calc(100% - 120upx);overflow: scroll;">
+				<view style="width: 690upx; height: 420upx; overflow: scroll; margin:0 auto 47upx;display: flex;
+				justify-content: center; margin-top: 30upx;  ">
+					<image mode="widthFix"
+						:src="'https://img.colorpark.cn/back/16668389136359f18160568.png?x-oss-process=image/resize,lfit,w_' + imageWith"
+						:style="{width: imageWith * scale +'px', height:imageHeight * scale + 'px' }"
+						style=" margin:auto; position: absolute; "></image>
+					<view :style="{width: imageWith * scale +'px', height:imageHeight * scale + 'px' }"
+						style=" margin:auto; position: absolute; z-index: 999; ">
+						<view :style="{width: printWidth != '' ? printWidth * scale +'px' : 0 +'px', 
+					    height:  printHeight != '' ? printHeight* scale +'px' : 0 +'px',
+					    marginTop: printTop != '' ? printTop* scale +'px' : 0 +'px' ,
+						marginLeft: printLeft != '' ? printLeft* scale +'px' : 0 +'px' ,borderRadius: switchIsFillet ? defalutFillet + 'px' : '0px' }"
+							style="background: #FFFFFF; ">
+						</view>
+					</view>
+				</view>
+
+				<view style="position: relative; margin-top: 50upx;">
+					<!-- 请输入手机型号 -->
+					<view style="display: flex;  margin-left: 20upx; margin-top: 40upx;">
+						<!-- <view style="font-size: 28upx; font-weight: 400; color: #FFFFFF; width: 155upx;">手机型号:</view -->
+						<view style="width: calc(100% - 80upx); height: 66upx; background: #282932; border-radius: 30upx; 
+						display: flex; align-items: center;">
+							<input placeholder="请输入手机型号"
+								style="color: #FFFFFF; font-size: 28upx; padding-left: 35upx;width: 200upx;"
+								v-model="phone" />
+						</view>
+					</view>
+
+					<!-- 自定义高度 -->
+					<view style="display: flex;align-items: center; margin-left: 20upx; margin-top: 20upx;">
+						<!-- <view style="font-size: 28upx; font-weight: 400; color: #FFFFFF; width: 155upx;">上边距:</view> -->
+						<view style="width: calc(100% - 70upx); height: 66upx; background: #282932; border-radius: 30upx; 
+						display: flex;align-items: center ">
+							<input type="digit" placeholder="请输入上边距" @input="changeTop" :value="printTop"
+								style="color: #FFFFFF; font-size: 28upx; padding-left: 35upx;width: calc(100% - 90upx);" />
+							<view style="color: #898989; font-size: 26upx; width: 82upx;">{{companyValue}}</view>
+						</view>
+						<image src="../../static/icon_custom_tips.png"
+							style="width: 48upx; height: 48upx;margin-left: 10upx;" mode="widthFix"
+							@click="showUpdateRule(1)"> </image>
+					</view>
+					<view
+						style="display: flex; align-items: center; margin-left: 20upx;  margin-top: 20upx; position: relative;">
+						<!-- <view style="font-size: 28upx; font-weight: 400; color: #FFFFFF;width: 155upx;">左边距:</view> -->
+						<view style="width: calc(100% - 70upx);; height: 66upx; background: #282932; border-radius: 30upx; 
+						display: flex; align-items: center;">
+							<input type="digit" :value="printLeft" placeholder="请输入左边距" @input="changeLeft"
+								style="color: #FFFFFF; font-size: 28upx; padding-left: 35upx;width: calc(100% - 90upx);" />
+							<view style="color: #898989; font-size: 26upx; width: 82upx;">{{companyValue}}</view>
+						</view>
+						<image src="../../static/icon_custom_tips.png"
+							style="width: 48upx; height: 48upx;margin-left: 10upx;" mode="widthFix"
+							@click="showUpdateRule(2)"> </image>
+					</view>
+				</view>
+
+				<view style="position: relative;">
+					<!-- 自定义高度 -->
+					<view style="display: flex; align-items: center; margin-left: 20upx;  margin-top: 20upx;">
+						<view style="width: calc(100% - 70upx); height: 66upx; background: #282932; border-radius: 30upx; 
+						display: flex; align-items: center;">
+							<input type="digit" placeholder="请输入宽度" @input="changeWidth" :value="printWidth"
+								style="color: #FFFFFF; font-size: 28upx; padding-left: 35upx;width: calc(100% - 90upx);" />
+							<view style="color: #898989; font-size: 26upx; width: 82upx;">{{companyValue}}</view>
+						</view>
+						<image src="../../static/icon_custom_tips.png"
+							style="width: 48upx; height: 48upx; margin-left: 10upx;" mode="widthFix"
+							@click="showUpdateRule(3)"> </image>
+					</view>
+
+					<!-- 自定义高度 -->
+					<view style="display: flex; align-items: center; margin-left: 20upx;  margin-top: 20upx;">
+						<!-- <view style="font-size: 28upx; font-weight: 400; color: #FFFFFF;width: 155upx;">高度:</view> -->
+						<view style="width: calc(100% - 70upx);height: 66upx; background: #282932; border-radius: 30upx; 
+						display: flex; align-items: center;">
+							<input type="digit" placeholder="请输入宽度" @input="changeHeight" :value="printHeight"
+								style="color: #FFFFFF; font-size: 28upx; padding-left: 35upx;width: calc(100% - 90upx);" />
+							<view style="color: #898989; font-size: 26upx; width: 82upx;">{{companyValue}}</view>
+						</view>
+						<image src="../../static/icon_custom_tips.png"
+							style="width: 48upx; height: 48upx; margin-left: 10upx;" mode="widthFix"
+							@click="showUpdateRule(4)"> </image>
+					</view>
+				</view>
+
+				<view style="position: relative;">
+					<view style="display: flex; align-items: center; margin-left: 27upx;  margin-top: 25upx;">
+						<!-- <view style="font-size: 28upx; font-weight: 400; color: #FFFFFF;width: 155upx;">圆角:</view> -->
+						<view style="width: calc(100% - 70upx); height: 66upx; 
+						display: flex; align-items: center; margin-top: 5upx;">
+							<!-- 滑块封装 -->
+							<NumSlider ref="NumSlider" :min="0" :max="100" :width="sliderdefaultWith" :disabled="false"
+								:range="false" @highChange="highChange" :leftX="10"
+								:defalutFillet="defalutFillet" />
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="footer" v-if="!preview">
+			<view class="footer_but" hover-class="hover-class-bg" @click="onSave()">确认</view>
+		</view>
+
+		<uni-popup ref="showUpdateRule" type="center" style="position: fixed; z-index: 9999; width: 200upx">
+			<view style="width: 558upx; height: 558upx;background: #CCCCCC;text-align: center; border-radius: 10upx; ">
+				<view style="width:100%;height: 50upx; z-index: 999; position: absolute; top:0;">
+					<image @click="closeUpdateRule()" src="../../static/img/icon_close_image.png"
+						style=" width: 30upx; padding: 20upx; float:right; " mode="widthFix">
+					</image>
+				</view>
+				<image style="width: 558upx; position: absolute; top:0;left: 0; z-index: 2;" :src="tipImageUrl"
+					mode="widthFix" />
+			</view>
+		</uni-popup>
+
+	</view>
+</template>
+
+<script>
+	import Enums from '@/util/Enums';
+	import userService from '@/service/UserService';
+	import homeservice from '@/service/homeservice.js';
+	import uniPopup from '../index/common/uni-popup/uni-popup.vue';
+	import NumSlider from './components/NumSlider.vue'
+
+	export default {
+		components: {
+			uniPopup,
+			NumSlider
+		},
+		computed: {
+
+		},
+		data() {
+			return {
+				mode: 'selector',
+				pickerValueArray: [{
+						label: '毫米',
+						value: 0
+					},
+					{
+						label: '厘米',
+						value: 1
+					}
+				],
+				pickerValueDefault: [0],
+				companyValue: '毫米',
+				data: {
+					windowWidth: null, // 屏幕宽度
+					windowHeight: null, // 屏幕高度
+					pixelRate: null // 屏幕宽度比率
+				},
+				//上拉状态
+				dataLoadState: {
+					pullDownRefresh: false,
+					reachBottom: false
+				},
+				queryPage: {
+					s: 'Product.getCustomize',
+					machine_id: null,
+				},
+				Loop: null,
+				good: null,
+				type: 1, //类型 1 默认 2 选择列表
+				selectItemData: null, // 选中对象
+				low: 0, //设置圆角百分比
+				high: 0, //设置圆角百分比
+				switchIsFillet: true, //是否设置圆角
+				inputWidth: 0, //文本框显示数据
+				inputHeight: 0, //文本框显示数据
+				imageWith: 100, //夹具图宽度
+				imageHeight: 190, //夹具图高度
+				printTop: 10, //打印区上间距
+				printTopMin: 9, //打印区上间距最小
+				printTopMax: 13, //打印区上间距最大
+				printLeft: 10, //打印区左间距
+				printLeftMin: 9, //打印区上间距最小
+				printLeftMax: 13, //打印区上间距最大
+				printWidth: 70, //默认打印宽度
+				printWidthMin: 65, //打印最小宽度
+				printWidthMax: 85, //打印最大宽度
+				printHeight: 145, //默认打印高度
+				printHeightMin: 125, //打印最小高度
+				printHeightMax: 175, //打印最大高度
+				defalutFillet: 9, //默认圆角大小
+				sliderdefaultWith: 400,
+				key: null, //1直营配送站 2 万能通用版 3色彩自助站
+				scale: 1, //放大比例
+				tipImageUrl: "https://img.colorpark.cn/back/1667005372635c7bbc4f1db.png?x-oss-process=image/resize,lfit,w_558",
+				phone: "", //手机型号
+				OldConvert_rate: 3, //放大比例
+				good_id: null, //产品Id
+				isFirstPage: true,
+			}
+		},
+
+		methods: {
+
+			//打开弹窗
+			showUpdateRule(type) {
+				if (type == 1) {
+					this.tipImageUrl =
+						"https://img.colorpark.cn/back/1667005462635c7c16d7ec0.png?x-oss-process=image/resize,lfit,w_558"
+				} else if (type == 2) {
+					this.tipImageUrl =
+						"https://img.colorpark.cn/back/1667005469635c7c1dabead.png?x-oss-process=image/resize,lfit,w_558"
+				} else if (type == 3) {
+					this.tipImageUrl =
+						"https://img.colorpark.cn/back/1667005372635c7bbc4f1db.png?x-oss-process=image/resize,lfit,w_558"
+				} else if (type == 4) {
+					this.tipImageUrl =
+						"https://img.colorpark.cn/back/1667005366635c7bb61b3da.png?x-oss-process=image/resize,lfit,w_558"
+				}
+				this.$refs['showUpdateRule'].open();
+			},
+
+			//关闭弹窗
+			closeUpdateRule() {
+				this.$refs['showUpdateRule'].close();
+			},
+
+			//获取自定义产品信息
+			getCustomSizeInfo() {
+				homeservice.queryList(this.queryPage).then(result => {
+					this.good_id = result.id
+				}).catch(err => {
+
+				});
+			},
+
+			//开关控制圆角
+			switchChange(e) {
+				if (e.detail.value == true) {
+					this.switchIsFillet = true;
+				} else {
+					this.switchIsFillet = false;
+				}
+			},
+
+			highChange(val) {
+				this.defalutFillet = val;
+			},
+
+			checkNumber(value) {
+				var reg = /^\d*(\.\d{1,20})?$/;
+				var pattern = new RegExp(reg);
+				return pattern.test(value);
+			},
+
+			//1像素 = 10毫米
+			onSave() {
+				if (this.phone == "" || this.phone == null || this.phone == "null") {
+					uni.showToast({
+						icon: "success",
+						title: '手机型号不能为空',
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printTop == "" || this.printTop == null || this.printTop == "null") {
+					uni.showToast({
+						icon: "success",
+						title: '上边距不能为空',
+						duration: 2000
+					});
+					return;
+				}
+				let isNumber = this.checkNumber(this.printTop)
+				if (!isNumber) {
+					uni.showToast({
+						icon: "success",
+						title: '上边距只能整数跟两位小数',
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printTop < Number(this.printTopMin)) {
+					this.printTop = this.printTopMin;
+					uni.showToast({
+						icon: "success",
+						title: '上边距最小值' + this.printTopMin,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printTop > Number(this.printTopMax)) {
+					uni.showToast({
+						icon: "success",
+						title: '上边距最大值' + this.printTopMax,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printLeft == "" || this.printLeft == null || this.printLeft == "null") {
+					uni.showToast({
+						icon: "success",
+						title: '左边距不能为空',
+						duration: 2000
+					});
+					return;
+				}
+				isNumber = this.checkNumber(this.printLeft)
+				if (!isNumber) {
+					uni.showToast({
+						icon: "success",
+						title: '左边距只能整数跟两位小数',
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printLeft < Number(this.printLeftMin)) {
+					this.printLeft = this.printLeftMin
+					uni.showToast({
+						icon: "success",
+						title: '左边距最小值' + this.printLeftMin,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printLeft > Number(this.printLeftMax)) {
+					uni.showToast({
+						icon: "success",
+						title: '左边距最大值' + this.printLeftMax,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printHeight == "" || this.printHeight == null || this.printHeight == "null") {
+					uni.showToast({
+						icon: "success",
+						title: '高度不能为空',
+						duration: 2000
+					});
+					return;
+				}
+				isNumber = this.checkNumber(this.printHeight)
+				if (!isNumber) {
+					uni.showToast({
+						icon: "success",
+						title: '高度只能输入整数跟两位小数',
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printHeight < Number(this.printHeightMin)) {
+					this.printHeight = this.printHeightMin;
+					uni.showToast({
+						icon: "success",
+						title: '高度最小值' + this.printHeightMin,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printHeight > Number(this.printHeightMax)) {
+					uni.showToast({
+						icon: "success",
+						title: '高度最大值' + this.printHeightMax,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printWidth == "" || this.printWidth == null || this.printWidth == "null") {
+					uni.showToast({
+						icon: "success",
+						title: '宽度不能为空',
+						duration: 2000
+					});
+					return;
+				}
+				isNumber = this.checkNumber(this.printWidth)
+				if (!isNumber) {
+					uni.showToast({
+						icon: "success",
+						title: '宽度只能输入整数跟两位小数',
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printWidth < Number(this.printWidthMin)) {
+					this.printWidth = this.printWidthMin;
+					uni.showToast({
+						icon: "success",
+						title: '宽度最小值' + this.printWidthMin,
+						duration: 2000
+					});
+					return;
+				}
+				if (this.printWidth > Number(this.printWidthMax)) {
+					uni.showToast({
+						icon: "success",
+						title: '高度最大值' + this.printWidthMax,
+						duration: 2000
+					});
+					return;
+				}
+
+				if (this.isFirstPage && this.isFirstPage == "true") {
+					uni.redirectTo({
+						url: '../index/index?machine_id=' + this.queryPage.machine_id +
+							'&WidthIndex=' + (this.printWidth * this.OldConvert_rate) +
+							'&HeightIndex=' + (this.printHeight * this.OldConvert_rate) +
+							"&fillet=" + (this.defalutFillet * this.OldConvert_rate) +
+							"&top=" + (this.printTop * this.OldConvert_rate) +
+							"&left=" + (this.printLeft * this.OldConvert_rate) +
+							"&name=" + this.phone +
+							'&key=' + this.key +
+							'&type= 3' +
+							"&machineDetail=" + encodeURIComponent(JSON.stringify(this.machineDetail)) +
+							'&goods_id=' + this.good_id
+					})
+				} else {
+					let pages = getCurrentPages();
+					var prevPage = pages[pages.length - 2]; //上一个页面
+					let machineDetail = encodeURIComponent(JSON.stringify(this.machineDetail));
+					var data = {
+						WidthIndex: this.printWidth * this.OldConvert_rate,
+						HeightIndex: this.printHeight * this.OldConvert_rate,
+						fillet: this.defalutFillet * this.OldConvert_rate,
+						top: this.printTop * this.OldConvert_rate,
+						left: this.printLeft * this.OldConvert_rate,
+						name: this.phone,
+						key: this.key,
+						type: 3,
+						machineDetail: machineDetail,
+						goods_id: this.good_id,
+					}
+					prevPage.$vm.options = data;
+					uni.navigateBack({
+						delta: 1
+					});
+				}
+			},
+
+			//改变上间距
+			changeTop(event) {
+				let top = this.numberone(event.detail.value);
+				if (Number(top) > Number(this.printTopMax)) {
+					top = this.printTopMax
+					uni.showToast({
+						icon: "success",
+						title: '上边距最大值' + top,
+						duration: 2000
+					});
+				}
+				//赋值
+				this.setData({
+					printTop: top
+				});
+				return top
+			},
+
+			//改变左间距
+			changeLeft(event) {
+				let left = this.numberone(event.detail.value);
+				if (Number(left) > Number(this.printLeftMax)) {
+					left = this.printLeftMax
+					uni.showToast({
+						icon: "success",
+						title: '左边距最大值' + left,
+						duration: 2000
+					});
+				}
+				//赋值
+				this.setData({
+					printLeft: left
+				});
+				return left
+			},
+
+			//改变宽度
+			changeWidth(event) {
+				let Width = this.numberone(event.detail.value);
+				if (Number(Width) > Number(this.printWidthMax)) {
+					Width = this.printWidthMax
+					uni.showToast({
+						icon: "success",
+						title: '宽度最大值' + Width,
+						duration: 2000
+					});
+				}
+				//赋值
+				this.setData({
+					printWidth: Width
+				});
+				return Width
+			},
+
+			//改变高度
+			changeHeight(event) {
+				let Height = this.numberone(event.detail.value);
+				if (Number(Height) > Number(this.printHeightMax)) {
+					Height = this.printHeightMax
+					uni.showToast({
+						icon: "success",
+						title: '高度最大值' + Height,
+						duration: 2000
+					});
+				}
+				//赋值
+				this.setData({
+					printHeight: Height
+				});
+				return Height
+			},
+
+			setData(obj) {
+				let that = this;
+				let keys = [];
+				let val, data;
+				Object.keys(obj).forEach(function(key) {
+					keys = key.split('.');
+					val = obj[key];
+					data = that.$data;
+					keys.forEach(function(key2, index) {
+						if (index + 1 == keys.length) {
+							that.$set(data, key2, val);
+						} else {
+							if (!data[key2]) {
+								that.$set(data, key2, {});
+							}
+						}
+						data = data[key2];
+					})
+				});
+			},
+
+			//验证数字输入金额
+			numberone(val) {
+				let num = val.toString(); //先转换成字符串类型
+				if (num.indexOf('.') == 0) { //第一位就是 .
+					num = '1' + num
+				} else if (num.indexOf('0') == 0) {
+					num = ''
+				}
+				num = num.replace(/[^\d.]/g, ""); //清除“数字”和“.”以外的字符
+				num = num.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的
+				num = num.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
+				num = num.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
+				if (num.indexOf(".") < 0 && num != "") {
+					num = parseFloat(num);
+				}
+				return num
+			},
+		},
+
+		//下拉加载
+		onPullDownRefresh() {
+
+		},
+
+		//上拉加载
+		onReachBottom() {
+
+		},
+
+		onLoad(options) {
+			//获取屏幕宽高
+			let windowWidth;
+			let windowHeight;
+			let pixelRate = 1;
+			let that = this
+			wx.getSystemInfo({
+				success: function(res) {
+					let pixelRate = res.windowWidth / 750;
+					that.scale = pixelRate / 0.45;
+					that.data.windowWidth = res.windowWidth // 屏幕宽度
+					that.data.windowHeight = res.windowHeight // 屏幕高度
+					that.data.pixelRate = pixelRate // 屏幕宽度比率
+					that.sliderdefaultWith = that.data.windowWidth - uni.upx2px(110);
+				}
+			});
+			if (options) { //判断是从设备进来
+				this.queryPage.machine_id = options.machine_id // 设备id
+				this.key = options.key //设备对应key
+				if (options.machineDetail != undefined && options.machineDetail != "") {
+					this.machineDetail = JSON.parse(decodeURIComponent(options.machineDetail)); //获取设备详情数据
+				}
+				if (options.isFirstPage) {
+					this.isFirstPage = options.isFirstPage
+				}
+				this.getCustomSizeInfo()
+			}
+		},
+		
+	
+	   
+		onShow() {
+			setTimeout(function() {
+				this.$refs['NumSlider'].init();
+			}.bind(this), 800)
+		}
+
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: #101014;
+	}
+
+	.progress-wrap {
+		height: 30upx;
+		width: 100upx;
+		background: #ffc3cb;
+		border-radius: 20upx;
+		overflow: hidden;
+		position: relative;
+	}
+
+	.progress {
+		height: 30upx;
+	}
+
+	.percentage {
+		position: absolute;
+		left: 16upx;
+		top: 0;
+		font-size: 20upx;
+		color: #eee;
+	}
+
+	.equalRatioAxtive {
+		color: #2a82e4 !important;
+		border-color: #2a82e4 !important;
+	}
+
+	.directionAxtive {
+		border-color: #2a82e4 !important;
+	}
+
+	.classificationLeft {
+		background: #E7BE16 !important;
+	}
+
+	.classificationRight {
+		background: #E7BE16 !important;
+	}
+
+	.previewAxtiveLeft {
+		background: linear-gradient(92deg, #178CE6, #072999);
+		box-shadow: 0px 19upx 48upx 1upx rgba(20, 31, 62, 0.35);
+		border-radius: 50upx 50upx 0px 50upx;
+	}
+
+	.previewAxtiveRight {
+		background: linear-gradient(92deg, #178CE6, #072999);
+		box-shadow: 0px 19upx 48upx 1upx rgba(20, 31, 62, 0.35);
+		border-radius: 50upx 50upx 50upx 0px;
+	}
+
+	.eq_list {
+		width: calc(100% - 60upx);
+		margin: 20upx auto;
+		border-radius: 10upx;
+		overflow: hidden;
+		color: #FFFFFF;
+
+		.eq_list_div {
+			// background: #FFFFFF;
+			padding: 40upx 20upx;
+			display: flex;
+			align-items: center;
+			border-bottom: 1px solid #282932;
+		}
+
+	}
+
+	// 返回顶部
+	.to-top {
+		position: fixed;
+		bottom: 150upx;
+		right: 30upx;
+		width: 80upx;
+		height: 80upx;
+		border-radius: 50%;
+		text-align: center;
+		line-height: 80upx;
+		// box-shadow: 5upx 5upx 5upx #ebeef5;
+		transform: rotate(-90deg);
+		background: #000;
+		opacity: 0.5;
+		z-index: 999;
+	}
+
+	.to-top-icon {
+		color: #FFFFFF;
+	}
+
+	.edit-address {
+
+		.form {
+			height: 100%;
+			color: #FFFFFF;
+
+			.item {
+				height: 100upx;
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				padding: 0 30upx;
+				width: calc(100% - 60upx);
+
+				.text {
+					width: 200upx;
+				}
+
+				.value {
+					width: 300upx;
+					margin-left: auto;
+					background: #212027;
+					text-align: center;
+					border-radius: 10upx;
+					padding: 15upx 0;
+					color: #FFFFFF;
+					display: flex;
+					align-items: center;
+				}
+			}
+		}
+
+		.footer {
+			position: fixed;
+			bottom: 30upx;
+			width: 100%;
+
+			.footer_but {
+				margin: auto;
+				color: #fff;
+				text-align: center;
+				line-height: 90upx;
+				width: 410upx;
+				height: 90upx;
+				background: linear-gradient(to right, #834DC4, #1983D7);
+				box-shadow: 0px 19upx 48upx 1upx rgba(20, 31, 62, 0.35);
+				border-radius: 50upx;
+			}
+		}
+	}
+</style>
diff --git a/pages/index/head/head.vue b/pages/index/head/head.vue
new file mode 100644
index 0000000..57be3ff
--- /dev/null
+++ b/pages/index/head/head.vue
@@ -0,0 +1,110 @@
+<template>
+	<view :style="{ height: height + 'px', background:background}" style="position: fixed; z-index: 999;">
+		<view class="head" :style="{ height: height + 'px', background:background}">
+			<view class="back" @click="back" v-if="backShow" :style="{ top: top + 'px', color:color }">
+				<image v-if="worksid > 0" src="../../../static/recommend/house.png" mode="aspectFit" 
+				style="width: 39upx; height: 39upx; margin-top: calc((32px - 39upx)/2);margin-left: auto; margin-right: auto;"></image>
+				<image v-else src="../../../static/recommend/icon_back.png" mode="aspectFit" style="width: 23upx; height: 39upx; margin-top: calc((32px - 39upx)/2);margin-left: auto; margin-right: auto;"></image>
+			</view>
+			<view class="title" v-if="titleShow" :style="{ top: top + 'px', color:color, 'font-size': size + 'rpx' }">{{title}}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			worksid:{
+				type: Number,
+				default: null
+			},
+			title: {
+				type: String,
+				default: '自定义标题'
+			},
+			size:{
+				type: String,
+				default: '32'
+			},
+			color:{
+				type: String,
+				default: '#000'
+			},
+			titleShow: {
+				type: Boolean,
+				default: true
+			},
+			backShow: {
+				type: Boolean,
+				default: true
+			},
+			background:{
+				type: String,
+				default: "linear-gradient(to right, #43e97b 0%, #38f9d7 100%)"
+			}
+		},
+		data() {
+			return {
+				height :0,
+				top:0,
+			}
+		},
+		mounted() {
+			
+		},
+		created() {
+			//console.log('设备信息')
+			//设备信息
+			let app = uni.getSystemInfoSync();
+			//胶囊信息
+			let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
+			this.height  = app.statusBarHeight + menuButtonInfo.height + (menuButtonInfo.top - app.statusBarHeight)*2
+			this.top = menuButtonInfo.top;
+		},
+		methods: {
+			back(){
+				if(this.worksid > 0){
+					// uni.redirectTo({ url: '../index/mall' })
+					uni.reLaunch({
+					    url: '../index/mall'
+					});
+				}else{
+					uni.navigateBack();
+				}
+			}
+		},
+		onLoad(options) {
+			
+		},
+		onShow() {
+			
+		}
+	}
+</script>
+
+<style>
+.head{
+	position: fixed;
+	width: 750rpx;
+	z-index: 888;
+	align-items: center;
+}
+.title{
+	position: fixed;
+	width: 750rpx;
+	text-align: center;
+	line-height: 32px;
+	height: 32px;
+}
+.back{
+	position: fixed;
+	width: 81rpx;
+	text-align: center;
+	line-height: 32px;
+	height: 32px;
+	font-size: 32rpx;
+	font-weight: 900;
+	z-index: 9;
+	align-items: center;
+}
+</style>
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..da17da2
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,5978 @@
+<template>
+	<view class="full-width content-color full-height" style="overflow: hidden;">
+		<!-- 自定义头部 -->
+		<myhead :worksid="works_id" :title="titlename" :color="'#864BC3'" :titleShow="true" :backShow="true"
+			:background="'#131319'"></myhead>
+		<!-- 礼花 -->
+		<firework ref="firework" v-if="isReady" style="position: fixed;z-index: 9999;"></firework>
+		<!-- 登录弹框 -->
+		<Signin ref="Signin"></Signin>
+		<!-- 裁剪图片 -->
+		<view class="full-width content-color full-height" style="background: black;c" v-show="state">
+			<kps-image-cutter @ok="onok" @cancel="oncancle" ref="index" :fixed="false"
+				:properties="properties"></kps-image-cutter>
+		</view>
+		<!-- 滑到底图 -->
+		<view :animation="translateXState" v-if="!isCustomize"
+			style="position: fixed; left: 0; width: 100%; overflow: hidden; height: 100%;"
+			:style="{ top: textHeight + 'px'}">
+			<image src="https://img.colorpark.cn/wechat/track/shejiqu_2.png?x-oss-process=image/resize,lfit,w_500"
+				mode="widthFix" style="width: 100%;">
+			</image>
+		</view>
+
+		<!-- 设计区域 -->
+		<view v-show="!state" class="full-width content-color full-height" :style="{background: design_color }">
+			<view class="full-width full-height" style="position: absolute; top: 0; left: 0;" @click.stop="itemCancel">
+			</view>
+			<view class="container" :style="{height: data.windowHeight  + 'px'}" @touchmove.stop="touchMove"
+				@touchend.stop="touchEnd" @click.stop="itemCancel">
+				<!-- 辅助线 -->
+				<view v-if="guide_left"
+					style="border-left: 1px dashed #864BC3;position: absolute; height: 100%; z-index: 999; left: calc(50% - 0.5px);">
+				</view>
+				<view :style="{width: data.bgWidth +'px',height: data.editorHeight +'px',
+				transform: 'translateX(' +  translateX + 'px) scale(' + transformscale + ')',
+				'-webkit-transform': 'translateX(' + translateX + 'px) scale(' + transformscale + ')'}"
+					:class="{translateXClass:translateX >= 0}"
+					style="position: relative;transition: all 1s; -webkit-transition: all 1s;">
+
+					<!-- 辅助线 -->
+					<view v-if="guide_top"
+						style="width: 100%; border-top: 1px dashed #864BC3;position: absolute; z-index: 999;"
+						:style="{top: (data.editorHeight * location_scale - 0.5) +'px'}"></view>
+					<!-- 部件列表  -->
+
+					<view v-if="front_image_long" :class="['item-list', { 'list-active': data.listActive == true }]"
+						style="overflow: hidden;"
+						:style="{width: data.editorWidth +'px',height: data.editorHeight +'px' ,clipPath: 'inset(' + clipButtom + 'px ' + clipRight + 'px ' + clipTop + 'px ' + clipLeft + 'px round ' + filletSize + 'px)' }">
+
+						<!-- 定制壳底图 -->
+						<image v-if="data.loadbgImageheightstate && !isCustomize"
+							:src="background_surface_image + '?x-oss-process=image/resize,lfit,w_400'" mode=""
+							:style="{width: data.editorWidth   +'px',height: data.editorHeight +'px'}"
+							style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;margin: auto;z-index: 0;">
+						</image>
+
+						<view v-if=" isCustomizeComplete && isCustomize"
+							:style="{width: real_print_width  +'px',height:  real_print_height  +'px', borderRadius: filletSize + 'px'}"
+							style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;margin: auto;z-index: 0; background: #fff;">
+						</view>
+
+						<view v-if="data.loadbgImageheightstate && isCustomize "
+							:style="{width: data.editorWidth +'px',height: data.editorHeight  +'px',background:background_surface_color ? background_surface_color : 'none'}"
+							style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;margin: auto;z-index: 0;">
+						</view>
+
+						<!-- 白底图 -->
+						<view v-if="data.loadbgImageheightstate"
+							:style="{width: data.editorWidth  +'px',height: data.editorHeight +'px',background:background_color ? background_color : 'none'}"
+							style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;margin: auto;z-index: 0;">
+						</view>
+
+						<view
+							:style="{'margin-top': (data.editorHeight * (1 - mix_scale) / 2) +'px',width: data.editorWidth * mix_scale +'px',height: data.editorHeight * mix_scale +'px','mask-image':shape_image ? 'url(' + shape_image + ')' : 'none', '-webkit-mask-image':shape_image ? 'url(' + shape_image + ')' : 'none',}"
+							style="overflow: hidden; mask-size: 100%; 
+							-webkit-mask-size: 100%;margin-left:auto; 
+							margin-right: auto;
+							mask-repeat:no-repeat;
+							-webkit-mask-repeat: no-repeat;">
+							<block v-for="(item,idx) in data.itemList" :key="idx">
+								<!-- 文本展示 -->
+								<view v-if="item.type == 1" class='item-box'
+									:style="{'z-index':item.index , transform: 'scale(' + item.scale + ')', top: item.top + 'px',left: item.left + 'px'}">
+									<view class='item-box-in' style="text-align: center;"
+										:style="{transform: 'rotate(' + item.angle + 'deg)', width: item.width + 'px',height: item.height + 'px', 'line-height': item.height + 'px','background-color': item.under_color}">
+										<view :id="'item-text-' + idx " class="item-text"
+											style="margin:auto;white-space:nowrap;display:table;"
+											:style="{'font-family': item.font_family,'font-weight': item.font_style,'font-size': item.font_size + 'px', color:item.font_color,'background-color': item.under_color}">
+											{{item.content}}
+										</view>
+									</view>
+								</view>
+								<!-- 图片展示 -->
+								<view v-if="item.type == 0 || item.type == 2" class='item-box'
+									:style="{'z-index':item.index,transform: 'scale(' + item.scale + ')',top:item.top + 'px',left:item.left + 'px'}">
+									<view class='item-box-in' style="overflow: hidden;"
+										:style="{width: item.width + 'px' , height: item.height +'px',transform: 'rotate(' + item.angle + 'deg)'}">
+										<!-- 图片裁剪 -->
+										<image v-if="item.replace == 1" mode='aspectFill' :src="item.content"
+											:data-id="item.id" :style="{width: item.initialWidth * item.initialScale + 'px',
+										height: item.initialHeight * item.initialScale +'px',
+										'margin-top': item.image_top +'px','margin-left': item.image_left +'px'}"></image>
+										<!--图片 -->
+										<image v-else-if="item.type == 0" mode='aspectFill' :src="item.content "
+											:data-id="item.id" :style="{width: item.initialWidth * item.initialScale + 'px',
+										height: item.initialHeight * item.initialScale +'px',
+										'margin-top': item.image_top +'px','margin-left': item.image_left +'px'}"></image>
+										<!-- 贴图 -->
+										<image v-else-if="item.type == 2" mode='aspectFit'
+											:src="item.content + '?x-oss-process=image/resize,lfit,w_900'"
+											:data-id="item.id"
+											:style="{width: item.width + 'px',height: item.height +'px'}"></image>
+									</view>
+								</view>
+							</block>
+						</view>
+					
+						<!-- 手机壳图 -->
+						<image :src="data.bgImage + '?x-oss-process=image/resize,lfit,w_400' " mode=""
+							@load="loadbgImage"
+							style="position: absolute;z-index: 9;top: -1px; bottom: 0; left: -1px; right: 0;margin: auto; "
+							:style="{width: (data.editorWidth + 1) +'px',height: (data.editorHeight + 1) +'px', visibility : !isCustomize ? 'visible' : 'hidden' }">
+						</image>
+
+						<!-- 旧——手机壳图 -->
+						<image :animation="translateHide "
+							:src="data.bgImage_old + '?x-oss-process=image/resize,lfit,w_400'" mode="" @load="loadbgImage" @error="loadbgImageError"  v-if="!isCustomize"
+							style="position: absolute;z-index: 9;top: -1px; bottom: 0; left: -1px; right: 0;margin: auto"
+							:style="{width: (data.editorWidth + 1) +'px',height: (data.editorHeight + 1) +'px'}">
+						</image>
+
+					</view>
+
+					<!-- 操作列表 ,top: editory +'px' v-if="editory" front_image_long-->
+					<view v-if="front_image_long" :class="['operate-list', { 'list-active': data.listActive == true }]"
+						style="z-index: 10;" :style="{width: data.editorWidth +'px',height: data.editorHeight +'px'}">
+						<block v-for="(item,idx) in data.itemList" :key="idx">
+							<view class='item-box'
+								:style="{'z-index':item.active == true ? 999:(item.index + 10), transform: 'scale(' + item.scale + ')',top: item.top + 'px',left: item.left + 'px'}">
+								<view :class="['item-box-in', { 'active': item.active == true }]"
+									style="background: none; " :style="{transform: 'rotate(' + item.angle + 'deg)' }">
+									<!-- 图片拖动 -->
+									<view :data-id='item.id' :data-time="lastTapTime"
+										style="position: relative; background: none;"
+										:style="{width: item.width + 'px' , height: item.height +'px'}"
+										@longtap.stop="itemlongtap" @touchstart.stop="itemTouchStart"
+										@touchmove.stop="itemTouchMove" @touchend.stop="itemTouchEnd"
+										@touchcancel.stop="itemTouchCancel"></view>
+									<!-- 边框 -->
+									<view v-if="item.type == 0 ">
+										<view v-if="item.activeedge"
+											:style="{transform: item.typetext =='left' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+											class='left_edge-wrap' :data-id='item.id'
+											@touchstart.stop.prevent="edgeStart($event, 'left')"
+											@touchend.stop.prevent='edgeEnd'>
+											<view class='left_edge'>
+												<image src="../../static/image/icon_sticker_left_tailoring.png"
+													mode="aspectFill" style="width: 37upx; height: 50upx;margin: auto">
+												</image>
+											</view>
+										</view>
+										<view v-if="item.activeedge"
+											:style="{transform: item.typetext =='top' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+											class='topedge-wrap' :data-id='item.id'
+											@touchstart.stop.prevent="edgeStart($event, 'top')"
+											@touchend.stop.prevent='edgeEnd'>
+											<view class='topedge'>
+												<image src="../../static/image/icon_sticker_top_tailoring.png"
+													mode="aspectFill" style="width: 50upx; height: 37upx; margin: auto">
+												</image>
+											</view>
+										</view>
+										<view v-if="item.activeedge"
+											:style="{transform: item.typetext =='right' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+											class='rightedge-wrap' :data-id='item.id'
+											@touchstart.stop.prevent="edgeStart($event, 'right')"
+											@touchend.stop.prevent='edgeEnd'>
+											<view class='rightedge'>
+												<image src="../../static/image/icon_sticker_right_tailoring.png"
+													mode="aspectFill" style="width: 37upx; height: 50upx;margin: auto">
+												</image>
+											</view>
+										</view>
+										<view v-if="item.activeedge"
+											:style="{transform: item.typetext =='bottom' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+											class='bottomedge-wrap' :data-id='item.id'
+											@touchstart.stop.prevent="edgeStart($event, 'bottom')"
+											@touchend.stop.prevent='edgeEnd'>
+											<view class='bottomedge'>
+												<image src="../../static/image/icon_sticker_buttom_tailoring.png"
+													mode="aspectFill" style="width: 50upx; height: 37upx; margin: auto">
+												</image>
+											</view>
+										</view>
+									</view>
+									<!-- 四角 -->
+									<view v-if="item.activehorn" class='frame-left-top-wrap'
+										:style="{transform: item.typetext =='left-top' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+										:data-id='item.id' @touchstart.stop.prevent="scaleStart($event, 'left-top')"
+										@touchend.stop.prevent='scaleEnd'>
+										<view v-if="item.support_zoom == 1" class='frame-left-top'
+											:style="{'border-left-color':  item.typetext =='left-top' ? '#F56364' : '#1784D8', 'border-top-color':  item.typetext =='left-top' ? '#F56364' : '#1784D8'}">
+										</view>
+									</view>
+									<view v-if="item.activehorn" class='frame-right-top-wrap'
+										:style="{transform: item.typetext =='right-top' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+										:data-id='item.id' @touchstart.stop.prevent="scaleStart($event, 'right-top')"
+										@touchend.stop.prevent='scaleEnd'>
+										<view v-if="item.support_zoom == 1" class='frame-right-top'
+											:style="{'border-right-color':  item.typetext =='right-top' ? '#F56364' : '#1784D8', 'border-top-color':  item.typetext =='right-top' ? '#F56364' : '#1784D8'}">
+										</view>
+									</view>
+									<view v-if="item.activehorn" class='frame-left-bottom-wrap'
+										:style="{transform: item.typetext =='left-bottom' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+										:data-id='item.id' @touchstart.stop.prevent="scaleStart($event, 'left-bottom')"
+										@touchend.stop.prevent='scaleEnd'>
+										<view v-if="item.support_zoom == 1" class='frame-left-bottom'
+											:style="{'border-left-color':  item.typetext =='left-bottom' ? '#F56364' : '#1784D8', 'border-bottom-color':  item.typetext =='left-bottom' ? '#F56364' : '#1784D8'}">
+										</view>
+									</view>
+									<view v-if="item.activehorn" class='frame-right-bottom-wrap'
+										:style="{transform: item.typetext =='right-bottom' ? 'scale(' + 1/item.scale*1.5 + ')' :'scale(' + 1/item.scale + ')'}"
+										:data-id='item.id' @touchstart.stop.prevent="scaleStart($event, 'right-bottom')"
+										@touchend.stop.prevent='scaleEnd'>
+										<view v-if="item.support_zoom == 1" class='frame-right-bottom'
+											:style="{'border-right-color':  item.typetext =='right-bottom' ? '#F56364' : '#1784D8', 'border-bottom-color':  item.typetext =='right-bottom' ? '#F56364' : '#1784D8'}">
+										</view>
+									</view>
+									<!-- 图片旋转 -->
+									<view v-if="item.activescale"
+										:class="[item.typetext =='rotate' ? 'rotate-red' : 'rotate']"
+										style="transform-origin:center;" :style="{transform: item.typetext =='rotate' ? 'scale(' + item.oScale * 1.5 + ')' : 'scale(' + item.oScale + ')',
+									 top: item.height + 20 - (28 - 28*(item.typetext == 'rotate' ? item.oScale * 1.5 : item.oScale))/2 + 'px'}"
+										:data-id='item.id' @touchstart.stop.prevent='rotateStart'
+										@touchmove.stop.prevent='rotateMove' @touchend.stop.prevent='rotateEnd'>
+									</view>
+									<!-- 辅助线 -->
+									<view v-if="item.activeguide" style="border-left: 1px dashed #F56364; 
+									 height: 100%;position: absolute; top: 0; z-index: 999; bottom: 0;"
+										:style="{left: ((item.width / 2) - 0.5) +'px',
+									 transform:'scale(' + item.oScale + ')',height:100 * item.scale + '%',top: (- 100 * (item.scale - 1))/2 + '%'}"></view>
+									<view v-if="item.activeguide" style="width: 100%; border-top: 1px dashed #F56364;
+									 position: absolute;z-index: 999;"
+										:style="{top: ((item.height / 2) - 0.5) +'px',
+									 transform:'scale(' + item.oScale + ')',width:100 * item.scale + '%',left: (- 100 * (item.scale - 1))/2 + '%'}">
+									</view>
+								</view>
+							</view>
+						</block>
+					</view>
+				</view>
+
+				<!-- 计算字体大小 -->
+				<view class='item-box' style='top:-1000px;left:-1000px;'>
+					<view class='item-box-in'
+						:style="{width:data.editorWidth + 'px' ,height: data.itemList[data.cidx].height +'px'}"
+						style="text-align: center;">
+						<view id="item-text" class="item-text" :style="{'font-weight': data.itemList[data.cidx].font_style ,
+						'font-size': data.itemList[data.cidx].font_size+ 'px',color:data.itemList[data.cidx].font_color,
+						'background-color': data.itemList[data.cidx].under_color }"
+							style="margin:auto;white-space:nowrap;display:table;">
+							{{data.itemList[data.cidx].content}}
+						</view>
+					</view>
+				</view>
+				<!-- 上一步、下一步按钮-->
+				<view :animation="functionHide" v-if="!active &&  getStocklist.length <= 1  && !guide_left "
+					style="display: flex;justify-items: center;align-items: center;z-index: 99;position: fixed; bottom: 120upx; opacity: 0;">
+					<view style="overflow: hidden;width: 110upx;height: 110upx;border-radius: 50%;">
+						<image @click.stop='prev' src="../../static/image/icon_back_.png" mode="aspectFill"
+							style="width: 100upx; height: 100upx;"></image>
+					</view>
+					<view style="overflow: hidden;width: 110upx;height: 110upx;border-radius: 50%;"
+						v-if="!active && getStocklist.length <= 1 && !guide_left">
+						<image @click.stop='next' src="../../static/image/icon_nextstep.png" mode="aspectFill"
+							style="width: 100upx; height: 100upx;  margin-left:10upx"></image>
+					</view>
+				</view>
+				<view :animation="functionHide" v-if="!guide_left"
+					style="position: fixed; left:12upx; font-size: 25upx; color: #FFFFFF; bottom: 260upx;opacity: 0;">
+					<view>{{drag_text_context}}</view>
+					<view>{{cutting_text_context}}</view>
+				</view>
+			</view>
+
+			<!-- 拖拽删除图库 -->
+			<view v-if="delete_wrap_state" class="delete-wrap" :class="{'delete-wrap-active':deleteWrap}"
+				:animation="animationData">
+				<view>
+					<image :src="deleteWrap ? '../../static/delete-active.png':'../../static/delete.png'" mode=""
+						style="width: 42upx; height: 42upx; margin: auto;"></image>
+					<view>{{deleteWrap ? '松开即可删除':'拖到此处可删除'}}</view>
+				</view>
+			</view>
+
+			<!-- 切换手机弹框 -->
+			<switchBrands ref="switchBrands" @goodsbrands="goodsbrands" @toCustomSize="toCustomSize()"></switchBrands>
+
+			<!-- 图片提示 -->
+			<view v-if="showone">
+				<view
+					style="position: fixed; z-index:999; width: 100%; height: 100%; background:rgba(0,0,0,0.6); top: 0;"
+					@click.stop="showone = !showone"></view>
+				<view style="position: fixed; background: #FFFFFF; top:calc((100% - 621upx) / 2); left:calc((100% - 560upx) / 2); 
+				        z-index:1000; width: 560upx; min-height: 621upx; border-radius: 12upx;">
+					<image style="width: 560upx; height: 298upx; display: block;margin: auto;"
+						src="../../static/image/remind_picture.png" mode="aspectFill"></image>
+					<view v-if="shape_image != '' && data.itemList.length == 0"
+						style="text-align: center; font-size: 28upx; font-weight: 500; color: #333333; line-height: 45upx; margin-top: 62upx;">
+						效果需要先上传照片才可使用<br>请先上传一张相片
+					</view>
+					<view v-else
+						style="text-align: center; font-size: 28upx; font-weight: 500; color: #333333; line-height: 45upx; margin-top: 62upx;">
+						请选择手机拍摄或尺寸较大的图片<br>以体验最佳冲印效果
+					</view>
+					<view @click="selectPicturePop()" style="width: 466upx; height: 82upx; background: #854AC2; border-radius: 10upx; font-size: 36upx; font-weight: 400; 
+					 color: #FFFFFF; text-align: center; line-height: 82upx; margin: 46upx auto 46upx; ">好的</view>
+				</view>
+			</view>
+			<!-- 进度条 -->
+			<view v-if="percent > 0 && percent < 100"
+				style="position: fixed; z-index:999; width: 100%; height: 100%; background:rgba(0,0,0,0.6); top: 0;">
+				<view style="position: absolute; top: 0; bottom: 0;margin: auto; top: 30%; width: 100%;">
+					<view style="text-align: center; margin:0 0 30upx; color: #FFFFFF; font-size: 28upx;">图片上传中...
+					</view>
+					<ProgressBar :Width="percent" Type="candy"></ProgressBar>
+				</view>
+			</view>
+			<!-- 菜单栏目  -->
+			<view v-if="!active && !guide_left" class="toolRight" :animation="functionHide" style="opacity: 0;">
+				<view class="tool_li">
+					<view class="tool_li" @click="showPopup(99)">
+						<image class="tool_li_img" src="../../static/icon/icon_history_image.png" mode=""></image>
+						<view class="tool_li_text">历史作品</view>
+					</view>
+					<view class="tool_li" @click="showPopup(23)" v-if="surface_type != 1">
+						<image class="tool_li_img" src="../../static/icon/icon_form.png" mode=""></image>
+						<view class="tool_li_text">手机壁纸</view>
+					</view>
+					<view class="tool_li" @click="showPopup(2)">
+						<image class="tool_li_img" src="../../static/icon/icon_stickers.png" mode=""></image>
+						<view class="tool_li_text">贴图素材</view>
+					</view>
+					<view class="tool_li" @click="showPopup(24)" v-if="surface_type != 1">
+						<image class="tool_li_img" src="../../static/icon_make_diy_uplaod_image.png" mode="">
+						</image>
+						<view class="tool_li_text">背景底色</view>
+					</view>
+					<!-- v-if="system_config.phone_diy.value == 1 && surface_type != 1 && diy_upload_menu == 1" -->
+					<view class="tool_li" @click="showone = !showone">
+						<image @click="cancel('share')" class="tool_li_img"
+							src="../../static/icon_make_diy_back_color.png" mode=""
+							style="	width: 64upx;height: 60upx;"></image>
+						<view @click="cancel('share')" class="tool_li_text">上传相片</view>
+					</view>
+					<view class="tool_li" @click="showPopup(3)"
+						v-if="system_config.phone_diy.value == 1 && surface_type != 1">
+						<image class="tool_li_img" src="../../static/icon/icon_typeface.png" mode=""></image>
+						<view class="tool_li_text">添加文字</view>
+					</view>
+					<!-- 添加涂鸦 -->
+					<view class="tool_li" @click="ontuya()"
+						v-if="system_config.phone_diy.value == 1 && surface_type != 1">
+						<image class="tool_li_img" src="../../static/tuya.png" mode=""></image>
+						<view class="tool_li_text">添加涂鸦</view>
+					</view>
+					<view class="tool_li" @click="wallpaperOnclick()" v-if="machine_id && surface_type != 1">
+						<image class="tool_li_img" style="width: 67upx; height: 56upx;"
+							src="../../static/randomwallpaper.png" mode=""></image>
+						<view class="tool_li_text">智能推荐</view>
+					</view>
+				</view>
+			</view>
+
+			<tuya ref="tuya" @tuyaimg="tuyaimg"></tuya>
+
+			<!-- 编辑文字跟图片按钮 -->
+			<view v-if="active && !guide_left" style="position: fixed;bottom: 450upx;right: 30upx;">
+				<view style="width: 100%;height: 130upx;">
+
+					<!-- 点击画布区域取消聚焦 -->
+					<view style="width: 100%;height: 110upx;" @click.stop="itemCancel">
+						<image style="width: 51upx; height: 51upx;display: block; margin: auto;"
+							src="../../static/icon_confirm.png" mode=""></image>
+					</view>
+
+					<!-- AI图像 -->
+					<view v-if="data.itemList.length > 0">
+						<view style="height: 120upx;width: 100%;" @click="showAiChange()"
+							v-if="data.itemList[data.cidx].type == 0 && data.itemList[data.cidx].isUpLoadImage">
+							<image class="tool_li_img" style="width: 50upx; height: 38upx;"
+								src="../../static/icon_diy_ai.png"></image>
+							<view class="tool_li_text" style="color: #fff;margin-top: 5upx;">AI图像</view>
+						</view>
+					</view>
+
+					<!-- 编辑 -->
+					<view v-if="data.itemList.length > 0">
+						<view style="width: 100%;height: 110upx; margin-top: 15upx;"
+							v-if="data.itemList[data.cidx].type == 1" @click="showPopup(4)">
+							<image style="width: 54upx; height: 54upx;display: block;margin: auto;"
+								src="../../static/icon/diy_icon_editor_default.png" mode=""></image>
+							<view style="text-align: center;color: #FFFFFF;font-size: 22upx;margin-top: 10upx;">编辑文字
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!-- 切换手机 :style="{ top: textHeight + 'px'}"-->
+			<view :animation="functionHide" v-if="!active && !guide_left  " @click="topagecategory(0)"
+				style="z-index: 99;position: fixed; left: 12upx; opacity: 0; top: 200upx;">
+				<image style="width: 120upx; height: 150upx; display: block; margin: auto;"
+					src="../../static/qiehuan.png" mode=""></image>
+			</view>
+
+			<view :animation="functionHide" class="toolLeft" style="margin-left: 10upx;" @click.stop="removedeleteItem"
+				v-if="data.itemList.length > 0 && !guide_left">
+				<image style="	width: 50upx;
+				height: 50upx;
+				display: block;
+				margin: auto;" src="../../static/diy_icon_middle_default.png" mode=""></image>
+				<view style="text-align: center;
+				color: #F56364;
+				font-size: 20upx;
+				margin-top: 10upx;">移除图片</view>
+			</view>
+			<view :animation="functionHide" class="toolLeft" style="margin-left: 10upx; margin-top: 130upx"
+				v-if="(background_color && background_color != 'none') && (surface_type == 0 || surface_type == 2) && !guide_left"
+				@click.stop="eliminateBackgroundColor()">
+				<image style="width: 50upx;
+				height: 50upx;
+				display: block;
+				margin: auto;" src="../../static/diy_icon_replace_default.png" mode=""></image>
+				<!-- class="tool_li_text" -->
+				<view style="text-align: center;
+				color: #F56364;
+				font-size: 20upx;
+				margin-top: 10upx;">清空底色</view>
+			</view>
+
+			<view v-if="!guide_left" class="toolBottom" :animation="functionHide" style="opacity: 0;">
+				<view @click.stop="createWorks" hover-class="hover-class-bg"
+					:class="['tool_add',available == 0 ? 'grey' : '']"> {{createWorkstext}} </view>
+			</view>
+
+			<!-- 文本字体 -->
+			<uni-popup ref="textsettingsshare" type="bottom" @change="change" style="position: fixed; z-index: 9999;">
+				<view class="uni-share" style="width: 100%; height: 600upx;background: #292933;"
+					v-if="e_active == 3 || e_active == 4">
+					<textsettings @textInput='textInput' @cancel="cancel" @workcolor="workcolor"
+						@workweight="workweight" @bgtextcolor="bgtextcolor" @typefaceClick="typefaceClick"
+						ref="textsettingstwo">
+					</textsettings>
+				</view>
+			</uni-popup>
+			<!-- 文本,贴图,相框 1模板 2贴图 3字体 4编辑 22添加相框 -->
+			<uni-popup ref="showshare" :type="type" @change="change"
+				style="position: relative; z-index: 9998; width: 100%;" :style="{height: data.windowHeight +'px'}">
+				<!-- 文本 -->
+				<view v-if="e_active == 3 || e_active == 4" class="uni-share full-width"
+					:style="{height: data.windowHeight +'px'}">
+					<view
+						style="position: fixed; bottom: 0; left: 0; width: 100%; height: 100%; z-index: 997; opacity: 0.8;"
+						@click="cancel('share')"></view>
+					<view style="position: fixed; bottom: 0; left: 0; width: 100%; height: 25%; z-index: 999;">
+						<textsettings @textInput='textInput' @cancel="cancel" @workcolor="workcolor"
+							@workweight="workweight" @bgtextcolor="bgtextcolor" @typefaceClick="typefaceClick"
+							@typefaceshow="typefaceshow" ref="textsettings">
+						</textsettings>
+					</view>
+				</view>
+				<!-- 贴图、模板形状 -->
+				<view v-if="e_active == 2 || e_active == 23 || e_active == 99 ||  e_active == 24"
+					class="uni-share full-width" :style="{height: data.windowHeight +'px'}">
+					<!-- 遮罩 -->
+					<view
+						style="position: absolute; bottom: 0; left: 0; height: 100%; width: 100%; z-index: 997; opacity: 0.8;"
+						@click="cancel('share')" />
+					<!-- <view style="position: absolute; bottom: 0upx; left: 0; height: 100%; width: calc(100% - 120upx); z-index: 998; background: linear-gradient(0deg, #1B294F, #4E2761, #E73231); opacity: 0.8;"></view> -->
+					<view
+						style="position: absolute; bottom: 0upx; left: 0; height: 100%; width: 120upx; z-index: 999; background: #1A1D33; overflow: hidden;">
+						<view style="width: 120upx; height: 188upx;">
+						</view>
+						<!-- 一级分类 -->
+						<view style="width: 120upx;" :style="{height: (data.windowHeight - 188 * data.pixelRate) +'px'}"
+							v-if="e_active == 2 || e_active == 23 || e_active == 99">
+							<scroll-view class="scroll-container"
+								:style="{height: (data.windowHeight - 188 * data.pixelRate) +'px'}" scroll-y
+								scroll-with-animation v-if="brands.length > 0" :scroll-into-view="'s' + currentIndex">
+								<view :class="['scroll-item', { activeone: index == currentId }]" :id="'s' + index"
+									:style="{background: index == currentId  ? '#282932':''}"
+									v-for="(item, index) in brands" :key="index" @tap="handleScroll(index,item)">
+									<image
+										style="width: 60upx; height: 60upx; display: block;margin:auto; padding: 18upx;"
+										:src="index == currentId ? item.icon_click : item.icon" mode="aspectFill">
+									</image>
+									<view v-if="item.update_flag == 1" style="width: 20upx; height: 20upx; 
+	                                  margin-left: 80upx;
+								      background: #ff0000; 
+								       z-index:10;
+								       border-radius: 50%;
+									   margin-top: -80upx;
+								       position: absolute;">
+									</view>
+								</view>
+							</scroll-view>
+						</view>
+					</view>
+					<view style="position: absolute; bottom: 0upx; left: 120upx; height: 100%; width: calc(100% - 240upx); z-index: 999; overflow: hidden; background: #282932;">
+						<!-- 轮播图 -->
+						<view style="position: relative; width: calc(100% - 30upx); z-index: 99; margin:30upx auto;">
+							<swiper :autoplay="true" :interval="3000" :duration="1000" :indicator-dots="true"
+								:indicator-active-color="'#ffffff'"
+								style="height: 165upx; width: 100%; border-radius: 10upx; overflow: hidden; margin:auto;">
+								<swiper-item v-for="(item, index) in Adlists" :key="index" class="full-width">
+									<image :src="item.content + '?x-oss-process=image/resize,lfit,w_375'"
+										mode="aspectFill" class="full-width full-height"
+										style="border-radius: 10upx; background: #007AFF;">
+									</image>
+								</swiper-item>
+							</swiper>
+						</view>
+
+						<!-- 二级分类 -->
+						<view id="classification" v-if="e_active == 2 || e_active == 23 "
+							style="width: 100%; position: relative; z-index: 99;">
+							<view style="overflow: hidden;" v-if="material_series_list.length > 0">
+								<view
+									:class="['material-series-scroll-item', { 'material-series-scroll-item-active': item.id == material_series_currentId }]"
+									:id="'s' + index" v-for="(item, index) in material_series_list" :key="index"
+									@tap="material_series_handleScroll(index,item)">
+									{{item.title}}
+								</view>
+							</view>
+						</view>
+						<scrollList v-if="e_active == 2 || e_active == 23  || e_active == 99" ref="scrollList"
+							@Worksdetail="Worksdetail"
+							:windowHeight="(data.windowHeight - 210 * data.pixelRate - classificationHeight)">
+						</scrollList>
+						<!-- 背景颜色 -->
+						<bgColor v-if="e_active == 24 && backgroundColor" ref="bgColor"
+							@bgColorAssembly="bgColorAssembly"
+							:windowHeight="(data.windowHeight - 210 * data.pixelRate - classificationHeight)">
+						</bgColor>
+					</view>
+				</view>
+			</uni-popup>
+
+			<!-- 上传照片选项 -->
+			<uni-popup ref="showpicture" type="bottom" @change="change" style="position: fixed; z-index: 9999;">
+				<view class="uni-share"
+					style="width: 100%; height: 420upx;background: #FFFFFF;text-align: center; border-top-left-radius: 20upx; border-top-right-radius: 20upx; ">
+					<view @click.stop='addItemFromCamera'
+						style="color: #333333; font-size: 35upx; height:100upx;padding-top: 30upx;">
+						拍照
+					</view>
+					<view @click.stop='addItemFromAlbum'
+						style="color: #333333; font-size: 35upx;border-top: 1upx solid #ebebeb; height:100upx;padding-top: 30upx;">
+						上传手机相片
+					</view>
+					<view
+						style="color: #333333; font-size: 35upx; height: 100upx;padding-top: 30upx; border-top: 1upx solid #ebebeb;"
+						@click.stop='addItemFromeWx'>
+						导入微信照片
+					</view>
+					<view
+						style="color: #333333; font-size: 35upx; height: 100upx;padding-top: 30upx; border-top: 20upx solid #ebebeb"
+						@click="selectPicturePopColse()">
+						取消
+					</view>
+				</view>
+			</uni-popup>
+
+			<!-- Ai转换 -->
+			<uni-popup ref="showAiChange" type="center" style="position: fixed; z-index: 9999; ">
+				<view style="height: 950upx;border-radius:20upx; background: #fff;width: 600upx;">
+					<image src="../../static/img/icon_close_image.png" style="width: 30upx;
+					  padding: 30upx; 
+					  position: absolute; 
+					  right:0; 
+					  top:0;
+					  z-index: 999;" mode="widthFix" @click="showAiChangeClose()">
+					</image>
+					<view style="height: 360upx; padding-top: 80upx;width: 100%;
+					align-items: center;
+					display: flex;
+					flex-direction: row; 
+					justify-content: center;">
+						<view style="align-items: center;">
+							<image style="width:160upx;height:160upx;" src="../../static/icon_diy_anime_style.png"
+								@click="showAiChangeType(1)"></image>
+							<view style="width:160upx;height:160upx;text-align: center;line-height: 160upx;">动漫风格
+							</view>
+						</view>
+						<view style="align-items: center;margin-left: 100upx;">
+							<image style="width:160upx;height:160upx; " src="../../static/icon_diy_sketch_style.png"
+								@click="showAiChangeType(2)"></image>
+							<view style="width:160upx;height:160upx;text-align: center;line-height: 160upx;">素描风格
+							</view>
+						</view>
+					</view>
+					<view style="height: 360upx; padding-top: 40upx;width: 100%;
+					align-items: center;
+					display: flex;
+					flex-direction: row; 
+					justify-content: center;">
+						<view style="align-items: center;margin-left: 20upx;">
+							<image style="width:160upx;height:160upx; " src="../../static/icon_diy_matting_style.png"
+								@click="showAiChangeType(3)"></image>
+							<view style="width:160upx;height:160upx;text-align: center;line-height: 160upx;">人像抠图</view>
+						</view>
+						<view style="align-items: center;margin-left: 100upx;">
+							<image style="width:160upx;height:160upx; " src="../../static/icon_diy_enhance_style.png"
+								@click="showAiChangeType(4)"></image>
+							<view style="width:160upx;height:160upx;text-align: center;line-height: 160upx;">色彩增强</view>
+						</view>
+					</view>
+					<view style="font-size: 30upx;color:#333; width:100%;text-align: center;margin: auto;">选中的图片必须带有清晰人物头像</view>
+				</view>
+			</uni-popup>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import Env from '@/util/Env.js';
+	import http from '@/util/http.js';
+	import WxTouchEvent from "@/util/wx-touch-event";
+	import loadFont from '@/util/loadFont.js' // 封装字体加载
+	import userService from '@/service/UserService';
+	import homeservice from '@/service/homeservice.js';
+	import kpsImageCutter from "@/components/ksp-image-cutter/ksp-image-cutter.vue"; // 截取图片
+	import tColorPicker from '@/components/t-color-picker/t-color-picker.vue' //手机壳背景颜色
+	import ProgressBar from '@/components/Progress-Bar/Progress-Bar.vue'; // 上传图片进度条
+	import scrollList from './components/scrollView.vue'; // 贴图
+	import textsettings from './components/textsettings.vue'; // 文本弹框
+	import switchBrands from './components/switchBrands.vue'; // 手机壳
+	import tuya from './tuya.vue'; // 
+	import uniPopup from './common/uni-popup/uni-popup.vue';
+	import myhead from './head/head.vue'; // 页眉
+	import Signin from '../index/Signin.vue'; // 登录弹框
+	import drag from './js/drag.js' // 封装核心代码
+	import firework from '@/components/ay-firework/firework.vue'; //礼花
+	import bgColor from './components/bgColor.vue'; //手机壳颜色
+	import client from '../../util/script.js' // 封装全局变量
+	import {Base64} from "js-base64"
+	import CryptoJS from 'crypto-js';
+
+	/*** 色彩公园图片 DIY 功能页*/
+	var app = getApp(); // 当前APP实例
+	var items = []; // 当前显示的图片列表
+	var index = 0; // 所点击的图片的索引
+	var maxFontSize = 50;
+	var heightRate = 1.48;
+	var snapshot = []; // 操作历史记录
+	var snapshotIndex = -1;
+	var infoListTouchEvent = new WxTouchEvent(); //在 Page外实例化函数,可以直接复制给 Page 中的回调函数
+	var isclick = true
+	
+	export default {
+		components: {
+			uniPopup,
+			kpsImageCutter,
+			myhead,
+			ProgressBar,
+			scrollList,
+			Signin,
+			textsettings,
+			switchBrands,
+			tColorPicker,
+			firework,
+			bgColor,
+			tuya
+		},
+		computed: {},
+		data() {
+			return {
+				collection_currentId: 0, //点赞选中Id
+				collection_currentIndex: null, //点赞选中坐标
+				wallpaper_currentId: 0, //壁纸选中Id
+				wallpaper_currentIndex: null, //壁纸选中坐标
+				wallpaper_material_series_currentId: null, //壁纸系列选中
+				mapping_currentId: 0, //贴图选中Id
+				mapping_currentIndex: null, //贴图选中坐标
+				mapping_material_series_currentId: null, //贴纸系列选中
+				isHasClick: false, //刚开始进来判断所有按钮是否能点击
+				isCanHandsScan: false, //是否双手指缩放
+				drag_text_context: "单机可选中",
+				cutting_text_context: "双击可裁剪",
+				isShowMoveMaterial: true, //移动不显示材质
+				isShowGif: false, //是否显示Gif图片
+				classificationHeight: 0,
+				backgroundColor: false, //控制底色
+				Adlists: [],
+				diy_backList: [],
+				diy_bannerList: [],
+				system_config: null, //控制是否上传图片
+				getStocklist: [], //查询货到库存
+				type: '',
+				content: '底部弹出 popup',
+				active: false,
+				currentId: 0,
+				/* 控制被选中 */
+				currentIndex: null,
+				/* 控制位置 */
+				currentId_Works: 0,
+				/* 控制被选中 */
+				currentIndex_Works: null,
+				/* 控制位置 */
+				currentId_Material: 0,
+				/* 控制被选中 */
+				currentIndex_Material: null,
+				/* 控制位置 */
+				currentId_wallpaper: 0,
+				/* 控制被选中 */
+				currentIndex_wallpaper: null,
+				/* 控制位置 */
+				material_series_currentId: null,
+				/* 控制被选中 */
+				brands: [],
+				e_active: null, //判断弹框是贴图还是文本 1模板 2贴图 3字体 4编辑 22添加相框
+				addtext: false, //判断加减文字
+				bg_text_color: false, //判断加减文字
+				showone: false, //判断图片弹框
+				Works_category: [], //作品分类
+				Works_category_id: null, //作品选中分类id
+				Works_categorydatalist: [], //作品分类作品列表
+				Material_category: [], //贴图分类
+				Material_category_id: null, //贴图选中分类
+				Material_categorydatalist: [], //贴图分类贴图列表
+				wallpaper_category: [], //壁纸分类
+				wallpaper_category_id: null, //壁纸选中分类
+				wallpaper_categorydatalist: [], //壁纸列表
+				material_series_list: [], //二级分类
+				datalist: [], //作品、贴图列表
+				queryPage: {
+					s: '',
+					page: 1, //分页
+					per_page: 40, //分页
+					is_revise: '1', //可调整
+					is_edit: '1', //模板属性
+					machine_id: null, //设备id
+					goods_category_id: null, //星形接口列表增加,产品分类参数
+					works_category_id: null, //作品选中分类id
+					material_category_id: null, //贴图壁纸选择值一级分类
+					material_series_id: null, //贴图壁纸选择值二级分类
+					is_new: null, //最新
+					is_hot: null, //热门
+					goods_id: null, //商品id
+					is_under: 0, //贴图是否为背景图
+					partner_id: null
+				},
+				works_id: null, //作品id
+				createWorkstext: '生成',
+				machine_id: null, //设备id
+				key: null, //1直营配送站 2 万能通用版 3色彩自助站
+				sn: null,
+				design_color: '#131319',
+				mix_scale: 1, //图片比率
+				design_width: 280,
+				design_height: 380,
+				print_height: 380,
+				design_widthrate: 1, //宽度比率
+				design_heightrate: 1, //高度比率
+				guide_left: false, //辅助线
+				guide_top: false, //辅助线
+				editor_top: 0, //辅助线距离
+				center_scale: 0, //设计区中心点比率
+				location_scale: 0, //辅助线距离
+				editory: null, //设计区距离
+				lastTapTime: 0, //判断点击时间间隔
+				properties: {}, //剪切数据
+				state: false,
+				isRotate: false, // 是否是旋转
+				data: {
+					user_id: null, //用户id
+					goods_id: 1, //背景图id
+					template: null, //源作品id
+					template_price: null, //源作品sales_price
+					template_user_id: null, //源作品user_id
+					works_idlenght: 0, //模板个数
+					windowWidth: 0, // 屏幕宽度
+					windowHeight: 0, // 屏幕高度
+					editorWidth: 0, // 设计宽度
+					editorHeight: 0, // 设计高度
+					bgImage: '', // 背景图
+					bgWidth: 0, // 画布宽度
+					bgHeight: 0, // 画布高度
+					pixelRate: null,
+					listActive: true,
+					currentText: '',
+					cidx: 0,
+					itemList: [],
+					loadbgImageheight: '100%',
+					loadbgImageheightstate: false, //白底图
+				},
+				titlename: "", //自定义头部
+				loading: null,
+				percent: 0, //进度条
+				shape_image: '', //形状图片
+				shape_id: '', //形状id 
+				shape_price: '', //形状价格
+				dict_id: null, //手机壳属性字典id
+				goods_id: null, //手机壳属性字典id
+				goods_size: null, //手机壳属性字典id
+				front_image_long: false, //记录产品详情数据是否加载已完成
+				available: 1, //根据设备是否禁用下订单 0禁用下单 1默认
+				support_pay: null, //单机版是否支付 0不需要支付 1需要支付
+				textHeight: null, //设备头部高度
+				background_color: null, //手机壳底色
+				background_surface_color: null, //定制壳手机壳底色
+				background_surface_image: null, //定制壳手机壳底色
+				tColorPicker_color: {
+					r: 0,
+					g: 0,
+					b: 0,
+					a: 1
+				},
+				animationData: {},
+				animation: null,
+				deleteTop: 0,
+				deleteWrap: false, //拖拽删除图库
+				delete_wrap_state: true, //拖拽删除图库
+				translateX: -400,
+				translateXState: 1,
+				translateLeft: null,
+				translateHide: null,
+				functionHide: null,
+				transformscale: 1, //整体缩小
+				functionScale: null, //整体缩小
+				isReady: false, //礼花
+				orderUpdateTime: null,
+				titleHeight: 0,
+				surface_type: 0, //材质类型 0:默认 1:自带壳 2:定制壳
+				surfaceName: null,
+				isComeDelivery: false, //是否默认进入配送订单
+				headheight: 0, //头部高度
+				machineDetail: null, //设备详情
+				diy_upload_menu: 1,
+				isCustomize: false, //是否自定义产品
+				isCustomizeComplete: false, //是否自定义进来
+				pixel_scale: 1, //比例
+				options: {},
+				pixelScale: 0.5, //默认像素比例0.5
+				filletSize: 0, //圆角大小
+				real_print_width: 0, //打印宽度
+				real_print_height: 0, //打印高度
+				clipLeft: 0, //裁剪左边距
+				clipRight: 0, //裁剪右边距
+				clipTop: 0, //裁剪上边距
+				clipButtom: 0, //裁剪上边距
+				getComeSizeData: null, //获取自定义参数
+				isUpLoadImage: false, //是否上传图片
+				customize_size_id: "", //自定义产品Id
+				history_bannerList: [], //历史作品banner
+				baseSetting: null, //获取开关信息
+				loadImageFailCount: 0
+			};
+		},
+
+		created() { //设备信息
+			let app = uni.getSystemInfoSync(); //设备信息
+			let menuButtonInfo = uni.getMenuButtonBoundingClientRect(); //胶囊信息
+			this.textHeight = app.statusBarHeight + menuButtonInfo.height + (menuButtonInfo.top - app.statusBarHeight) * 2
+		},
+
+		methods: {
+			 
+			/**
+			 * 读取图片失败操作
+			 * @param e object 事件
+			 * @return void
+			 */
+			loadbgImageError(e) {
+				this.data.loadbgImageheightstate = true
+			},
+
+			showAiChangeClose() {
+				this.selectChangeType = 1;
+				this.$refs["showAiChange"].close();
+			},
+
+			//显示Ai转换
+			showAiChange() {
+				this.selectChangeType = 1;
+				this.$refs["showAiChange"].open();
+			},
+
+			showAiChangeType(type) {
+				this.selectChangeType = type
+				this.changeHumanPortrait();
+			},
+
+			//人画像
+			changeHumanPortrait() {
+				var item = this.data.itemList[this.data.cidx];
+				if (item == null) {
+					return
+				}
+				let imageUrl = item.content + "?x-oss-process=image/resize,lfit,w_1000";
+				if (item.isChangeAi) {
+					imageUrl = item.contentOld + "?x-oss-process=image/resize,lfit,w_1000";
+				}
+				uni.showLoading({
+					title: 'AI图像处理中...',
+					mask: true
+				})
+				setTimeout(function() {
+					uni.hideLoading();
+				}, 6000);
+				let that = this;
+				this.getOssStsToken(function(result) {
+					wx.downloadFile({
+						url: imageUrl,
+						success: function(res) {
+							if (res.statusCode === 200) {
+								that.uploadToTempOss(result.Data, res.tempFilePath, ".jpg",
+									function(resultImage) {
+										// if(that.selectChangeType == 3) {
+										// 	that.getStyleChange(resultImage)
+										// 	return;
+										// }
+										client.callRecognizeBankCard(resultImage, wx, that
+											.selectChangeType,
+											function(result) {
+												uni.hideLoading();
+												if (result.Code) {
+													uni.showToast({
+														icon: "none",
+														title: "处理失败!图片中无清晰的真人头像",
+														duration: 2000
+													});
+												} else {
+													if (result.Data) {
+														let imageURL = result.Data.ImageURL;
+														//console.log(imageURL)
+														// if (that.selectChangeType == 3) {
+														// 	that.getStyleChange(imageURL)
+														// } else {
+														imageURL = imageURL.replace("http:",
+															"https:")
+														if (!item.isChangeAi) {
+															item.contentOld = item.content;
+														}
+														item.content = imageURL;
+														item.isChangeAi = true
+														that.data.itemList[that.data.cidx];
+														// }
+													}
+												}
+												that.$refs["showAiChange"].close();
+											}.bind(this));
+									}
+								);
+							}
+						}
+					})
+				})
+			},
+
+			getOssStsToken(callback) {
+				//这里endpoint为API访问域名,与类目相关,具体类目的API访问域名请参考:https://help.aliyun.com/document_detail/143103.html
+				const endpoint = "viapiutils.cn-shanghai.aliyuncs.com";
+				const Action = "GetOssStsToken";
+				const API_VERSION = "2020-04-01";
+				const API_HTTP_METHOD = "POST";
+				const request_ = {};
+				//系统参数
+				request_["SignatureMethod"] = "HMAC-SHA1";
+				request_["SignatureNonce"] = client.signNRandom();
+				request_["AccessKeyId"] = "LTAI5tDPiEBZgfqNcWBqaFEc";
+				request_["SignatureVersion"] = "1.0";
+				request_["Timestamp"] = client.getTimestamp();
+				request_["Format"] = "JSON";
+				request_["RegionId"] = "cn-shanghai";
+				request_["Version"] = API_VERSION;
+				request_["Action"] = Action;
+				const url = client.generateUrl(request_, API_HTTP_METHOD, endpoint, "amI84BLFbHz6dhOVbuArrERmeemmnx");
+				wx.request({
+					url: url,
+					method: 'POST',
+					header: {
+						"ContentType": "application/json"
+					},
+					success: (result) => {
+						//获取结果
+						return typeof callback == "function" && callback(result.data)
+					},
+					fail: (error) => {
+						//获取报错信息
+						return typeof callback == "function" && callback(error.data)
+					}
+				})
+				//this.callApi(endpoint, Action, API_VERSION, null, callback);
+			},
+
+
+			// 使用oss-client-sdk进行文件上传
+			uploadToTempOss(ossStsToken, tempFilePath, fileName, callback) {
+				const host = 'https://viapi-customer-temp.oss-cn-shanghai.aliyuncs.com';
+				let formDataParams = this.getFormDataParams(ossStsToken.AccessKeyId, ossStsToken.AccessKeySecret,ossStsToken.SecurityToken);
+				const signature = formDataParams.signature;
+				const ossAccessKeyId = ossStsToken.AccessKeyId;
+				const policy = formDataParams.policy;
+				const key = "LTAI5tDPiEBZgfqNcWBqaFEc" + '/' + this.getNonce(6) + '/' + fileName;
+				const securityToken = formDataParams['x-oss-security-token'];
+				wx.uploadFile({
+					url: host, // 开发者服务器的URL。
+					filePath: tempFilePath,
+					name: 'file', // 必须填file。
+					formData: {
+						'key': key,
+						'OSSAccessKeyId': ossAccessKeyId,
+						'policy': policy,
+						'Signature': signature,
+						'x-oss-security-token': securityToken
+					},
+					success: (res) => {
+						if (res.statusCode === 204 || res.statusCode === '204') {
+							let result = 'https://viapi-customer-temp.oss-cn-shanghai.aliyuncs.com/' + key;
+							callback && callback(result);
+						} else {
+							//console.log('upload error', res);
+						}
+					},
+					fail: err => {
+						//console.log(err);
+					}
+				});
+			},
+
+			//随机字符串
+			getNonce(length) {
+				var str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+				var result = '';
+				for (var i = length; i > 0; --i) {
+					result += str[Math.floor(Math.random() * str.length)];
+				}
+				return result;
+			},
+
+			//计算上传OSS的计算签名
+			getFormDataParams(stsAccessKeyId, stsAccessKeySecret, securityToken) {
+				const date = new Date();
+				date.setHours(date.getHours() + 1);
+				const policyText = {
+					expiration: date.toISOString(), // 设置policy过期时间。
+					conditions: [
+						// 限制上传大小。
+						["content-length-range", 0, 1024 * 1024 * 1024],
+					],
+				};
+				const policy = Base64.encode(JSON.stringify(policyText)) // policy必须为base64的string。
+				const signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(policy, stsAccessKeySecret));
+				const formData = {
+					OSSAccessKeyId: stsAccessKeyId,
+					signature,
+					policy,
+					'x-oss-security-token': securityToken
+				}
+				return formData
+			},
+
+			//获取开关配置
+			machineGetBaseSetting() { // 获取设备是否开启支付、是否开放材质的接口
+				homeservice.machineGetBaseSetting({
+					s: 'Machine.getBaseSetting',
+					machine_id: this.machine_id,
+				}).then(result => {
+					this.baseSetting = result
+				}).catch(err => {
+
+				});
+			},
+
+			//自定义尺寸
+			toCustomSize() {
+				uni.navigateTo({
+					url: '../index/custom-size?machine_id=' + this.machine_id + '&key=' + this.key +
+						"&machineDetail=" + encodeURIComponent(JSON.stringify(this.machineDetail)) +
+						"&isFirstPage=false"
+				})
+				this.$refs['switchBrands'].cancelBrand();
+			},
+
+			oclikGifImage() {
+				this.isShowGif = false;
+			},
+
+			ontuya() {
+				this.$nextTick(() => {
+					this.$refs['tuya'].open({
+						data: this.data
+					})
+				})
+			},
+
+			//添加涂鸦
+			tuyaimg(e) {
+				let index = items.length;
+				items.push({
+					support_zoom: 1, // 0是不支持缩放,为1时支持缩放
+					support_drag: 1, // 0是不支持拖动,为1时支持拖动
+					is_under: 0, //贴图是否为背景图
+					is_discount: 0, //贴图是否用0
+					id: index + 1,
+					type: 2, //0为图片,1为文字,2为素材
+					material_id: 0,
+					original_id: 0,
+					index: index,
+					font_family: '',
+					font_style: '',
+					font_size: '',
+					font_color: '',
+					under_color: '',
+					content: e, // 图片地址
+					top: this.editor_top - this.data.editorHeight / 2, // 初始图片Y坐标,根据画布高/2-图片高/2
+					left: this.data.editorWidth / 2 - this.data.editorWidth /
+						2, // 初始图片X坐标,因为div是相对定位,所以计算是要多减一次移动的距离
+					x: this.data.editorWidth / 2, // 初始圆心位置,可再downImg之后又宽高和初始的图片位置得出
+					y: this.editor_top,
+					scale: 1, // 缩放比例  1为不缩放
+					lastScale: 1, // 上一次的绽放比例
+					oScale: 1, // 缩放比例  1为不缩放
+					angle: 0, // 旋转角度
+					rotate: 0, // 旋转值
+					active: false, // 判定点击状态
+					width: this.data.editorWidth, // 预设生成图片的宽度
+					height: this.data.editorHeight, // 预设生成图片的高度
+					rScale: 1, // 图片原始缩放比例
+					// 新增加默认属性
+					activeguide: false, // 开启辅助线
+					activescale: false, // 开启旋转状态
+					activehorn: false, // 开启角状态
+					activeedge: false, // 开启边状态
+					initialScale: 1, // 图片缩放比例
+					initialscaling: 1, // 图片初始时缩放比例
+					initialScalex: 1, // 图片宽缩放比例
+					initialScaley: 1, // 图片高缩放比例
+					initialWidth: this.data.editorWidth, // 图片原始宽度
+					initialHeight: this.data.editorHeight, // 图片原始高度
+					frame_left: null, // 裁剪窗口x
+					image_left: null, // 图片x
+					frame_top: null, // 裁剪窗口y
+					image_top: null, // 图片y
+				})
+				this.data.itemList = items
+				this.saveSnapshot();
+			},
+
+			ordersize() {
+				uni.navigateTo({
+					url: '../mine/goodsordersize?goods_id=' + this.data.goods_id
+				})
+			},
+
+			eliminateBackgroundColor() {
+				if (this.$base.surfaceData.surface_type == 2) { //定制壳
+					this.background_color = 'none'
+				}
+				if (this.$base.surfaceData.surface_type == 0) { //默认
+					this.background_color = null
+				}
+			},
+
+			// 壁纸推荐
+			wallpaperOnclick() {
+				this.isShowGif = false;
+				var that = this
+				homeservice.queryList({
+					s: 'Material.randomMaterial',
+					machine_id: that.machine_id,
+					goods_id: that.data.goods_id
+				}).then(result => {
+					uni.showLoading({
+						title: '加载中...',
+						mask: true
+					})
+					// 读取主图遮罩
+					uni.getImageInfo({
+						src: result.url,
+						success: (image) => {
+							//清空历史记录
+							items = []; // 当前显示的图片列表
+							index = 0; // 所点击的图片的索引
+							snapshot = []; // 操作历史记录清空
+							snapshotIndex = -1;
+							uni.hideLoading()
+							let index = items.length;
+							let width = 0
+							let height = 0
+							let top = 0
+							let lef = 0
+							let ratio = image.width / image.height
+							let ratiowidth = (that.data.editorWidth * that.mix_scale) / image.width
+							let ratioheight = (that.data.editorHeight * that.mix_scale) / image.height
+							let resultmix_scale = result.mix_scale || 1
+							width = that.data.editorWidth * that.mix_scale * resultmix_scale
+							height = image.height * ratiowidth * resultmix_scale
+							if (result.is_under == 1) { //贴图是否为背景图
+								let number_index = 0
+								for (var item of items) {
+									if (item.is_under == 0) {
+										item.index = item.index + 1;
+									} else if (item.is_under == 1) {
+										number_index++
+									}
+								}
+								index = number_index
+							}
+							items.push({
+								support_zoom: result.support_zoom, // 0是不支持缩放,为1时支持缩放
+								support_drag: result.support_drag, // 0是不支持拖动,为1时支持拖动
+								is_under: result.is_under, //贴图是否为背景图
+								is_discount: result.is_discount, //贴图是否用卷
+								id: items.length + 1,
+								type: 2, //0图片 1文字 2贴图
+								material_id: result.id, //贴图id
+								original_id: result.id,
+								index: index,
+								font_family: '',
+								font_style: '',
+								font_size: '',
+								font_color: '',
+								under_color: '',
+								content: result.url, // 贴图地址
+								top: that.editor_top - height / 2, // 初始图片Y坐标,根据画布高/2-图片高/2
+								left: that.data.editorWidth / 2 - width /2, // 初始图片X坐标,因为div是相对定位,所以计算是要多减一次移动的距离
+								x: that.data.editorWidth /2, // 初始圆心位置,可再downImg之后又宽高和初始的图片位置得出
+								y: that.editor_top,
+								scale: 1, // 缩放比例  1为不缩放
+								lastScale: 1, // 上一次的绽放比例
+								oScale: 1, // 缩放比例  1为不缩放
+								angle: 0, // 旋转角度
+								rotate: 0, // 旋转值
+								active: false, // 判定点击状态
+								width: width, // 预设生成图片的宽度
+								height: height, // 预设生成图片的高度
+								rScale: 1, // 贴图原始缩放比例
+								activeguide: false, // 开启辅助线
+								activescale: false, // 开启旋转状态
+								activehorn: false, // 开启角状态
+								activeedge: false, // 开启边状态
+								// 分界线
+								initialScale: 1, // 图片缩放比例
+								initialscaling: 1, // 图片初始时缩放比例
+								initialScalex: 1, // 图片宽缩放比例
+								initialScaley: 1, // 图片高缩放比例
+								initialWidth: width, // 图片原始宽度
+								initialHeight: height, // 图片原始高度
+								frame_left: null, // 裁剪窗口x
+								image_left: null, // 图片x
+								frame_top: null, // 裁剪窗口y
+								image_top: null, // 图片y
+							})
+							// 提示用户此贴图可用卷
+							if (result.is_discount == '1') {
+								if (that.$base.coupon_flag_desc == '') return;
+								uni.showToast({
+									title: that.$base.coupon_flag_desc,
+									icon: 'none',
+									duration: 2000,
+									mask: false
+								});
+							}
+							//赋值
+							that.data.itemList = items
+							that.saveSnapshot();
+						},
+						fail: function(err) {
+							uni.hideLoading()
+							uni.showToast({
+								title: '暂无智能推荐',
+								icon: 'none'
+							});
+						}
+					})
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+			addItemreplace() { // 替换图片
+				this.replaceimage()
+			},
+			replaceimage() {
+				let item = items[index];
+				var _this = this
+				uni.chooseImage({
+					sizeType: ['original'], //可以指定是original原图还是compressed压缩图,默认二者都有
+					sourceType: ['camera', 'album'], //从相册选择
+					count: 1,
+					success: (res) => {
+						//console.log(res)
+						let tempFilePaths = res.tempFilePaths;
+						var size = res.tempFiles[0].size;
+						var path = res.tempFiles[0].path;
+						var formatImage = path.split(".")[(path.split(".")).length - 1];
+						if (formatImage != "png" && formatImage != "jpg" && formatImage != "jpeg") {
+							return wx.showToast({
+								title: '只能上传.png、.jpg、.jpep 格式',
+								icon: 'none',
+								image: '',
+								duration: 2000,
+								mask: true,
+							})
+						}
+						let machine_id = _this.machine_id || 0
+						let user_id = userService.getUserInfo().id || 0
+						wx.request({
+							url: Env.getDevBaseURL() + '/api/AliossSign/getSign?machine_id=' +
+								machine_id + '&user_id=' + user_id,
+							method: 'GET',
+							data: '',
+							header: {
+								'content-type': 'application/x-www-form-urlencoded',
+								'Accept': 'application/json'
+							},
+							success: function(res) {
+								//这里是进度条
+								_this.percent = 0
+								var atter = res.data
+								let time = new Date().getTime() + Math.floor((Math.random() *
+									1000) + 1)
+								var uploadTask = wx.uploadFile({
+									url: atter.host.replace("http:", "https:"),
+									filePath: tempFilePaths[0],
+									name: 'file',
+									formData: {
+										'key': atter.dir + time + '.jpg',
+										'OSSAccessKeyId': atter.accessid,
+										'policy': atter.policy,
+										'Signature': atter.signature,
+										'success_action_status': '200',
+										'callback': atter.callback,
+									},
+									success: function(res) {
+										//console.log(res)
+										if (res.statusCode != 200) {
+											// console.log({errCode: '599', msg:'其他错误'})
+											return;
+										}
+										if (res.statusCode == 200) {
+											_this.percent = 100
+											uni.showToast({
+												title: '上传成功',
+												icon: 'none',
+												duration: 3000
+											})
+											// console.log(atter.host + '/' + atter.dir +
+											// 	time + '.jpg')
+											uni.getImageInfo({
+												src: tempFilePaths[0],
+												success: (image) => {
+													// 替换图片的算法:
+													// 图片的宽为W1,高为 H1 ,  图片宽高比为: R1 = W1/H1
+													// 外框的宽为W2,高为 H2 ,  外框宽高比为: R2 = W2/H2
+													// 当R1 > R2, 放入的图片宽度要适应外框的宽W2, 图片高度需要裁剪
+													// 当R1 < R2, 放入的图片宽度要适应外框的高H2, 图片宽度需要裁剪
+													let W1 = item.width
+													let H1 = item.height
+													let W2 = image.width
+													let H2 = image.height
+													let R1 = W1 / H1
+													let R2 = W2 / H2
+													// 替换图片,初始值
+													item.image_left = 0
+													item.image_top = 0
+													item.initialScale = 1
+													item.initialscaling = 1
+													item.initialScalex = 1
+													item.initialScaley = 1
+													if (R1 > R2) {
+														item.replace = 1
+														item.content =
+															atter.host +
+															'/' + atter
+															.dir + time +
+															'.jpg'
+														item.initialWidth =
+															item.width
+														item.initialHeight =
+															W1 / W2 * image
+															.height
+														item.image_top = -(
+															W1 / W2 *
+															image
+															.height -
+															H1) / 2
+													} else if (R1 < R2) {
+														item.replace = 1
+														item.content =
+															atter.host +
+															'/' + atter
+															.dir + time +
+															'.jpg'
+														item.initialHeight =
+															item.height
+														item.initialWidth =
+															H1 / H2 * image
+															.width
+														item.image_left = -
+															(H1 / H2 *
+																image
+																.width - W1
+															) / 2
+													} else {
+														item.content =
+															atter.host +
+															'/' + atter
+															.dir + time +
+															'.jpg'
+													}
+													item.type =
+														0 //0为图片,1为文字,2为素材
+													if (item.works_id !=
+														undefined) {
+														if (item.works_id >
+															0) {
+															_this.data
+																.works_idlenght--
+															item.material_id =
+																0
+															item.original_id =
+																0
+															item.works_id =
+																0
+														}
+													} else {
+														item.original_id =
+															0
+														item.material_id =
+															0
+													}
+												}
+											});
+										}
+									},
+									fail: function(err) {
+										wx.showToast({
+											title: '上传失败!',
+											icon: 'none',
+											duration: 1200
+										})
+									},
+									complete: function(err) {
+
+									}
+								})
+								uploadTask.onProgressUpdate((res) => {
+									_this.percent = res.progress - 1
+								})
+							}
+						})
+					}
+				})
+			},
+			/* 上传图片 */
+			addItem: async function(e) {
+				this.showone = false
+				this.isUpLoadImage = true;
+				var _this = this
+				uni.chooseImage({
+					sizeType: ['original'], //可以指定是original原图还是compressed压缩图,默认二者都有
+					sourceType: ['camera', 'album'], //从相册选择
+					count: 1,
+					success: (res) => {
+						//console.log(res.tempFilePaths)
+						let tempFilePaths = res.tempFilePaths;
+						//let tempFilePaths = 'http://ws.colorpark.cn/static/alioss/images/icon_picture.png';
+						var size = res.tempFiles[0].size;
+						var path = res.tempFiles[0].path;
+						var formatImage = path.split(".")[(path.split(".")).length - 1];
+						if (formatImage != "png" && formatImage != "jpg" && formatImage != "jpeg") {
+							return wx.showToast({
+								title: '只能上传.png、.jpg、.jpep 格式',
+								icon: 'none',
+								image: '',
+								duration: 2000,
+								mask: true,
+							})
+						}
+						this.uploadDIY(tempFilePaths, 0, 0, 0, tempFilePaths.length);
+					}
+				})
+			},
+			/* 上传图片拍照 */
+			addItemFromCamera: async function(e) {
+			   //console.log(e);
+				this.showone = false
+				this.isUpLoadImage = true;
+				var _this = this
+				//console.log(e);
+				uni.chooseImage({
+					sizeType: ['original'], //可以指定是original原图还是compressed压缩图,默认二者都有
+					sourceType: ['camera'], //从相册选择
+					count: 1,
+					success: (res) => {
+						this.$refs['showpicture'].close();
+						console.log(res.tempFilePaths)
+						let tempFilePaths = res.tempFilePaths;
+						var size = res.tempFiles[0].size;
+						var path = res.tempFiles[0].path;
+						var formatImage = path.split(".")[(path.split(".")).length - 1];
+						if (formatImage != "png" && formatImage != "jpg" && formatImage != "jpeg") {
+							return wx.showToast({
+								title: '只能上传.png、.jpg、.jpep 格式',
+								icon: 'none',
+								image: '',
+								duration: 2000,
+								mask: true,
+							})
+						}
+						this.uploadDIY(tempFilePaths, 0, 0, 0, tempFilePaths.length);
+					},fail(res) {
+						console.log(res);
+					}
+				})
+			},
+			/* 上传图片从相册 */
+			addItemFromAlbum: async function(e) {
+				this.isUpLoadImage = true;
+				this.showone = false
+				var _this = this
+				uni.chooseImage({
+					sizeType: ['original'], //可以指定是original原图还是compressed压缩图,默认二者都有
+					sourceType: ['album'], //从相册选择
+					count: 1,
+					success: (res) => {
+						this.$refs['showpicture'].close();
+						//console.log(res.tempFilePaths)
+						let tempFilePaths = res.tempFilePaths;
+						// let tempFilePaths = 'http://ws.colorpark.cn/static/alioss/images/icon_picture.png';
+						var size = res.tempFiles[0].size;
+						var path = res.tempFiles[0].path;
+						var formatImage = path.split(".")[(path.split(".")).length - 1];
+						if (formatImage != "png" && formatImage != "jpg" && formatImage != "jpeg") {
+							return wx.showToast({
+								title: '只能上传.png、.jpg、.jpep 格式',
+								icon: 'none',
+								image: '',
+								duration: 2000,
+								mask: true,
+							})
+						}
+						this.uploadDIY(tempFilePaths, 0, 0, 0, tempFilePaths.length);
+					}
+				})
+			},
+			/* 上传图片重微信 */
+			addItemFromeWx: async function() {
+				this.isUpLoadImage = true;
+				this.showone = false
+				var _this = this
+				uni.chooseMessageFile({
+					type: 'image',
+					count: 1,
+					success: (res) => {
+						this.$refs['showpicture'].close();
+						let tempFilePaths = res.tempFiles;
+						var size = res.tempFiles[0].size;
+						var path = res.tempFiles[0].path;
+						tempFilePaths[0] = path;
+						var formatImage = path.split(".")[(path.split(".")).length - 1];
+						if (formatImage != "png" && formatImage != "jpg" && formatImage != "jpeg") {
+							return wx.showToast({
+								title: '只能上传.png、.jpg、.jpep 格式',
+								icon: 'none',
+								image: '',
+								duration: 2000,
+								mask: true,
+							})
+						}
+						this.uploadDIY(tempFilePaths, 0, 0, 0, tempFilePaths.length);
+					},fail: (res)=>{
+						console.log(res)
+					}
+				})
+			},
+			//选择微信相片跟本地相册弹框
+			selectPicturePop() {
+				this.delete_wrap_state = false
+				this.showone = false
+				this.$refs['showpicture'].open()
+			},
+			//选择微信相片跟本地相册弹框取消
+			selectPicturePopColse() {
+				//this.delete_wrap_state = false
+				this.showone = false
+				this.$refs['showpicture'].close();
+			},
+			/* 函数描述:作为上传文件时递归上传的函数体体;
+			 * 参数描述: 
+			 * filePaths是文件路径数组
+			 * successUp是成功上传的个数->0
+			 * failUp是上传失败的个数->0
+			 * i是文件路径数组的指标->0
+			 * length是文件路径数组的长度
+			 */
+			uploadDIY(tempFilePaths, successUp, failUp, i, length) {
+				let machine_id = this.machine_id || 0
+				let user_id = userService.getUserInfo().id || 0
+				var _this = this
+				wx.request({
+					url: Env.getDevBaseURL() + '/api/AliossSign/getSign?machine_id=' + machine_id + '&user_id=' + user_id,
+					method: 'GET',
+					data: '',
+					header: {
+						'content-type': 'application/x-www-form-urlencoded',
+						'Accept': 'application/json'
+					},
+					success: function(res) {
+						//这里是进度条
+						_this.percent = 0
+						var atter = res.data
+						let time = new Date().getTime() + Math.floor((Math.random() * 1000) + 1)
+						var uploadTask = wx.uploadFile({
+							url: atter.host.replace("http:", "https:"),
+							filePath: tempFilePaths[i],
+							name: 'file',
+							formData: {
+								'key': atter.dir + time + '.jpg',
+								'OSSAccessKeyId': atter.accessid,
+								'policy': atter.policy,
+								'Signature': atter.signature,
+								'success_action_status': '200',
+								'callback': atter.callback,
+							},
+							success: function(res) {
+								//console.log(res)
+								successUp++;
+								if (res.statusCode != 200) {
+									return;
+								}
+								if (res.statusCode == 200) {
+									_this.percent = 100
+									uni.showToast({
+										title: '上传成功',
+										icon: 'none',
+										duration: 3000
+									})
+									uni.getImageInfo({
+										src: tempFilePaths[i],
+										success: (image) => {
+											let width = 0
+											let height = 0
+											let top = 0
+											let lef = 0
+											let ratio = image.width / image.height
+											let ratiowidth = (_this.data.editorWidth *
+												_this.mix_scale) / image.width
+											let ratioheight = (_this.data
+													.editorHeight * _this.mix_scale) /
+												image.height
+											width = _this.data.editorWidth * _this
+												.mix_scale
+											height = image.height * ratiowidth
+											if (height / 2 > _this.editor_top) {
+												width = width * (_this.editor_top * 2 /
+													height)
+												height = _this.editor_top * 2
+											}
+											_this.isShowGif = true;
+											let index = items.length;
+											items.push({
+												support_zoom: 1, // 0是不支持缩放,为1时支持缩放
+												support_drag: 1, // 0是不支持拖动,为1时支持拖动
+												is_under: 0, //贴图是否为背景图
+												is_discount: 0, //贴图是否用卷
+												id: index + 1,
+												type: 0, //0为图片,1为文字,2为素材
+												material_id: 0,
+												original_id: 0,
+												index: index,
+												font_family: '',
+												font_style: '',
+												font_size: '',
+												font_color: '',
+												under_color: '',
+												content: atter.host + '/' +
+													atter.dir + time +
+													'.jpg', // 图片地址
+												top: _this.editor_top -
+													height /
+													2, // 初始图片Y坐标,根据画布高/2-图片高/2
+												left: _this.data.editorWidth /
+													2 - width /
+													2, // 初始图片X坐标,因为div是相对定位,所以计算是要多减一次移动的距离
+												x: _this.data.editorWidth /
+													2, // 初始圆心位置,可再downImg之后又宽高和初始的图片位置得出
+												y: _this.editor_top,
+												scale: 1, // 缩放比例  1为不缩放
+												lastScale: 1, // 上一次的绽放比例
+												oScale: 1, // 缩放比例  1为不缩放
+												angle: 0, // 旋转角度
+												rotate: 0, // 旋转值
+												active: false, // 判定点击状态
+												width: width, // 预设生成图片的宽度
+												height: height, // 预设生成图片的高度
+												rScale: 1, // 图片原始缩放比例
+												// 新增加默认属性
+												activeguide: false, // 开启辅助线
+												activescale: false, // 开启旋转状态
+												activehorn: false, // 开启角状态
+												activeedge: false, // 开启边状态
+												initialScale: 1, // 图片缩放比例
+												initialscaling: 1, // 图片初始时缩放比例
+												initialScalex: 1, // 图片宽缩放比例
+												initialScaley: 1, // 图片高缩放比例
+												initialWidth: width, // 图片原始宽度
+												initialHeight: height, // 图片原始高度
+												frame_left: null, // 裁剪窗口x
+												image_left: null, // 图片x
+												frame_top: null, // 裁剪窗口y
+												image_top: null, // 图片y
+												isUpLoadImage: true
+											})
+											_this.data.itemList = items
+											_this.isUpLoadImage = false;
+											_this.saveSnapshot();
+										}
+									});
+								}
+							},
+							fail: function(err) {
+								_this.isUpLoadImage = false;
+								failUp++;
+								//console.log(err)
+								wx.showToast({
+									title: '上传失败!',
+									icon: 'none',
+									duration: 1200
+								})
+							},
+							complete: function(err) {
+
+							}
+						})
+						uploadTask.onProgressUpdate((res) => {
+							_this.percent = res.progress - 1
+						})
+					}
+				})
+			},
+
+			goodsbrands(obj) {
+				this.isCustomize = false; //充值自定义
+				this.filletSize = 0 //设置圆角
+				this.isCustomizeComplete = false
+				this.clipButtom = 0;
+				this.clipTop = 0;
+				this.clipLeft = 0;
+				this.clipRight = 0;
+				this.filletSize = 0;
+				this.options.type = 2;
+				//this.translateX= -400
+				if (obj.switchBrandState == 2) { //切换手机壳
+					this.backgroundColor = false //控制底色
+					this.data.loadbgImageheightstate = true
+					this.$base.surfaceData = {
+						surface_type: obj.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+						surface_id: obj.surface_id, //材质对应的编号,没有的话就为0或者不传
+						surface_color: obj.surface_color, //材质颜色
+						surfaceName: obj.surfaceName, //材质名称
+						surface_color_series_id: obj.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+						surface_color_id: obj.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+						surface_color_series_id_text: obj.surface_color_series_id_text,
+						surface_color_id_text: obj.surface_color_id_text, //手机底色
+					}
+					//console.log(this.$base.surfaceData)
+					this.surface_type = this.$base.surfaceData.surface_type
+					this.surfaceName = this.$base.surfaceData.surfaceName
+					if (this.$base.surfaceData.surface_type == 0) { //默认
+						this.background_color = null //手机底色
+						// this.background_surface_color = null //定制壳手机壳底色
+					}
+					if (this.$base.surfaceData.surface_type == 1) { //自带壳
+						this.background_color = this.$base.surfaceData.surface_color_id_text //手机底色
+						// 清空历史记录
+						items = []; // 当前显示的图片列表
+						index = 0; // 所点击的图片的索引
+						snapshot = []; // 操作历史记录清空
+						snapshotIndex = -1;
+						this.data.itemList = items //赋值
+						this.saveSnapshot();
+					}
+					if (this.$base.surfaceData.surface_type == 2) { //定制壳
+						//this.background_color =this.$base.surfaceData.surface_color;
+						//this.background_color = 'none'
+						this.background_surface_color = this.$base.surfaceData.surface_color //定制壳手机壳底色
+					}
+					this.goodslist() // 获取产品详情数据
+					if (this.key != 2) {
+						this.orderNewLockAttrStock() //锁库存
+					}
+				} else { //切换手机
+					this.data.loadbgImageheightstate = false
+					this.data.goods_id = obj.goods_id_e.goods_id // 商品id
+					this.dict_id = obj.goods_id_e.dict_id //产品属性id
+					this.goods_id = obj.goods_id_e.goods_id //产品id
+					this.goods_size = obj.goods_id_e.modeltext // 品牌名
+					if (obj.sn) {
+						this.sn = obj.sn
+					}
+					this.$base.surfaceData = {
+						surface_type: obj.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+						surface_id: obj.surface_id, //材质对应的编号,没有的话就为0或者不传
+						surface_color: obj.surface_color, //材质颜色
+						surfaceName: obj.surfaceName, //材质名称
+						surface_color_series_id: obj.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+						surface_color_id: obj.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+						surface_color_series_id_text: obj.surface_color_series_id_text,
+						surface_color_id_text: obj.surface_color_id_text,
+					}
+					this.surface_type = this.$base.surfaceData.surface_type
+					this.surfaceName = this.$base.surfaceData.surfaceName
+					if (this.$base.surfaceData.surface_type == 0) { //默认
+						this.background_color = null //手机底色
+						//this.background_surface_color = null //定制壳手机壳底色
+					}
+					if (this.$base.surfaceData.surface_type == 1) { //自带壳
+						//this.background_color = this.$base.surfaceData.surface_color;
+						this.background_color = this.$base.surfaceData.surface_color_id_text //手机底色
+						//this.background_surface_color = null //定制壳手机壳底色
+						//清空历史记录
+						items = []; // 当前显示的图片列表
+						index = 0; // 所点击的图片的索引
+						snapshot = []; // 操作历史记录清空
+						snapshotIndex = -1;
+						this.data.itemList = items //赋值
+						this.saveSnapshot();
+					}
+					if (this.$base.surfaceData.surface_type == 2) { //定制壳
+						this.background_color = 'none'
+						//this.background_color = this.$base.surfaceData.surface_color
+						//this.background_color = this.$base.surfaceData.surface_color
+						//this.background_color = 'none'
+						this.background_surface_color = this.$base.surfaceData.surface_color
+					}
+					//this.background_color = "#DD8843";
+					this.goodslist() // 获取产品详情数据
+					if (this.key != 2) {
+						this.orderNewLockAttrStock() //锁库存
+					}
+				}
+				// 作品分类 贴图分类
+				//this.category()
+			},
+			orderNewLockAttrStock() {
+				homeservice.queryList({ // 释放锁定库存
+					s: 'Order.newLockAttrStock',
+					machine_id: this.machine_id, //设备id
+					goods_id: null, //产品
+					dict_id: null, //产品属性id
+					old_sn: null,
+					onlyClear: 1
+				}).then(result => {}).catch(err => {
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+				// 锁定库存
+				homeservice.queryList({
+					s: 'Order.newLockAttrStock',
+					machine_id: this.machine_id, //设备id
+					goods_id: this.goods_id, //产品
+					dict_id: this.dict_id, //产品属性id
+					old_sn: this.sn
+				}).then(result => {
+					this.$base.lockInventory = result //锁库存储存信息
+					this.sn = result.sn
+					this.orderUpdateSn() //定时器锁库存
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+			//移除遮罩形状
+			empty() {
+				if (this.shape_image != '') {
+					uni.showToast({
+						title: '形状已移除',
+						icon: 'none'
+					});
+				}
+				this.$refs['showshare'].close()
+				this.shape_image = ''
+				this.shape_id = ''
+				this.shape_price = ''
+				this.delete_wrap_state = true
+			},
+			// 替换图片取消
+			// cancel_replace(){
+			// 	this.$refs['replacebottom'].close()
+			// },
+			/* 生成作品 */
+			createWorks(e) {
+				this.itemCancel();
+				this.isShowGif = false;
+				if (this.available == 0) return;
+				var that = this
+				if (isclick == true) {
+					isclick = false;
+					this.$refs['textsettingsshare'].close()
+					var that = this
+					if (this.machine_id != undefined && this.machine_id != null && this.machine_id != '') {
+						// 判断设备是否正常
+						that.isComeDelivery = false;
+
+						this.available = this.machineDetail.available //禁用下订单
+						if (this.available == 0) {
+							this.createWorkstext = '暂时缺货'
+						}
+
+						//判断配送版
+						if (this.machineDetail.delivery == 1 && this.machineDetail.machine_category_id == "64") {
+							//this.key = 1;
+							this.isComeDelivery = true;
+						} //key:null,//1直营配送站 2 万能通用版 3色彩自助站
+
+						this.$base.coupon_flag_desc = this.machineDetail.coupon_flag_desc
+						this.support_pay = this.machineDetail.support_pay //单机版是否支付
+						//console.log("this.support_pay=" + res.support_pay)
+						// 先登陆
+						uni.login({
+							provider: 'weixin',
+							success: (weixinres) => {
+								userService.login({
+									s: 'Init.init',
+									code: weixinres.code
+								}).then(r => {
+									that.createWorks_one(e)
+								}).catch(err => {
+									that.$refs.Signin.init();
+									isclick = true;
+								});
+							},
+							fail: (weixinres) => {
+								uni.showToast({
+									title: weixinres.msg,
+									icon: 'none'
+								})
+							}
+						});
+
+					} else {
+						// 先登陆
+						uni.login({
+							provider: 'weixin',
+							success: (weixinres) => {
+								userService.login({
+									s: 'Init.init',
+									code: weixinres.code
+								}).then(r => {
+									that.createWorks_one(e)
+								}).catch(err => {
+									that.$refs.Signin.init();
+									isclick = true;
+								});
+							},
+							fail: (weixinres) => {
+								uni.showToast({
+									title: weixinres.msg,
+									icon: 'none'
+								})
+							}
+						});
+					}
+				}
+			},
+
+
+			//创建作品
+			createWorks_one: function(e) {
+				this.creatWorkInitPos(); // 每次创建作品初始化位置
+				let pixelRate = this.data.pixelRate;
+				let components = [];
+				let scalePos = {};
+				let width = 0.00;
+				let height = 0.00;
+				let left = 0.00;
+				let top = 0.00;
+				// 循环当前的组件数据
+				for (var item of this.data.itemList) {
+					item.rotate = item.angle
+					width = (item.width * item.scale);
+					height = (item.height * item.scale);
+
+					left = item.left;
+					top = item.top;
+
+
+					scalePos = this.calNoScalePos(left, top, width, height);
+
+					item.centerPos = {
+						x: left + width / 2,
+						y: top + height / 2
+					}
+
+					item.x = item.centerPos.x;
+					item.y = item.centerPos.y;
+
+					if (item.angle != 0) {
+						scalePos = this.calRocatePos(scalePos, {
+							x: item.x,
+							y: item.y
+						}, item.angle);
+					}
+
+					let widScale = pixelRate * this.design_widthrate; //宽度比例
+					let heiScale = pixelRate * this.design_heightrate; //高度比例
+
+					var comlist = {
+						support_zoom: item.support_zoom, // 0是不支持缩放,为1时支持缩放
+						support_drag: item.support_drag, // 0是不支持拖动,为1时支持拖动
+						is_under: item.is_under ? item.is_under : 0, //贴图是否为背景图
+						is_discount: item.is_discount ? item.is_discount : 0, //贴图是否用卷
+						id: item.idone ? item.idone : null,
+						type: item.type,
+						material_id: item.material_id,
+						works_id: item.works_id ? item.works_id : null,
+						original_id: item.original_id,
+						index: item.index,
+						font_family: item.font_family + '.ttf',
+						font_dict_id: item.font_dict_id,
+						font_style: "regular",
+						font_size: item.font_size / widScale,
+						font_color: item.font_color,
+						under_color: item.under_color ? item.under_color : "#00000000",
+						width: width / widScale,
+						height: height / heiScale,
+						top: top / heiScale,
+						left: left / widScale,
+						zoom: item.scale,
+						rotate: item.rotate,
+						content: item.content,
+						upper_left_x: scalePos.leftTopX / widScale,
+						upper_left_y: scalePos.leftTopY / heiScale,
+						upper_right_x: scalePos.rightTopX / widScale,
+						upper_right_y: scalePos.rightTopY / heiScale,
+						lower_left_x: scalePos.leftBottomX / widScale,
+						lower_left_y: scalePos.leftBottomY / heiScale,
+						lower_right_x: scalePos.rightBottomX / widScale,
+						lower_right_y: scalePos.rightBottomY / heiScale,
+						center_x: item.x / widScale,
+						center_y: item.y / heiScale,
+					}
+					// type: 0, //0为图片,1为文字,2为素材
+					if (item.type == 0) {
+						//新添加的参数
+						comlist.image_left = item.image_left ? (item.image_left + item.left) / widScale : (
+							left / widScale) // 图片的x
+						comlist.image_top = item.image_top ? (item.image_top + item.top) / heiScale : (top /
+							heiScale) // 图片的y
+						comlist.image_width = item.initialWidth * item.initialScale / widScale // 图片宽度
+						comlist.image_height = item.initialHeight * item.initialScale / heiScale // 图片高度
+					}
+					//创建组件数据
+					components.push(comlist);
+				}
+				if (this.data.works_idlenght == 0 && this.works_id == null) {
+					this.data.template = null //源作品id
+					this.data.template_price = null //源作品sales_price
+					this.data.template_user_id = null //源作品user_id
+				}
+				var loading = false
+				if (loading) return;
+				if (components.length <= 0) {
+					uni.showToast({
+						title: '啊嘞,作品还是一片荒漠!',
+						icon: 'none'
+					});
+					isclick = true;
+					return false;
+				}
+				loading = true
+				uni.showLoading({
+					title: '正在设计',
+					mask: true
+				})
+				if (loading) {
+					let getBackColor = this.background_surface_color;
+					if (this.background_color != null && this.background_color != "none") {
+						getBackColor = this.background_color;
+					}
+
+					let customize;
+					let name;
+					let print_width;
+					let print_height;
+					let print_left;
+					let print_top;
+					let print_radius;
+
+					let data = {};
+
+					if (this.isCustomize) {
+						customize = 1
+						name = this.options.name;
+						print_width = this.options.WidthIndex / 3;
+						print_height = this.options.HeightIndex / 3;
+						print_left = this.options.left / 3;
+						print_top = this.options.top / 3;
+						print_radius = this.options.fillet / 3;
+
+						data = {
+							s: 'Works.save',
+							components: components,
+							works_id: this.works_id,
+							goods_id: this.data.goods_id,
+							template: this.data.template, //源作品id
+							template_price: this.data.template_price, //源作品sales_price
+							template_user_id: this.data.template_user_id, //源作品user_id
+							user_id: this.data.user_id,
+							platform: 3,
+							shape_image: this.shape_image, //形状图片
+							shape_id: this.shape_id, //形状id
+							shape_price: this.shape_price, //形状价格
+							machine_id: this.machine_id, //设备idmachine_id
+							background_color: getBackColor, //手机壳背景颜
+							customize: customize,
+							name: name,
+							print_width: print_width,
+							print_height: print_height,
+							print_left: print_left,
+							print_top: print_left,
+							print_radius: print_radius,
+						}
+					} else {
+						data = {
+							s: 'Works.save',
+							components: components,
+							works_id: this.works_id,
+							goods_id: this.data.goods_id,
+							template: this.data.template, //源作品id
+							template_price: this.data.template_price, //源作品sales_price
+							template_user_id: this.data.template_user_id, //源作品user_id
+							user_id: this.data.user_id,
+							platform: 3,
+							shape_image: this.shape_image, //形状图片
+							shape_id: this.shape_id, //形状id
+							shape_price: this.shape_price, //形状价格
+							machine_id: this.machine_id, //设备idmachine_id
+							background_color: getBackColor, //手机壳背景颜
+						}
+					}
+
+
+					homeservice.Workssave(data).then(result => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '作品绘制成功',
+							icon: 'none',
+							mask: true
+						});
+						if (this.createWorkstext == '生成' || this.createWorkstext == '立即下单' || this
+							.createWorkstext == '保存' || this.createWorkstext == '更新') {
+							homeservice.setCate({
+								goodid: result.id,
+								machine_id: this.machine_id,
+								goods_id: this.data.goods_id
+							})
+
+							this.customize_size_id = "";
+							// let customize_size_id = "";
+							if (result.customize_size_id) {
+								this.customize_size_id = result.customize_size_id;
+							}
+
+							if (this.key == 2 && this.isComeDelivery) {
+								//隐藏功能按钮 1s
+								let functionHideanimation = wx.createAnimation({
+									duration: 1000,
+									timingFunction: 'ease-out'
+								})
+								functionHideanimation.opacity(0).step()
+								this.setData({
+									functionHide: functionHideanimation.export()
+								})
+								//手机顶部盒子移动回来
+								setTimeout(function() {
+									let animationDelLots = wx.createAnimation({
+										duration: 2000,
+										timingFunction: 'ease-out'
+									})
+									animationDelLots.translate(0, 0).step(); //向左移动
+									this.setData({
+										translateLeft: animationDelLots.export()
+									})
+								}.bind(this), 1000)
+								// 手机顶部和旧背景图消失
+								setTimeout(function() {
+									this.isReady = true; // 礼花
+									let animationDelLots = wx.createAnimation({
+										duration: 1000,
+										timingFunction: 'ease-out'
+									})
+									animationDelLots.opacity(0).step()
+									this.setData({
+										translateHide: animationDelLots.export()
+									})
+									// 背景图显示
+									let animation = wx.createAnimation({
+										duration: 1000,
+										timingFunction: 'ease-out'
+									})
+									animation.opacity(1).step()
+									this.setData({
+										translateXState: animation.export()
+									})
+								}.bind(this), 3000)
+								// 手机壳离开
+								setTimeout(function() {
+									this.translateX = ((this.data.windowWidth - this.data
+										.editorWidth) / 2 + this.data.editorWidth)
+								}.bind(this), 4000)
+
+								setTimeout(function() {
+									this.isReady = false; // 礼花
+									uni.navigateTo({
+										url: '../mine/orderNew?goodid=' + result.id +
+											'&machine_id=' + this.machine_id +
+											'&goods_id=' + this.data.goods_id +
+											'&sn=' + this.sn +
+											"&support_pay=" + this.support_pay +
+											"&machineDetail=" + encodeURIComponent(JSON
+												.stringify(this.machineDetail)) +
+											"&isCustomize=" + this.isCustomize +
+											"&titleName=" + this.titlename +
+											"&customize_size_id=" + this.customize_size_id
+									})
+									setTimeout(function() {
+										isclick = true;
+									}, 5000)
+								}.bind(this), 6000)
+								return;
+							}
+
+							if (this.key == 2) {
+								this.self_help(loading, result.id)
+							} else {
+								// 有设备machine_id
+								if (this.machine_id != null) {
+									//隐藏功能按钮 1s
+									let functionHideanimation = wx.createAnimation({
+										duration: 1000,
+										timingFunction: 'ease-out'
+									})
+									functionHideanimation.opacity(0).step()
+									this.setData({
+										functionHide: functionHideanimation.export()
+									})
+									//手机顶部盒子移动回来
+									setTimeout(function() {
+										let animationDelLots = wx.createAnimation({
+											duration: 2000,
+											timingFunction: 'ease-out'
+										})
+										animationDelLots.translate(0, 0).step(); //向左移动
+										this.setData({
+											translateLeft: animationDelLots.export()
+										})
+									}.bind(this), 1000)
+									// 手机顶部和旧背景图消失
+									setTimeout(function() {
+										this.isReady = true; // 礼花
+										let animationDelLots = wx.createAnimation({
+											duration: 1000,
+											timingFunction: 'ease-out'
+										})
+										animationDelLots.opacity(0).step()
+										this.setData({
+											translateHide: animationDelLots.export()
+										})
+										// 背景图显示
+										let animation = wx.createAnimation({
+											duration: 1000,
+											timingFunction: 'ease-out'
+										})
+										animation.opacity(1).step()
+										this.setData({
+											translateXState: animation.export()
+										})
+									}.bind(this), 3000)
+									// 手机壳离开
+									setTimeout(function() {
+										this.translateX = ((this.data.windowWidth - this.data
+											.editorWidth) / 2 + this.data.editorWidth)
+									}.bind(this), 4000)
+									// 跳转订单
+									setTimeout(function() {
+										this.isReady = false; // 礼花	
+										uni.navigateTo({
+											url: '../mine/order?goodid=' + result.id +
+												'&machine_id=' + this.machine_id +
+												'&goods_id=' + this.data.goods_id +
+												'&sn=' + this.sn +
+												"&machineDetail=" + encodeURIComponent(JSON
+													.stringify(this.machineDetail)) +
+												"&customize_size_id=" + this.customize_size_id
+										})
+										setTimeout(function() {
+											isclick = true;
+										}, 5000)
+									}.bind(this), 6000)
+								} else {
+									uni.navigateTo({
+										url: '../mine/nothingmachineid'
+									})
+									setTimeout(function() {
+										isclick = true;
+									}, 5000)
+								}
+							}
+						} else {
+							uni.navigateTo({
+								url: '../mall/myworksDetail?id=' + result.id
+							})
+						}
+					}).catch(err => {
+						uni.hideLoading();
+						loading = false;
+						uni.showModal({
+							title: '提示',
+							showCancel: false,
+							content: '网络超时,请重试!',
+							success: function() {}
+						});
+						isclick = true;
+					});
+				}
+			},
+			self_help(loading, works_id) {
+				let data = {
+					s: 'Order.create',
+					// type: this.key, //1:配送版,2:单机版,3:自助版
+					type: 2, //1:配送版,2:单机版,3:自助版
+					machine_id: this.machine_id, //设备
+					goods_id: this.data.goods_id, //产品
+					works_id: works_id, //作品
+					channel_no: null, //货道
+					dict_id: null, //属性字典id
+					goods_size: null, //产品尺寸
+					works_num: null, //作品
+					shop_id: null, //商铺
+					sn: null, //前端查询标志
+					coupon_id: null, //优惠券id,支付多个id( 1-2-3)
+					user_address: null, //地址
+					support_pay: this.support_pay, //单机版是否支付
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+					surface_color_series_id: this.$base.surfaceData.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: this.$base.surfaceData.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+					customize_size_id: this.customize_size_id, //自定义Id
+				}
+				if (this.support_pay == 1) {
+					uni.navigateTo({
+						url: '../mine/order?goodid=' + works_id + '&machine_id=' + this
+							.machine_id + '&goods_id=' +
+							this.data.goods_id + '&sn=' + this.sn + "&machineDetail=" +
+							encodeURIComponent(JSON.stringify(this.machineDetail)) + "&customize_size_id=" + this
+							.customize_size_id
+					})
+					setTimeout(function() {
+						isclick = true;
+					}, 5000)
+				} else {
+					uni.showLoading({
+						title: '正在生成订单...',
+						mask: true
+					})
+					homeservice.WorksList(data).then(result => {
+						// 关闭当前页面,跳转到应用内的某个页面。
+						uni.navigateTo({
+							url: '../mall/lineUp?machine_id=' + this.machine_id + '&key=' +
+								this.key
+						})
+						setTimeout(function() {
+							isclick = true;
+						}, 5000)
+						uni.hideLoading();
+					}).catch(err => {
+						loading = false;
+						uni.hideLoading();
+						uni.showToast({
+							title: err.msg || err.data,
+							icon: 'none'
+						});
+						isclick = true;
+					});
+				}
+			},
+
+			//切换手机
+			topagecategory(e) {
+				if (this.key == 2) { //单机版
+					this.$nextTick(() => {
+						this.$refs['switchBrands'].open({
+							machine_id: this.machine_id, //设备编号
+							key: this.key, //
+							goods_id: this.data.goods_id, //产品id
+							dict_id: this.dict_id, //产品属性id
+							sn: this.sn, //
+							switchBrandState: e, //0正常 1跳过选择手机型号 2定制页选择材质
+							isShowCustomize: this.machineDetail.customize_size == 1 ? true : false,
+							baseSetting: this.baseSetting
+						})
+					})
+				} else {
+					this.$nextTick(() => {
+						this.$refs['switchBrands'].open({
+							machine_id: this.machine_id, //设备编号
+							key: this.key, //
+							goods_id: this.data.goods_id, //产品id
+							dict_id: this.dict_id, //产品属性id
+							sn: this.sn, //
+							switchBrandState: e, //0正常 1跳过选择手机型号 2定制页选择材质
+							isShowCustomize: this.machineDetail.customize_size == 1 ? true : false,
+							baseSetting: this.baseSetting
+						})
+					})
+				}
+			},
+
+			onok(item) {
+				this.state = false
+				//赋值就移动了
+				items[index] = item
+				// 初始化的位置
+				drag.initPos(items[index])
+				drag.getTransferPosition(item.left, item.top, item.width, item.height, item.angle, item
+					.centerPos, item)
+				this.data.itemList = items
+			},
+
+			oncancle() {
+				this.state = false
+			},
+
+			touchMove(ev) {
+				ev.preventDefault();
+				//获取当前选中的部件
+				var item = items[index];
+				//点击
+				if (ev.touches.length == 1 && item != undefined) {
+					if (item.typetext == "left-top" || item.typetext == "left-bottom" || item.typetext ==
+						"right-top" || item.typetext == "right-bottom") {
+						//四角缩放
+						drag.scaleMove(ev, item, this.data)
+					} else if (item.typetext == "left" || item.typetext == "right" || item.typetext ==
+						"top" || item.typetext == "bottom") {
+						//四边伸缩
+						drag.edgeMove(ev, item, this.data)
+					}
+				} else if (ev.touches.length == 2 && ev.touches.length == 2) {
+					// 双指头操作
+				}
+			},
+
+			touchEnd(ev) {
+				// 获取当前选中的部件
+				var item = items[index];
+				if (item != undefined) {
+					item.typetext = null
+				}
+			},
+
+			//边框移动
+			edgeStart(e, type) {
+				//获取当前选中的部件
+				var item = items[index];
+				item.typetext = type //判断边框
+				//获取作为移动前坐标
+				item.edgestartX = e.touches[0].clientX;
+				item.edgestartY = e.touches[0].clientY;
+				item.min_width = item.width
+				item.min_height = item.height
+				if (item.min_width == 50) {
+					item.min_width = 55
+				}
+				if (item.min_height == 50) {
+					item.min_height = 55
+				}
+				// 记录坐标
+				var mLeft = this.getLeft();
+				var mTop = this.getTop();
+				item.mLeft = mLeft
+				item.mTop = mTop
+				drag.recordPressDownData(item);
+			},
+
+			//边框移动结束
+			edgeEnd(e) {
+				//获取当前选中的部件
+				var item = items[index];
+				item.typetext = null
+				//属性
+				item.active = true //辅助线
+				item.activeguide = false //辅助线
+				item.activescale = true // 旋转状态
+				item.activehorn = true // 角状态
+				item.activeedge = true // 边状态
+				//赋值
+				this.data.itemList = items
+				drag.getTransferPosition(item.left, item.top, item.width, item.height, item.angle, item.centerPos, item)
+				this.saveSnapshot();
+			},
+
+			designcolor(e) { //多个商品时切换商品
+				snapshot = []; // 操作历史记录清空
+				snapshotIndex = -1;
+				this.data.goods_id = e.id
+				this.goodslist() // 获取产品详情数据
+			},
+
+			//获取作品详情
+			Worksdetail(item) {
+				this.delete_wrap_state = true
+				if (wx.pageScrollTo) {
+					wx.pageScrollTo({
+						scrollTop: 0
+					})
+				}
+				this.$refs['showshare'].close()
+				var that = this
+				if (this.e_active == 1) {
+					if (items.length > 0) { //模板
+						uni.showModal({
+							title: '温馨提示',
+							content: '更换当前模版会清空DIY区域内容,确认要更新吗?',
+							cancelText: '取消',
+							confirmText: '确定',
+							confirmColor: '#ff3b32',
+							success: async function(res) {
+								if (res.confirm) {
+									that.Worksdetaildata(item)
+								} else if (res.cancel) {
+
+								}
+							}
+						});
+					} else {
+						that.Worksdetaildata(item)
+					}
+				} else if (this.e_active == 2 || this.e_active == 23) {
+					that.Worksdetaildata(item)
+				} else if (this.e_active == 22) { //特效
+					this.shape_image = item.image
+					this.shape_id = item.id
+					this.shape_price = item.sales_price
+					if (this.shape_image != '' && this.data.itemList.length == 0) {
+						this.showone = !this.showone
+					}
+				} else if (this.e_active == 99) {
+					that.Worksdetaildata(item)
+				}
+			},
+			Worksdetaildata(item) { //this.e_active 1模板 2贴图 3字体 4编辑 22添加相框
+				let s_data = 'Works'
+				let isWork = item.isWork;
+				if (this.e_active == 1) {
+					items = []
+				} else if (this.e_active == 2 || this.e_active == 23 || this.e_active == 99) {
+					if (isWork) {
+						s_data = 'Works'
+					} else {
+						s_data = 'Material'
+					}
+				}
+				uni.showLoading({
+					title: '正在加载中...',
+					mask: true
+				})
+				homeservice.queryList({
+					s: s_data + '.detail',
+					id: item.id
+				}).then(result => {
+					if (this.e_active == 1) { //作品保留提交数据
+						this.data.template = result.id
+						this.data.template_price = result.sales_price
+						this.data.template_user_id = result.user_id
+						this.data.works_idlenght = result.component.length
+						var components = result.component;
+						for (var i = 0; i < components.length; i++) {
+							var item = components[i];
+							var top = item.upper_left_y;
+							var left = item.upper_left_x;
+							let pixelRate = this.data.pixelRate;
+							if (item.rotate != 0.00) {
+								left = item.center_x - (item.width / 2);
+								top = item.center_y - (item.height / 2);
+							}
+							items.push({
+								support_zoom: item.support_zoom, // 0是不支持缩放,为1时支持缩放
+								support_drag: item.support_drag, // 0是不支持拖动,为1时支持拖动
+								is_under: result.is_under || 0, //贴图是否为背景图
+								is_discount: item.is_discount, //贴图是否用卷
+								idone: item.id,
+								id: i + 1,
+								type: item.type.value,
+								material_id: item.material_id,
+								index: item.index,
+								font_family: item.font_family,
+								font_style: item.font_style,
+								font_size: item.font_size * pixelRate * this
+									.design_widthrate,
+								font_color: item.font_color,
+								under_color: item.under_color,
+								content: item.content, // 图片地址
+								top: top * pixelRate * this
+									.design_heightrate, // 初始图片Y坐标,根据画布高/2-图片高/2
+								left: left * pixelRate * this
+									.design_widthrate, // 初始图片X坐标,因为div是相对定位,所以计算是要多减一次移动的距离
+								x: item.center_x * pixelRate * this
+									.design_widthrate, // 初始圆心位置,可再downImg之后又宽高和初始的图片位置得出
+								y: item.center_y * pixelRate * this.design_heightrate,
+								scale: 1, // 缩放比例 1为不缩放
+								lastScale: 1, // 上一次的绽放比例
+								oScale: 1, // 缩放比例  1为不缩放
+								angle: parseFloat(item.rotate), // 旋转角度
+								rotate: parseFloat(item.rotate), // 旋转值
+								active: false, // 判定点击状态
+								usedwidth: item.width * pixelRate * this
+									.design_widthrate, // 预设生成图片的宽度
+								usedheight: item.height * pixelRate * this
+									.design_heightrate, // 预设生成图片的高度
+								width: item.width * pixelRate * this
+									.design_widthrate, // 预设生成图片的宽度
+								height: item.height * pixelRate * this
+									.design_heightrate, // 预设生成图片的高度
+								rScale: 1, // 图片原始缩放比例
+								works_id: item.works_id, //模板id
+								original_id: item.works_id,
+								activeguide: false, // 开启辅助线
+								activescale: false, // 开启旋转状态
+								activehorn: false, // 开启角状态
+								activeedge: false, // 开启边状态
+								// 分界线
+								initialScale: 1, // 图片缩放比例
+								initialscaling: 1, // 图片初始时缩放比例
+								initialScalex: 1, // 图片宽缩放比例
+								initialScaley: 1, // 图片高缩放比例
+								initialWidth: item.width * pixelRate * this.design_widthrate, // 图片原始宽度
+								initialHeight: item.height * pixelRate * this.design_heightrate, // 图片原始高度
+								frame_left: null, // 裁剪窗口x
+								image_left: null, // 图片x
+								frame_top: null, // 裁剪窗口y
+								image_top: null, // 图片y
+							});
+						}
+						//赋值
+						this.data.itemList = items
+						this.saveSnapshot();
+						uni.hideLoading();
+					} else if (this.e_active == 2 || this.e_active == 23 || this.e_active == 99) { //贴图
+						uni.showLoading({
+							title: '加载中...',
+							mask: true
+						})
+						let support_zoom = 1; // 0是不支持缩放,为1时支持缩放
+						let support_drag = 1; // 0是不支持拖动,为1时支持拖动
+						let is_under = 0; //贴图是否为背景图
+						let is_discount = 0; //贴图是否用卷
+						let urlData;
+						let material_id = 0; //贴图id
+						let original_id = 0;
+						if (isWork) {
+							urlData = result.image
+							result.mix_scale = 1;
+							result.is_under = 0;
+						} else {
+							urlData = result.url
+							support_zoom = result.support_zoom; // 0是不支持缩放,为1时支持缩放
+							support_drag = result.support_drag; // 0是不支持拖动,为1时支持拖动
+							is_under = result.is_under; //贴图是否为背景图
+							is_discount = result.is_discount; //贴图是否用卷
+							original_id = result.id;
+							material_id = result.id;
+						}
+
+						//读取主图遮罩
+						uni.getImageInfo({
+							src: urlData,
+							success: (image) => {
+								if (this.e_active == 23) {
+									// 清空历史记录
+									items = []; // 当前显示的图片列表
+									index = 0; // 所点击的图片的索引
+									snapshot = []; // 操作历史记录清空
+									snapshotIndex = -1;
+								}
+								uni.hideLoading()
+								let index = items.length;
+								let width = 0
+								let height = 0
+								let top = 0
+								let lef = 0
+								let ratio = image.width / image.height
+								let ratiowidth = (this.data.editorWidth * this.mix_scale) / image.width
+								let ratioheight = (this.data.editorHeight * this.mix_scale) / image
+									.height
+								let resultmix_scale = result.mix_scale || 1
+								//if (ratio >= 1) { //长方形
+								width = this.data.editorWidth * this.mix_scale * resultmix_scale
+								height = image.height * ratiowidth * resultmix_scale
+								// } else if (ratio < 1) { //长高方形
+								// 	height = this.data.editorHeight * this.mix_scale * resultmix_scale
+								// 	width = image.width * ratioheight * resultmix_scale
+								// }
+								if (result.is_under == 1) {
+									let number_index = 0
+									for (var item of items) {
+										if (item.is_under == 0) {
+											item.index = item.index + 1;
+										} else if (item.is_under == 1) {
+											number_index++
+										}
+									}
+									index = number_index
+								}
+
+								items.push({
+									support_zoom: support_zoom, // 0是不支持缩放,为1时支持缩放
+									support_drag: support_drag, // 0是不支持拖动,为1时支持拖动
+									is_under: is_under, //贴图是否为背景图
+									is_discount: is_discount, //贴图是否用卷
+									id: items.length + 1,
+									type: 2, //0图片 1文字 2贴图
+									material_id: material_id, //贴图id
+									original_id: original_id,
+									index: index,
+									font_family: '',
+									font_style: '',
+									font_size: '',
+									font_color: '',
+									under_color: '',
+									content: urlData, // 贴图地址
+									top: this.editor_top - height / 2, // 初始图片Y坐标,根据画布高/2-图片高/2
+									left: this.data.editorWidth / 2 - width /
+										2, // 初始图片X坐标,因为div是相对定位,所以计算是要多减一次移动的距离
+									x: this.data.editorWidth /
+										2, // 初始圆心位置,可再downImg之后又宽高和初始的图片位置得出
+									y: this.editor_top,
+									scale: 1, // 缩放比例  1为不缩放
+									lastScale: 1, // 上一次的绽放比例
+									oScale: 1, // 缩放比例  1为不缩放
+									angle: 0, // 旋转角度
+									rotate: 0, // 旋转值
+									active: false, // 判定点击状态
+									width: width, // 预设生成图片的宽度
+									height: height, // 预设生成图片的高度
+									rScale: 1, // 贴图原始缩放比例
+									activeguide: false, // 开启辅助线
+									activescale: false, // 开启旋转状态
+									activehorn: false, // 开启角状态
+									activeedge: false, // 开启边状态
+									initialScale: 1, // 图片缩放比例
+									initialscaling: 1, // 图片初始时缩放比例
+									initialScalex: 1, // 图片宽缩放比例
+									initialScaley: 1, // 图片高缩放比例
+									initialWidth: width, // 图片原始宽度
+									initialHeight: height, // 图片原始高度
+									frame_left: null, // 裁剪窗口x
+									image_left: null, // 图片x
+									frame_top: null, // 裁剪窗口y
+									image_top: null, // 图片y
+								})
+								//提示用户此贴图可用卷
+								if (result.is_discount == '1') {
+									if (this.$base.coupon_flag_desc == '') return;
+									uni.showToast({
+										title: this.$base.coupon_flag_desc,
+										icon: 'none',
+										duration: 2000,
+										mask: false
+									});
+								}
+								this.data.itemList = items
+								this.saveSnapshot();
+							},
+							fail: function(err) {
+								uni.hideLoading()
+								uni.showToast({
+									title: '图片加载失败',
+									icon: 'none'
+								});
+							}
+						})
+					}
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+
+			isLeft(flag = null) {
+
+			},
+
+			bgColorAssembly(bg) {
+				this.background_color = bg
+				this.$refs['showshare'].close()
+			},
+
+			//控制背景颜色
+			bgColorNewClick() {
+				this.queryPage.page = 1
+				this.backgroundColor = true;
+				this.$nextTick(() => {
+					this.$refs['bgColor'].open()
+				})
+			},
+
+			//打开弹框 1模板 2贴图 3字体 4编辑 22添加相框 23壁纸
+			material_series_handleScroll(index, item) {
+				this.queryPage.page = 1
+				this.material_series_currentId = item.id
+				this.queryPage.material_series_id = item.id
+				let valColorValue = "";
+				if (this.e_active == 23) { //壁纸
+					this.wallpaper_material_series_currentId = item.id;
+				} else if (this.e_active == 2) { //贴图
+					this.mapping_material_series_currentId = item.id;
+					valColorValue = this.brands[this.currentId_Material].val
+				}
+				this.$nextTick(() => {
+					this.$refs['scrollList'].open({
+						e: this.e_active,
+						queryPage: this.queryPage,
+						val: valColorValue
+					})
+				})
+			},
+
+			handleScroll(index, item) { //选中
+				this.queryPage.material_series_id = 0
+				this.material_series_currentId = 0
+				this.backgroundColor = false
+				//判断系列
+				if (this.e_active == 23) {
+					this.wallpaper_material_series_currentId = 0;
+				} else if (this.e_active == 2) {
+					this.mapping_material_series_currentId = 0;
+				}
+				if (this.e_active == 1) {
+
+				} else if (this.e_active == 2) { //贴图
+					this.currentId_Material = index;
+					this.currentIndex_Material = Math.max(0, index - 1);
+					this.Material_categorydatalist = []
+					this.queryPage.page = 1
+					this.Material_category_id = item.id
+					if (this.brands[this.currentId_Material].title == '热门') {
+						this.classificationHeight = 0
+						this.material_series_list = []
+						this.queryPage.is_hot = '1'
+						this.queryPage.is_new = null
+						this.queryPage.material_category_id = null
+					} else if (this.brands[this.currentId_Material].title == '最新') {
+						this.classificationHeight = 0
+						this.material_series_list = []
+						this.queryPage.is_new = '1'
+						this.queryPage.is_hot = null
+						this.queryPage.material_category_id = null
+					} else {
+						this.queryPage.is_hot = null
+						this.queryPage.is_new = null
+						this.queryPage.material_category_id = item.id
+					}
+					this.currentId = index;
+					this.currentIndex = Math.max(0, index - 1);
+					if (this.brands[this.currentId_Material].title == '我的') {
+						this.classificationHeight = 0
+						this.material_series_list = []
+						this.$nextTick(() => {
+							this.$refs['scrollList'].open({
+								e: this.e_active,
+								queryPage: {
+									s: 'Material.myMaterial',
+									page: 1,
+									per_page: 50
+								},
+							})
+						})
+					} else {
+						this.MaterialseriesList()
+						this.$nextTick(() => {
+							this.$refs['scrollList'].open({
+								e: this.e_active,
+								queryPage: this.queryPage,
+								val: this.brands[this.currentId_Material].val
+							})
+						})
+					}
+				} else if (this.e_active == 22) { //相框
+					this.currentId_Works = index;
+					this.currentIndex_Works = Math.max(0, index - 1);
+					this.Works_categorydatalist = []
+					this.queryPage.page = 1
+					this.Works_category_id = item.id
+					this.queryPage.is_hot = null
+					this.queryPage.is_new = null
+					this.queryPage.works_category_id = item.id
+					this.queryPage.shape_category_id = item.id
+					this.currentId = index;
+					this.currentIndex = Math.max(0, index - 1);
+				} else if (this.e_active == 23) { //壁纸
+					this.currentId_wallpaper = index;
+					this.currentIndex_wallpaper = Math.max(0, index - 1);
+					this.wallpaper_categorydatalist = [] //壁纸列表
+					this.queryPage.page = 1
+					this.wallpaper_category_id = item.id //记录壁纸选中分类
+					if (this.brands[this.currentId_wallpaper].title == '热门') {
+						this.classificationHeight = 0
+						this.material_series_list = []
+						this.queryPage.is_hot = '1'
+						this.queryPage.is_new = null
+						this.queryPage.material_category_id = null
+					} else if (this.brands[this.currentId_wallpaper].title == '最新') {
+						this.classificationHeight = 0
+						this.material_series_list = []
+						this.queryPage.is_new = '1'
+						this.queryPage.is_hot = null
+						this.queryPage.material_category_id = null
+					} else {
+						this.queryPage.is_hot = null
+						this.queryPage.is_new = null
+						this.queryPage.material_category_id = item.id
+					}
+					this.currentId = index;
+					this.currentIndex = Math.max(0, index - 1);
+					this.MaterialseriesList()
+					this.$nextTick(() => {
+						this.$refs['scrollList'].open({
+							e: this.e_active,
+							queryPage: this.queryPage,
+						})
+					})
+				} else if (this.e_active == 99) { //壁纸
+					this.currentId = index;
+					this.currentIndex = Math.max(0, index - 1);
+					this.collection_currentId = this.currentId;
+					this.collection_currentIndex = this.currentIndex;
+					this.$nextTick(() => {
+						setTimeout(function() {
+							this.$refs['scrollList'].open({
+								e: this.e_active,
+								goods_id: this.data.goods_id,
+								queryPage: {
+									currentId: this.currentId,
+								},
+							})
+						}.bind(this), 500)
+					})
+				}
+			},
+
+
+			MaterialseriesList() { //查询分类下二级分类
+				this.material_series_list = []
+				homeservice.queryList({
+					s: 'Material.seriesList',
+					category_id: this.queryPage.material_category_id,
+				}).then(result => {
+					this.queryPage.material_series_id = 0
+					this.material_series_list = result
+					if (this.material_series_list.length > 0) {
+						if (this.e_active == 23) {
+							if (this.wallpaper_material_series_currentId != 0) {
+								this.queryPage.material_series_id = this
+									.wallpaper_material_series_currentId;
+								this.material_series_currentId = this
+									.wallpaper_material_series_currentId
+							} else {
+								this.queryPage.material_series_id = this.material_series_list[0].id
+								this.material_series_currentId = this.material_series_list[0].id
+							}
+							//this.wallpaper_material_series_currentId = 0;
+						} else if (this.e_active == 2) {
+							if (this.mapping_material_series_currentId != 0) {
+								this.queryPage.material_series_id = this.mapping_material_series_currentId
+								this.material_series_currentId = this.mapping_material_series_currentId
+							} else {
+								this.queryPage.material_series_id = this.material_series_list[0].id
+								this.material_series_currentId = this.material_series_list[0].id
+							}
+							//this.mapping_material_series_currentId = 0;
+						} else {
+							this.queryPage.material_series_id = this.material_series_list[0].id
+							this.material_series_currentId = this.material_series_list[0].id
+						}
+						let that = this
+						setTimeout(function() {
+							var query = wx.createSelectorQuery();
+							query.select('#classification').boundingClientRect();
+							query.exec(function(res) {
+								that.classificationHeight = res[0].height
+								that.setData({
+									classificationHeight: that.classificationHeight
+								})
+							})
+						}.bind(this), 100)
+					} else {
+						this.classificationHeight = 0
+					}
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+
+
+			showPopup(e) { //打开弹框 1模板 2贴图 3字体 4编辑 22添加相框 23壁纸
+				if (!this.isHasClick) {
+					return;
+				}
+				this.isShowGif = false;
+				this.material_series_list = []
+				this.queryPage.material_series_id = 0
+				this.material_series_currentId = 0
+				this.delete_wrap_state = false
+				this.showone = false
+				this.e_active = e
+				this.togglePopup('bottom', 'share')
+				this.$refs['textsettingsshare'].close()
+				this.queryPage.page = 1
+				if (e == 1) { //模板
+
+				} else if (e == 2) { //贴图
+					this.category(2)
+				} else if (e == 3) { //文本
+					index = null
+					this.addtext = true
+					this.data.currentText = ''
+					this.$nextTick(() => {
+						this.$refs['textsettings'].open({
+							data: this.data,
+							bg_text_color: this.bg_text_color
+						})
+					})
+				} else if (e == 4) { //文本
+					this.addtext = false
+					this.$nextTick(() => {
+						this.$refs['textsettings'].open({
+							data: this.data,
+							bg_text_color: this.bg_text_color
+						})
+					})
+				} else if (e == 22) { //形状
+
+				} else if (e == 23) { //壁纸
+					this.category(23)
+				} else if (e == 24) {
+					this.Adlists = this.diy_bannerList
+					this.backgroundColor = true;
+					this.$nextTick(() => {
+						this.$refs['bgColor'].open()
+					})
+				} else if (e == 99) { //收藏
+					this.Adlists = this.history_bannerList
+					this.brands = [{
+							icon: "../../static/icon/icon_history_sticker.png",
+							icon_click: "../../static/icon/icon_history_sticker-o.png",
+							title: "我的历史"
+						},
+						{
+							icon: "../../static/icon/my.png",
+							icon_click: "../../static/icon/my-o.png",
+							title: "我的作品"
+						},
+						{
+							icon: "../../static/icon/icon_collection_@2x.png",
+							icon_click: "../../static/icon/icon_collection_@2x-o.png",
+							title: "我的收藏"
+						},
+						{
+							icon: "../../static/icon/icon_good@2x.png",
+							icon_click: "../../static/icon/icon_good@2x-o.png",
+							title: "我的点赞"
+						},
+					]
+
+					if (this.collection_currentId != 0) {
+						this.currentId = this.collection_currentId;
+						this.currentIndex = this.collection_currentIndex;
+					} else {
+						this.currentId = 0;
+						this.currentIndex = 0; /* 控制位置 */
+					}
+					this.$nextTick(() => {
+						setTimeout(function() {
+							this.$refs['scrollList'].open({
+								e: e,
+								goods_id: this.data.goods_id,
+								queryPage: {
+									currentId: this.currentId,
+								},
+							})
+						}.bind(this), 500)
+					})
+				}
+			},
+
+			//关闭弹框
+			cancel(type) {
+				this.e_active = 0
+				this.$refs['showshare'].close()
+				this.$refs['textsettingsshare'].close();
+				this.isUpLoadImage = false;
+				if (!this.isHasClick) {
+					return;
+				}
+				this.isShowGif = false;
+				this.$refs['show' + type].close()
+				this.addtext = false
+				if (wx.pageScrollTo) {
+					wx.pageScrollTo({
+						scrollTop: 0
+					})
+				}
+				this.delete_wrap_state = true
+			},
+
+			//关闭弹框
+			typefaceshow(type) {
+				var item = items[index]; // 获取当前选中的部件
+				if (item != undefined && item.type == 1) {
+					// 字体
+					this.$refs['textsettingsshare'].open()
+					this.$nextTick(() => {
+						this.$refs['textsettingstwo'].open({
+							data: this.data,
+							bg_text_color: this.bg_text_color,
+							text: 'typeface'
+						})
+					})
+				} else {
+					uni.showToast({
+						title: '啊嘞,请先输入或者选择文字内容哦',
+						icon: 'none'
+					})
+				}
+			},
+			//关闭所有弹窗回调事件
+			change(e) {
+				if (items != null && items.length >= 1) {
+					var index = items.length - 1;
+					var item = items[index];
+					if (item != undefined && item.type == 1) {
+						if (items[index].content == "" || items[index].content == null) {
+							items.splice(index, 1); // 删除指定的部件
+							this.setData({
+								'data': this.data
+							});
+							this.active = false;
+						}
+					}
+				}
+			},
+			togglePopup(type, open) { //打开弹框
+				switch (type) {
+					case 'bottom':
+						this.content = '底部弹出 popup'
+						break
+				}
+				this.type = type
+				this.$nextTick(() => {
+					this.$refs['show' + open].open()
+				})
+			},
+			bgtextcolor() {
+				this.bg_text_color = !this.bg_text_color
+				this.$nextTick(() => {
+					this.$refs['textsettings'].open({
+						data: this.data,
+						bg_text_color: this.bg_text_color
+					})
+				})
+			},
+			//文本字体
+			typefaceClick(typeface) {
+				//获取当前选中的部件
+				var item = items[index];
+				if (item != undefined && item.type == 1) {
+					item.font_family = typeface.key
+					item.font_dict_id = typeface.id
+					// 字体行高变化
+					if (typeface.title == '思源黑体') {
+						heightRate = 1.48
+					} else if (typeface.title == '字体视界法棍体') {
+						heightRate = 1.14
+					} else if (typeface.title == '千图小兔体') {
+						heightRate = 1.2
+					} else if (typeface.title == '仓耳小字体') {
+						heightRate = 1.26
+					} else if (typeface.title == '站酷酷黑') {
+						heightRate = 1.14
+					} else if (typeface.title == '站酷快乐体') {
+						heightRate = 1.14
+					}
+					var that = this;
+					var query = wx.createSelectorQuery();
+					query.select('#item-text').boundingClientRect();
+					query.exec(function(res) {
+						var width = res[0].width;
+						var rate = item.width / width;
+						var tmpSize = item.font_size * rate;
+						if (tmpSize > maxFontSize) {
+							item.font_size = maxFontSize;
+							item.height = maxFontSize * heightRate;
+							item.top = item.y - (item.height / 2);
+						} else {
+							item.font_size = item.font_size * rate;
+							item.height = item.height * rate;
+							item.top = item.y - (item.height / 2);
+						}
+						that.setData({
+							data: that.data
+						})
+						that.data.itemList = items
+					})
+				} else {
+					uni.showToast({
+						title: '啊嘞,你还没有输入内容哦',
+						icon: 'none'
+					})
+				}
+				this.saveSnapshot();
+			},
+			//文本加粗
+			workweight() {
+				//获取当前选中的部件
+				var item = items[index];
+				if (item != undefined && item.type == 1) {
+					item.font_style = item.font_style == "" ? "bold" : ""
+				} else {
+					uni.showToast({
+						title: '啊嘞,你还没有输入内容哦',
+						icon: 'none'
+					})
+				}
+				this.saveSnapshot();
+			},
+			//文本颜色
+			workcolor(color) {
+				//获取当前选中的部件
+				var item = items[index];
+				if (item != undefined && item.type == 1) {
+					if (this.bg_text_color) {
+						item.under_color = color == item.under_color ? '' : color
+					} else {
+						item.font_color = color == item.font_color ? '#000000' : color
+					}
+				} else {
+					uni.showToast({
+						title: '啊嘞,你还没有输入内容哦',
+						icon: 'none'
+					})
+				}
+				this.saveSnapshot();
+			},
+			/**
+			 * 通过旧坐标、旋转角度、圆心计算旋转后点的新坐标
+			 * @param origin  原始坐标对象
+			 * @param center  圆心坐标对象
+			 * @param angle   旋转角度
+			 * @return {{x: string, y: string}}
+			 */
+			calNewPos(origin, center, angle) {
+				// 计算
+				let radian = Math.PI / 180 * angle;
+				let newX = (origin.x - center.x) * Math.cos(radian) - (origin.y - center.y) * Math.sin(
+					radian) + center.x;
+				let newY = (origin.y - center.y) * Math.cos(radian) + (origin.x - center.x) * Math.sin(
+					radian) + center.y;
+				// 取10位小数
+				newX = newX.toFixed(10);
+				newY = newY.toFixed(10);
+				return {
+					x: newX,
+					y: newY
+				};
+			},
+			/**
+			 * 通当新坐标、旋转角度、圆心计算旋转后点的旧坐标
+			 * @param origin  原始坐标对象
+			 * @param center  圆心坐标对象
+			 * @param angle   旋转角度
+			 * @return {{x: string, y: string}}
+			 */
+			calOldPos(origin, center, angle) {
+				// 计算
+				let radian = -Math.PI / 180 * angle;
+				let oldX = (origin.x - center.x) * Math.cos(radian) - (origin.y - center.y) * Math.sin(
+					radian) + center.x;
+				let oldY = (origin.y - center.y) * Math.cos(radian) + (origin.x - center.x) * Math.sin(
+					radian) + center.y;
+				// 取10位小数
+				oldX = oldX.toFixed(10);
+				oldY = oldY.toFixed(10);
+				return {
+					x: oldX,
+					y: oldY
+				};
+			},
+			/**
+			 * 计算伸缩后的四个顶部坐标
+			 * @param scale  放大倍部
+			 * @param left   左上顶点的左距离
+			 * @param top    左上顶点的上距离
+			 * @param width  部件宽度
+			 * @param height 部件高度
+			 * @return {{leftTopY: string, rightTopX: string, leftTopX: string, leftBottomY: string, rightBottomX: string, rightTopY: string, leftBottomX: string, rightBottomY: string}}
+			 */
+			calScalePos(scale, left, top, width, height) {
+				// 计算单边需要伸缩的比例,可为正可为负
+				let rate = (scale - 1) / 2;
+				// 通过比例计算宽和高的差值
+				let widthDiff = rate * width;
+				let heightDiff = rate * height;
+				// 左上顶点的坐标
+				let leftTopX = left - widthDiff;
+				let leftTopY = top - heightDiff;
+				// 右上顶点的坐标
+				let rightTopX = (left + width) + widthDiff;
+				let rightTopY = leftTopY;
+				// 左下顶点的坐标
+				let leftBottomX = leftTopX;
+				let leftBottomY = (top + height) + heightDiff;
+				// 右下顶点的坐标
+				let rightBottomX = rightTopX;
+				let rightBottomY = leftBottomY;
+				// 返回所有的8个坐标
+				return {
+					leftTopX: leftTopX.toFixed(10),
+					leftTopY: leftTopY.toFixed(10),
+					rightTopX: rightTopX.toFixed(10),
+					rightTopY: rightTopY.toFixed(10),
+					leftBottomX: leftBottomX.toFixed(10),
+					leftBottomY: leftBottomY.toFixed(10),
+					rightBottomX: rightBottomX.toFixed(10),
+					rightBottomY: rightBottomY.toFixed(10),
+					centerX: (rightTopX - leftTopX) / 2,
+					centerY: (rightTopY - leftTopY) / 2
+				};
+			},
+			/**
+			 * 计算未伸缩时的四个顶点坐标
+			 * @param left   左上顶点的左距离
+			 * @param top    左上顶点的上距离
+			 * @param width  部件宽度
+			 * @param height 部件高度
+			 * @return {{leftTopY: string, rightTopX: string, leftTopX: string, leftBottomY: string, rightBottomX: string, rightTopY: string, leftBottomX: string, rightBottomY: string}}
+			 */
+			calNoScalePos(left, top, width, height) {
+				// 左上顶点的坐标
+				let leftTopX = left;
+				let leftTopY = top;
+				// 右上顶点的坐标
+				let rightTopX = left + width;
+				let rightTopY = leftTopY;
+				// 左下顶点的坐标
+				let leftBottomX = leftTopX;
+				let leftBottomY = top + height;
+				// 右下顶点的坐标
+				let rightBottomX = rightTopX;
+				let rightBottomY = leftBottomY;
+				// 返回所有的8个坐标
+				return {
+					leftTopX: leftTopX.toFixed(10),
+					leftTopY: leftTopY.toFixed(10),
+					rightTopX: rightTopX.toFixed(10),
+					rightTopY: rightTopY.toFixed(10),
+					leftBottomX: leftBottomX.toFixed(10),
+					leftBottomY: leftBottomY.toFixed(10),
+					rightBottomX: rightBottomX.toFixed(10),
+					rightBottomY: rightBottomY.toFixed(10),
+					centerX: (rightTopX - leftTopX) / 2,
+					centerY: (rightTopY - leftTopY) / 2
+				};
+			},
+			/**
+			 * 计算四个顶点旋转后的坐标系
+			 *
+			 * @param scalePos  四个顶点未旋转前的坐标系
+			 * @param center    中心点位置
+			 * @param angle     旋转角度
+			 * @return {{leftTopY: string, rightTopX: string, leftTopX: string, leftBottomY: string, rightBottomX: string, rightTopY: string, leftBottomX: string, rightBottomY: string}}
+			 */
+			calRocatePos(scalePos, center, angle) {
+				// console.log(scalePos)
+				// 左上顶点的坐标
+				let leftTop = this.calNewPos({
+					x: scalePos.leftTopX,
+					y: scalePos.leftTopY
+				}, center, angle);
+
+				// 右上顶点的坐标
+				let rightTop = this.calNewPos({
+					x: scalePos.rightTopX,
+					y: scalePos.rightTopY
+				}, center, angle);
+
+				// 左下顶点的坐标
+				let leftBottom = this.calNewPos({
+					x: scalePos.leftBottomX,
+					y: scalePos.leftBottomY
+				}, center, angle);
+
+				// 右下顶点的坐标
+				let rightBottom = this.calNewPos({
+					x: scalePos.rightBottomX,
+					y: scalePos.rightBottomY
+				}, center, angle);
+
+				// 返回所有的8个坐标
+				return {
+					leftTopX: leftTop.x,
+					leftTopY: leftTop.y,
+					rightTopX: rightTop.x,
+					rightTopY: rightTop.y,
+					leftBottomX: leftBottom.x,
+					leftBottomY: leftBottom.y,
+					rightBottomX: rightBottom.x,
+					rightBottomY: rightBottom.y,
+					centerX: (scalePos.rightTopX - scalePos.leftTopX) / 2,
+					centerY: (scalePos.rightTopY - scalePos.leftTopY) / 2
+				};
+			},
+			/**
+			 * 计算四个顶点旋转后的旧坐标
+			 *
+			 * @param scalePos  四个顶点未旋转前的坐标系
+			 * @param center    中心点位置
+			 * @param angle     旋转角度
+			 * @return {{leftTopY: string, rightTopX: string, leftTopX: string, leftBottomY: string, rightBottomX: string, rightTopY: string, leftBottomX: string, rightBottomY: string}}
+			 */
+			calOldRocatePos(scalePos, center, angle) {
+				// 左上顶点的坐标
+				let leftTop = this.calOldPos({
+					x: scalePos.leftTopX,
+					y: scalePos.leftTopY
+				}, center, angle);
+
+				// 右上顶点的坐标
+				let rightTop = this.calOldPos({
+					x: scalePos.rightTopX,
+					y: scalePos.rightTopY
+				}, center, angle);
+
+				// 左下顶点的坐标
+				let leftBottom = this.calOldPos({
+					x: scalePos.leftBottomX,
+					y: scalePos.leftBottomY
+				}, center, angle);
+
+				// 右下顶点的坐标
+				let rightBottom = this.calOldPos({
+					x: scalePos.rightBottomX,
+					y: scalePos.rightBottomY
+				}, center, angle);
+
+				// 返回所有的8个坐标
+				return {
+					leftTopX: leftTop.x,
+					leftTopY: leftTop.y,
+					rightTopX: rightTop.x,
+					rightTopY: rightTop.y,
+					leftBottomX: leftBottom.x,
+					leftBottomY: leftBottom.y,
+					rightBottomX: rightBottom.x,
+					rightBottomY: rightBottom.y,
+					centerX: (rightTopX - leftTopX) / 2,
+					centerY: (rightTopY - leftTopY) / 2
+				};
+			},
+			/**
+			 * 读取图片操作
+			 * @param e object 事件
+			 * @return void
+			 */
+			loadbgImage(e) {
+				var id = e.currentTarget.dataset.id;
+				var width = e.detail.width * this.data.pixelRate * this.design_widthrate; //获取图片真实宽度
+				var height = e.detail.height * this.data.pixelRate * this.design_widthrate; //获取图片真实高度
+				var rScale = width / this.data.bgWidth;
+				this.data.loadbgImageheight = height / rScale
+				this.data.loadbgImageheightstate = true
+			},
+			/**
+			 * 部件点击事件
+			 * @param e object 事件
+			 * @return void
+			 */
+			itemClick(e) {
+				this.isShowGif = false;
+				this.isShowMoveMaterial = false;
+
+				this.drag_text_context = "单指可拖拽";
+				this.cutting_text_context = "双指可伸缩";
+
+				// 循环数据找到点击点
+				for (let i = 0; i < items.length; i++) {
+					//关闭点击属性
+					items[i].active = false; //选中状态
+					items[i].activeguide = false // 辅助线状态
+					items[i].activescale = false // 旋转状态
+					items[i].activehorn = false // 角状态
+					items[i].activeedge = false // 边状态
+					if (e.currentTarget.dataset.id == items[i].id) {
+						//记录下标
+						index = i;
+						//开启点击属性
+						items[index].active = true; //选中状态
+						items[index].activeguide = false // 辅助线状态
+						items[index].activescale = true // 旋转状态
+						items[index].activehorn = true // 角状态
+						items[index].activeedge = true // 边状态
+					}
+				}
+				this.active = true
+				this.data.listActive = true
+				this.data.cidx = index
+				// 初始化的位置
+				drag.initPos(items[index])
+			},
+
+			//保存作品初重新初始化位置
+			creatWorkInitPos() {
+				for (let i = 0; i < items.length; i++) {
+					if (items[i].scale != 1)
+						drag.getNewDataInfo(items[i])
+				}
+				this.data.itemList = items;
+			},
+
+			//点击画布区域取消聚焦
+			itemCancel(e) {
+				//uni.showToast({title: "itemCancel",icon: 'none'});
+				//console.log('点击画布区域取消聚焦')
+				this.isShowGif = false;
+				this.isShowMoveMaterial = true;
+
+				this.drag_text_context = "单击可选中";
+				this.cutting_text_context = "双击可裁剪";
+
+
+				//控制中间Gif动画不显示
+				this.$refs['textsettingsshare'].close()
+				if (items.length > 0) {
+					for (let i = 0; i < items.length; i++) {
+						items[i].active = false;
+						items[i].active = false //辅助线
+						items[i].activeguide = false //辅助线
+						items[i].activescale = false // 旋转状态
+						items[i].activehorn = false // 角状态
+						items[i].activeedge = false // 边状态
+					}
+					this.data.itemList = items
+					//赋值 取消边框显示
+					this.data.listActive = false
+					// this.setData({itemList: items});
+					this.active = false
+				}
+				//uni.showToast({title: this.active+"",icon: 'none'});
+			},
+
+			/* 获取编辑区域左边距 */
+			getLeft: function() {
+				//return this.data.bgWidth * 0.3;
+				// return 235 * this.data.pixelRate;
+				return (750 - this.design_width) / 2 * this.data.pixelRate;
+			},
+			/* 获取编辑区域上边距 */
+			getTop: function() {
+				// return this.data.bgHeight * 0.25;
+				return (this.data.bgHeight - this.data.editorHeight) / 2;
+			},
+
+			/* 图片拖动开始事件 */
+			dragStart: function(e) {
+				// 剪切数据
+				this.properties = items[index]
+				// 点击选中部件
+				this.itemClick(e);
+				// 获取当前选中的部件
+				var item = items[index];
+				if (e.touches.length > 1) {
+					//获取作为移动前角度的坐标
+					item.touchX = e.touches[0].clientX;
+					item.touchY = e.touches[0].clientY;
+					// 当两根手指放上去的时候,将距离(distance)初始化。
+					let xMove = e.touches[1].clientX - e.touches[0].clientX;
+					let yMove = e.touches[1].clientY - e.touches[0].clientY;
+					//计算开始触发两个手指坐标的距离
+					item.distance = Math.sqrt(xMove * xMove + yMove * yMove);
+					//获取图片半径
+					item.r = this.computeDistance(item.x, item.y, item.left, item.top);
+				} else {
+					// 记录点击时的坐标值
+					item.startX = e.touches[0].clientX;
+					item.startY = e.touches[0].clientY;
+				}
+				var currentText = '';
+				if (item.type == 1) {
+					currentText = item.content;
+				}
+
+				item.mLeft = item.left;
+				item.mTop = item.top;
+				drag.recordPressDownData(item);
+
+				//赋值
+				this.data.listActive = true
+				this.data.cidx = index
+				this.data.currentText = currentText
+				this.data.itemList = items
+			},
+
+
+
+			/* 图片拖动中事件 */
+			dragMove: function(e) {
+				// 获取当前选中的部件
+				var item = items[index];
+				if (e.touches.length > 1) {
+					
+				} else {
+					drag.dragMove(e, item, this.data, this.editor_top)
+					this.guide_left = true // 开启辅助线
+					this.guide_top = true // 开启辅助线
+					this.delete_wrap_state = true
+					if (e.changedTouches[0].pageY + 80 > this.deleteTop) { //如果图片容器底部距离大于删除框顶部距离就删除图片
+						this.deleteWrap = true
+					} else {
+						this.deleteWrap = false
+					}
+				}
+				this.data.itemList = items //赋值就移动了
+			},
+
+
+			/* 拖动结束事件 */
+			dragEnd: function(e) {
+				//赋值
+				this.guide_top = false
+				this.guide_left = false
+				// 获取当前选中的部件
+				var item = items[index];
+				item.lastScale = item.scale;
+				//属性
+				item.active = true //辅助线
+				item.activeguide = false //辅助线
+				item.activescale = true // 旋转状态
+				item.activehorn = true // 角状态
+				item.activeedge = true // 边状态
+				// 恢复
+				if (item.heart_startX != undefined) {
+					item.startX = item.heart_startX;
+					item.startY = item.heart_startY;
+				}
+				if (item.xheart != undefined) {
+					item.x = item.xheart
+					item.y = item.yheart
+				}
+				//赋值就移动了
+				this.data.itemList = items
+				//赋值
+				// this.data.listActive = false
+				this.saveSnapshot();
+			},
+
+
+			/* 部件缩放开始事件*/
+			scaleStart(e, type) {
+				this.itemClick(e); // 点击选中部件
+				var item = items[index]; // 获取当前选中的部件
+				if (item.support_zoom == 0) return; // 0不支持缩放,1时支持缩放
+				item.typetext = type
+				//获取作为移动前角度的坐标
+				item.touchX = e.touches[0].clientX;
+				item.touchY = e.touches[0].clientY;
+				//获取图片半径
+				item.r = this.computeDistance(item.x, item.y, item.left, item.top);
+				// 记录坐标
+				item.scaleone = item.width / item.height
+				// 获取编辑框的左边距和上边距
+				var mLeft = this.getLeft();
+				var mTop = this.getTop();
+				item.mLeft = mLeft
+				item.mTop = mTop
+
+				drag.recordPressDownData(item);
+
+				//赋值
+				this.data.listActive = true
+			},
+
+
+			/* 部件旋转开始事件 */
+			rotateStart: function(e) {
+				// 点击选中部件
+				this.itemClick(e);
+				// 获取当前选中的部件
+				var item = items[index];
+				item.typetext = 'rotate';
+				//获取作为移动前角度的坐标
+				item.touchX = e.touches[0].clientX;
+				item.touchY = e.touches[0].clientY;
+				// 获取编辑框的左边距和上边距
+				var mLeft = this.getLeft();
+				var mTop = this.getTop();
+				//移动前的角度
+				item.anglePre = this.computeAngle(item.x, item.y, item.touchX - mLeft, item.touchY - mTop);
+				//获取图片半径
+				item.r = this.computeDistance(item.x, item.y, item.left, item.top);
+				//赋值
+				this.data.listActive = true
+			},
+
+			/* 部件缩放中事件 */
+			scaleMove: function(e) {
+				// 获取当前选中的部件
+				var item = items[index];
+				if (item.support_zoom == 0) return; // 0不支持缩放,1时支持缩放
+				//记录移动后的位置
+				item.touchMoveX = e.touches[0].clientX;
+				item.touchMoveY = e.touches[0].clientY;
+				//属性
+				item.active = false //辅助线
+				item.activeguide = false //辅助线
+				item.activescale = false // 旋转状态
+				item.activehorn = true // 角状态
+				item.activeedge = false // 边状态
+				// 获取编辑框的左边距和上边距
+				var mLeft = this.getLeft();
+				var mTop = this.getTop();
+				//移动的点到圆心的距离
+				item.disPtoO = this.computeDistance(item.x, item.y, item.touchMoveX - mLeft, item
+					.touchMoveY -
+					mTop)
+				//手指滑动的点到圆心的距离与半径的比值作为图片的放大比例
+				item.scale = item.disPtoO / item.r;
+				//设置最大缩放为10倍
+				if (Math.abs(item.scale) > 10) {
+					item.scale = 10;
+				}
+				//设置最小缩放为0.3倍
+				if (Math.abs(item.scale) < 0.3) {
+					item.scale = 0.3;
+				}
+				//图片放大响应的右下角按钮同比缩小
+				item.oScale = 1 / item.scale;
+				drag.initPos(item)
+				//赋值setData渲染
+				this.data.itemList = items
+			},
+
+
+			/* 部件旋转中事件 */
+			rotateMove: function(e) {
+				// 获取当前选中的部件
+				var item = items[index];
+				//记录移动后的位置
+				item.touchMoveX = e.touches[0].clientX;
+				item.touchMoveY = e.touches[0].clientY;
+				// 获取编辑框的左边距和上边距
+				var mLeft = this.getLeft();
+				var mTop = this.getTop();
+				//移动的点到圆心的距离
+				item.disPtoO = this.computeDistance(item.x, item.y, item.touchMoveX - mLeft, item
+					.touchMoveY -
+					mTop);
+				//移动后位置的角度
+				item.angleNext = this.computeAngle(item.x, item.y, item.touchMoveX - mLeft, item
+					.touchMoveY -
+					mTop);
+				//角度差
+				item.new_rotate = item.angleNext - item.anglePre;
+				//叠加的角度差
+				item.rotate += item.new_rotate;
+				item.angle = item.rotate; //赋值
+				//用过移动后的坐标赋值为移动前坐标
+				item.touchX = e.touches[0].clientX;
+				item.touchY = e.touches[0].clientY;
+				item.anglePre = this.computeAngle(item.x, item.y, item.touchX - mLeft, item.touchY - mTop);
+				//属性
+				item.active = false //辅助线
+				item.activeguide = true //开启辅助线
+				item.activescale = true // 旋转状态
+				item.activehorn = false // 角状态
+				item.activeedge = false // 边状态
+				// 角度计算
+				let roat = Math.abs(item.angle) % 360
+				if (item.angle < 0) {
+					let multiple = Math.ceil(Math.abs(item.angle) / 360)
+					roat = item.angle + multiple * 360
+				}
+				drag.initPos(item)
+				if (roat <= 5 || roat >= 355) {
+					item.angle = 0.00
+					if (item.angle == 0) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 50 && roat >= 40) {
+					item.angle = 45
+					if (item.angle == 45) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 95 && roat >= 85) {
+					item.angle = 90
+					if (item.angle == 90) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 140 && roat >= 130) {
+					item.angle = 135
+					if (item.angle == 135) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 185 && roat >= 175) {
+					item.angle = 180
+					if (item.angle == 180) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 230 && roat >= 220) {
+					item.angle = 225
+					if (item.angle == 225) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 275 && roat >= 265) {
+					item.angle = 270
+					if (item.angle == 270) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				} else if (roat <= 320 && roat >= 310) {
+					item.angle = 315
+					if (item.angle == 315) {
+						wx.vibrateShort(); // 使手机振动15ms
+					}
+				}
+				//赋值setData渲染
+				this.data.itemList = items
+			},
+
+
+			/* 部件缩放结束事件 */
+			scaleEnd: function(e) {
+				// 获取当前选中的部件
+				var item = items[index];
+				if (item.support_zoom == 0) return; // 0不支持缩放,1时支持缩放
+				item.typetext = null
+				//关闭点击属性
+				item.active = true //辅助线
+				item.activeguide = false // 辅助线状态
+				item.activescale = true // 旋转状态
+				item.activehorn = true // 角状态
+				item.activeedge = true // 边状态
+				//赋值
+				// this.data.listActive = false
+				drag.getTransferPosition(item.left, item.top, item.width, item.height, item.angle, item
+					.centerPos,
+					item)
+				this.saveSnapshot();
+			},
+			/* 部件旋转结束事件*/
+			rotateEnd: function(e) {
+				// 获取当前选中的部件
+				var item = items[index];
+				item.typetext = null;
+				//赋值
+				// this.data.listActive = false
+				//关闭点击属性
+				item.active = true //辅助线
+				item.activeguide = false // 辅助线状态
+				item.activescale = true // 旋转状态
+				item.activehorn = true // 角状态
+				item.activeedge = true // 边状态
+				this.saveSnapshot();
+			},
+
+
+			/**
+			 * 计算手点击坐标到圆心的角度
+			 * @param centerX   圆心的 x 坐标
+			 * @param centerY   圆心的 y 坐标
+			 * @param x         手点击的 x 坐标
+			 * @param y         手点击的 y 坐标
+			 * @returns {number}
+			 */
+			computeAngle: function(centerX, centerY, x, y) {
+				var diffX = x - centerX;
+				var diffY = y - centerY;
+				var rate = Math.abs(diffX / diffY);
+				//鼠标相对于旋转中心的角度
+				var angle = Math.atan(rate) / (2 * Math.PI) * 360;
+				if (diffX < 0 && diffY < 0) { // 右下角,第四象限
+					angle = -angle;
+				} else if (diffX <= 0 && diffY >= 0) { // 左下角,第三象限
+					angle = -(180 - angle)
+				} else if (diffX > 0 && diffY < 0) { // 右上角,第一象限
+					angle = angle;
+				} else if (diffX > 0 && diffY > 0) { // 左上角,第二象限
+					angle = 180 - angle;
+				}
+				return angle;
+			},
+			/**
+			 * 计算触摸点到圆心的距离
+			 * @param centerX   圆心的 x 坐标
+			 * @param centerY   圆心的 y 坐标
+			 * @param x         手点击的 x 坐标
+			 * @param y         手点击的 y 坐标
+			 * @returns {number}
+			 */
+			computeDistance: function(centerX, centerY, x, y) {
+				var diffX = x - centerX;
+				var diffY = y - centerY;
+				return Math.sqrt(diffX * diffX + diffY * diffY);
+			},
+
+			//移除图片
+			removedeleteItem(item, ix) {
+				if (!this.active) {
+					index = items.length - 1
+					items.splice(index, 1); // 删除指定的部件
+					this.setData({
+						'data': this.data
+					});
+					this.saveSnapshot();
+					this.active = false;
+				} else {
+					this.deleteItem(item, ix);
+				}
+			},
+
+			/* 删除部件 */
+			deleteItem: function(item, ix) {
+				// 当前选中的部件
+				var currentItem = items[index];
+				// 判断删除的是否是模板组件
+				if (currentItem.works_id) {
+					this.data.works_idlenght--
+				}
+				let zIndex = items[index].index;
+				let zid = items[index].id;
+				// 删除指定的部件
+				items.splice(index, 1);
+				// 后面的部件index需要减1
+				for (var item of items) {
+					if (item.index > zIndex) {
+						item.index = item.index - 1;
+					}
+				}
+				for (var item of items) {
+					if (item.id > zid) {
+						item.id = item.id - 1;
+					}
+				}
+				this.setData({
+					'data': this.data
+				});
+				this.saveSnapshot();
+				this.active = false
+			},
+
+			//检测文字的输入
+			textInput(content) {
+				if (this.addtext) {
+					let index_id = items.length;
+					items.push({
+						support_zoom: 1, // 0是不支持缩放,为1时支持缩放
+						support_drag: 1, // 0是不支持拖动,为1时支持拖动
+						is_under: 0, //贴图是否为背景图
+						is_discount: 0, //贴图是否用卷
+						id: index_id + 1,
+						type: 1,
+						material_id: 0,
+						index: index_id,
+						font_family: 'SOURCEHANSANSCN-REGULAR.OTF',
+						font_style: '',
+						font_size: '50',
+						font_color: '#000000',
+						under_color: '',
+						content: content, // 文本
+						top: this.editor_top - 74 / 2, // 初始图片Y坐标,根据画布高/2-图片高/2
+						left: 0, // 初始图片X坐标,因为div是相对定位,所以计算是要多减一次移动的距离
+						x: this.data.editorWidth / 2, // 初始圆心位置,可再downImg之后又宽高和初始的图片位置得出
+						y: this.editor_top,
+						scale: 1, // 缩放比例  1为不缩放
+						lastScale: 1, // 上一次的绽放比例
+						oScale: 1, // 缩放比例  1为不缩放
+						fontscale: 1, // 文本缩放比例  1为不缩放
+						angle: 0.00, // 旋转角度
+						rotate: 0.00, // 旋转值
+						active: false, // 判定点击状态
+						width: this.data.editorWidth, // 预设生成图片的宽度
+						height: 74, // 预设生成图片的高度
+						rScale: 1, // 图片原始缩放比例
+					})
+					this.data.itemList = items
+					this.addtext = false
+					this.saveSnapshot();
+					index = items.length - 1
+					this.data.cidx = index
+					this.setData({
+						data: this.data
+					})
+					this.text_awaitone(content)
+				} else {
+					this.text_await(content)
+				}
+			},
+			async text_awaitone(content) {
+				//获取当前选中的部件
+				var item = items[index];
+				item.content = content;
+				var that = this;
+				this.data.currentText = content
+				//赋值
+				//this.data.currentText = e.detail.value
+				this.data.itemList = items
+				await this.setData({
+					data: this.data
+				})
+				var query = wx.createSelectorQuery();
+				query.select('#item-text').boundingClientRect();
+				query.exec(function(res) {
+					var width = res[0].width;
+					var rate = item.width / width;
+					var tmpSize = item.font_size * rate;
+					if (tmpSize > maxFontSize) {
+						item.font_size = maxFontSize;
+						item.height = maxFontSize * heightRate;
+						item.top = item.y - (item.height / 2);
+					} else {
+						item.font_size = item.font_size * rate;
+						item.height = item.height * rate;
+						item.top = item.y - (item.height / 2);
+					}
+					that.setData({
+						data: that.data
+					})
+					that.data.itemList = items
+				})
+			},
+			async text_await(content) {
+				//获取当前选中的部件
+				var item = items[index];
+				//let content = (e.detail.value).replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.\,\?\<\>\。\,\-\——\=\;\@\!\!\+\$]/g, '');
+				if (content != item.content) {
+					item.content = content;
+					var that = this;
+					//赋值
+					this.data.currentText = content
+					this.data.itemList = items
+					await this.setData({
+						data: this.data
+					})
+					var query = wx.createSelectorQuery();
+					query.select('#item-text').boundingClientRect();
+					query.exec(function(res) {
+						var width = res[0].width;
+						var rate = item.width / width;
+						var tmpSize = item.font_size * rate;
+						if (tmpSize > maxFontSize) {
+							item.font_size = maxFontSize;
+							item.height = maxFontSize * heightRate;
+							item.top = item.y - (item.height / 2);
+						} else {
+							item.font_size = item.font_size * rate;
+							item.height = item.height * rate;
+							item.top = item.y - (item.height / 2);
+						}
+						that.setData({
+							data: that.data
+						})
+						that.data.itemList = items
+					})
+				}
+			},
+			//保存当前作品的快照
+			saveSnapshot: function() {
+				var currentSnapshot = JSON.stringify(this.data);
+				var lastSnapshot = "";
+				if (snapshot.length > 0) {
+					lastSnapshot = JSON.stringify(snapshot[snapshotIndex]);
+				}
+				if (currentSnapshot != lastSnapshot) {
+					//清除当前步骤后面的所有步骤
+					if (snapshot.length > 0 && (snapshot.length - 1 > snapshotIndex)) {
+						for (var i = snapshotIndex + 1; i < snapshot.length; i++) {
+							snapshot.pop();
+						}
+					}
+					// 加入快照
+					snapshot.push(currentSnapshot);
+					snapshotIndex = snapshotIndex + 1;
+				}
+			},
+			
+			//上一步功能
+			prev: function() {
+				if (snapshotIndex > 0) {
+					snapshotIndex = snapshotIndex - 1;
+					this.data = JSON.parse(snapshot[snapshotIndex]);
+					items = this.data.itemList;
+					index = this.data.cidx;
+				} else {
+					wx.showToast({
+						title: '已是最上一步',
+						icon: 'success',
+						duration: 2000
+					});
+				}
+			},
+			
+			//下一步
+			next: function() {
+				if (snapshotIndex < snapshot.length - 1) {
+					snapshotIndex = snapshotIndex + 1;
+					this.data = JSON.parse(snapshot[snapshotIndex]);
+					items = this.data.itemList;
+					index = this.data.cidx;
+				} else {
+					wx.showToast({
+						title: '已是最下一步',
+						icon: 'success',
+						duration: 2000
+					});
+				}
+			},
+			
+			//下一层
+			lowerIndex() {
+				var currentItem = items[index]; // 当前选中的部件
+				if (currentItem.index <= 0) {
+					wx.showToast({
+						title: '已经到达最底层',
+						icon: 'success',
+						duration: 2000
+					});
+				} else {
+					if (currentItem.is_under == 1) {
+						//循环当前的组件数据
+						for (var item of items) {
+							if (item.index == currentItem.index - 1) {
+								item.index = item.index + 1;
+								currentItem.index = currentItem.index - 1;
+								this.data.itemList = items
+								this.saveSnapshot();
+								break;
+							}
+
+						}
+					} else {
+						let number_index = 0
+						for (var item of items) {
+							if (item.is_under == 1) {
+								number_index++
+							}
+						}
+						if (currentItem.index <= number_index) {
+							wx.showToast({
+								title: '已经到达最底层',
+								icon: 'success',
+								duration: 2000
+							});
+						} else {
+							//循环当前的组件数据
+							for (var item of items) {
+								if (item.index == currentItem.index - 1) {
+									item.index = item.index + 1;
+									currentItem.index = currentItem.index - 1;
+									this.data.itemList = items
+									// this.setData({itemList:items});
+									this.saveSnapshot();
+									break;
+								}
+							}
+						}
+					}
+				}
+			},
+			
+			//上一层
+			upperIndex() {
+				//当前选中的部件
+				var currentItem = items[index];
+				if (currentItem.index >= items.length - 1) {
+					wx.showToast({
+						title: '已经到达最顶层',
+						icon: 'success',
+						duration: 2000
+					});
+				} else {
+					if (currentItem.is_under == 1) {
+						let number_index = 0
+						for (var item of items) {
+							if (item.is_under == 1) {
+								number_index++
+							}
+						}
+						if (currentItem.index >= number_index - 1) {
+							wx.showToast({
+								title: '已经到达最顶层',
+								icon: 'success',
+								duration: 2000
+							});
+						} else {
+							//循环当前的组件数据
+							for (var item of items) {
+								if (item.index == currentItem.index + 1) {
+									item.index = item.index - 1;
+									currentItem.index = currentItem.index + 1;
+									this.data.itemList = items
+									this.saveSnapshot();
+									break;
+								}
+							}
+						}
+					} else {
+						//循环当前的组件数据
+						for (var item of items) {
+							if (item.index == currentItem.index + 1) {
+								item.index = item.index - 1;
+								currentItem.index = currentItem.index + 1;
+								this.data.itemList = items
+								this.saveSnapshot();
+								break;
+							}
+
+						}
+					}
+				}
+			},
+
+			setData(obj) {
+				let that = this;
+				let keys = [];
+				let val, data;
+				Object.keys(obj).forEach(function(key) {
+					keys = key.split('.');
+					val = obj[key];
+					data = that.$data;
+					keys.forEach(function(key2, index) {
+						if (index + 1 == keys.length) {
+							that.$set(data, key2, val);
+						} else {
+							if (!data[key2]) {
+								that.$set(data, key2, {});
+							}
+						}
+						data = data[key2];
+					})
+				});
+			},
+
+			//获取自定义产品数据详情
+			getCustomDetail() {
+				this.isReady = false;
+				//this.front_image_long = false
+				this.front_image_long = true
+				homeservice.queryList({
+					s: 'Product.getCustomize',
+					id: this.data.goods_id
+				}).then(result => {
+					this.queryPage.goods_category_id = result.goods_category_id //星形接口列表增加,产品分类参数
+					//读取背景图
+					uni.getImageInfo({
+						src: result.front_image,
+						success: (front_image) => {
+							this.data.bgHeight = front_image.height * (this.data.bgWidth / front_image
+								.width) // 画布高度
+							this.editory = result.center_scale * (this.data.bgWidth / front_image
+								.width) //辅助线距离
+							this.front_image_long = true
+						},
+						fail(err) {
+							uni.showToast({
+								icon: "none",
+								title: "网络超时,请重试",
+								duration: 2000
+							});
+							this.front_image_long = true
+						}
+					})
+					this.titlename = this.options.name
+					uni.setNavigationBarTitle({
+						title: this.titlename
+					}) //修改头部名称
+					//}
+					this.data.bgImage = result.front_image // 背景图
+					this.data.bgImage_old = result.front_image_old // 旧背景图
+
+					if (this.$base.surfaceData.surface_type == 0 || this.$base.surfaceData.surface_type == 2) { //默认
+						this.background_color = 'none' //手机底色
+						//this.background_surface_image = result.surface_pic
+					}
+					this.$base.goods_feature_id = result.goods_feature_id
+					this.mix_scale = result.mix_scale //上传图片比率
+					this.design_height = result.design_height // 设计宽度
+					this.design_width = result.design_width // 设计高度
+					this.print_height = result.print_height // 设计基础宽度
+					this.print_width = result.print_width // 设计基础高度
+					this.design_widthrate = result.design_width / result.print_width // 设计区放大宽度比率
+					this.design_heightrate = result.design_height / result.print_height // 设计区放大高度比率
+					this.data.editorWidth = this.design_width * this.data.pixelRate // 设计宽度
+					this.data.editorHeight = this.design_height * this.data.pixelRate // 设计高度
+					this.center_scale = result.center_scale // 设计区中心点比率
+					this.location_scale = result.location_scale // 辅助线比率
+					this.editor_top = this.data.editorHeight * Number(this.location_scale) //辅助线距离
+
+					let scaleWidth = this.data.editorWidth / 100;
+					let scaleHeight = this.data.editorHeight / 185;
+					this.real_print_height = (this.options.HeightIndex / 3) * scaleWidth; // 设计宽度
+					this.real_print_width = (this.options.WidthIndex / 3) * scaleHeight;
+					this.clipLeft = (this.data.editorWidth - this.real_print_width) / 2;
+					this.clipRight = this.clipLeft;
+					this.clipTop = (this.data.editorHeight - this.real_print_height) / 2;
+					this.clipButtom = this.clipTop;
+					this.filletSize = (this.options.fillet / 3) * scaleWidth;
+
+					if (snapshot.length > 0) {
+						let listSnapshot = []
+						snapshot.forEach((item, index) => {
+							let list = JSON.parse(item)
+							list.bgImage = this.data.bgImage
+							list.bgImage_old = this.data.bgImage_old
+							list.goods_id = this.data.goods_id
+							listSnapshot.push(JSON.stringify(list))
+						})
+						snapshot = listSnapshot
+					}
+
+					//背景淡淡消失 
+					setTimeout(function() {
+						this.isReady = true; // 撒礼花特效 
+						var animationDelLots = wx.createAnimation({
+							duration: 400,
+							timingFunction: 'ease-out'
+						})
+						animationDelLots.opacity(0).step()
+						this.setData({
+							translateXState: animationDelLots.export()
+						})
+						let animation = wx.createAnimation({
+							duration: 400,
+							timingFunction: 'ease-out'
+						})
+						animation.opacity(1).step()
+						this.setData({
+							translateHide: animation.export()
+						})
+					}.bind(this), 1000)
+					// 手机顶部盒子离开视线 2s
+					setTimeout(function() {
+						let animationDelLots = wx.createAnimation({
+							duration: 1000,
+							timingFunction: 'ease-out'
+						})
+						animationDelLots.translate(-((this.data.windowWidth - this.data
+								.editorWidth) / 2 +
+							this.data.editorWidth) * 2, 0).step(); //向左移动
+						this.setData({
+							translateLeft: animationDelLots.export()
+						})
+					}.bind(this), 1300)
+
+					let animation = wx.createAnimation({
+						duration: 400,
+						timingFunction: 'ease-out'
+					})
+					animation.opacity(1).step()
+					this.setData({
+						functionHide: animation.export()
+					})
+
+					setTimeout(function() {
+						this.isReady = true;
+					}.bind(this), 400)
+					setTimeout(function() {
+						this.isReady = false;
+						this.isCustomizeComplete = true
+					}.bind(this), 1500)
+
+
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+
+			//获取产品详情数据
+			goodslist() {
+				this.isReady = false;
+				//this.front_image_long = false
+				this.front_image_long = true
+				homeservice.queryList({
+					s: 'Product.detail',
+					id: this.data.goods_id
+				}).then(result => {
+					this.queryPage.goods_category_id = result.goods_category_id //星形接口列表增加,产品分类参数
+					//读取背景图
+					uni.getImageInfo({
+						src: result.front_image,
+						success: (front_image) => {
+							this.data.bgHeight = front_image.height * (this.data.bgWidth / front_image
+								.width) // 画布高度
+							this.editory = result.center_scale * (this.data.bgWidth / front_image
+								.width) //辅助线距离
+							this.front_image_long = true
+						},
+						fail(err) {
+							// uni.showToast({
+							// 	icon: "none",
+							// 	title: "网络超时,请重试",
+							// 	duration: 2000
+							// });
+							this.front_image_long = true
+						}
+					})
+					this.titlename = result.name
+					wx.setNavigationBarTitle({
+						title: result.name
+					}) //修改头部名称
+					this.data.bgImage = result.front_image // 背景图
+					this.data.bgImage_old = result.front_image_old // 旧背景图
+
+					if (this.$base.surfaceData.surface_type == 0 || this.$base.surfaceData.surface_type ==
+						2) { //默认
+						this.background_color = 'none' //手机底色
+						this.background_surface_image = result.surface_pic
+					}
+					this.$base.goods_feature_id = result.goods_feature_id
+					this.mix_scale = result.mix_scale //上传图片比率
+					this.design_height = result.design_height // 设计宽度
+					this.design_width = result.design_width // 设计高度
+					this.print_height = result.print_height // 设计基础宽度
+					this.print_width = result.print_width // 设计基础高度
+					this.design_widthrate = result.design_width / result.print_width // 设计区放大宽度比率
+					this.design_heightrate = result.design_height / result.print_height // 设计区放大高度比率
+					this.data.editorWidth = this.design_width * this.data.pixelRate // 设计宽度
+					this.data.editorHeight = this.design_height * this.data.pixelRate // 设计高度
+					this.center_scale = result.center_scale // 设计区中心点比率
+					this.location_scale = result.location_scale // 辅助线比率
+					this.editor_top = this.data.editorHeight * Number(this.location_scale) //辅助线距离
+
+					if (snapshot.length > 0) {
+						let listSnapshot = []
+						snapshot.forEach((item, index) => {
+							let list = JSON.parse(item)
+							list.bgImage = this.data.bgImage
+							list.bgImage_old = this.data.bgImage_old
+							list.goods_id = this.data.goods_id
+							listSnapshot.push(JSON.stringify(list))
+						})
+						snapshot = listSnapshot
+					}
+
+					//进入页面动画
+					if (this.translateX != 0) {
+						// 初始化位置
+						this.translateX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+							.editorWidth)
+						// 手机壳缓缓移动进入 1s
+						setTimeout(function() {
+							this.translateX = 0
+						}.bind(this), 1000)
+						// 背景淡淡消失 1s
+						setTimeout(function() {
+							this.isReady = true; // 撒礼花特效 
+							var animationDelLots = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animationDelLots.opacity(0).step()
+							this.setData({
+								translateXState: animationDelLots.export()
+							})
+							let animation = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animation.opacity(1).step()
+							this.setData({
+								translateHide: animation.export()
+							})
+						}.bind(this), 2000)
+						//手机顶部盒子离开视线 2s
+						setTimeout(function() {
+							let animationDelLots = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animationDelLots.translate(-((this.data.windowWidth - this.data.editorWidth) /
+								2 + this.data.editorWidth) * 2, 0).step(); //向左移动
+							this.setData({
+								translateLeft: animationDelLots.export()
+							})
+						}.bind(this), 3000)
+
+						//显示功能按钮
+						setTimeout(function() {
+							this.isReady = false; // 消失礼花
+							let animation = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animation.opacity(1).step()
+							this.setData({
+								functionHide: animation.export()
+							})
+						}.bind(this), 4000)
+
+					} else {
+						setTimeout(function() {
+							this.isReady = true;
+						}.bind(this), 200)
+						setTimeout(function() {
+							this.isReady = false;
+						}.bind(this), 4000)
+					}
+
+				}).catch(err => {
+
+					this.goodslistAgain();
+
+					// uni.showToast({
+					// 	title: err.msg,
+					// 	icon: 'none'
+					// });
+
+				});
+			},
+
+
+
+			//获取产品详情数据
+			goodslistAgain() {
+				this.isReady = false;
+				//this.front_image_long = false
+				this.front_image_long = true
+				homeservice.queryList({
+					s: 'Product.detail',
+					id: this.data.goods_id
+				}).then(result => {
+					this.queryPage.goods_category_id = result.goods_category_id //星形接口列表增加,产品分类参数
+					//读取背景图
+					uni.getImageInfo({
+						src: result.front_image,
+						success: (front_image) => {
+							this.data.bgHeight = front_image.height * (this.data.bgWidth / front_image
+								.width) // 画布高度
+							this.editory = result.center_scale * (this.data.bgWidth / front_image
+								.width) //辅助线距离
+							this.front_image_long = true
+						},
+						fail(err) {
+							uni.showToast({
+								icon: "none",
+								title: "网络超时,请重试",
+								duration: 2000
+							});
+							this.front_image_long = true
+						}
+					})
+					this.titlename = result.name
+					wx.setNavigationBarTitle({
+						title: result.name
+					}) //修改头部名称
+					this.data.bgImage = result.front_image // 背景图
+					this.data.bgImage_old = result.front_image_old // 旧背景图
+					if (this.$base.surfaceData.surface_type == 0 || this.$base.surfaceData.surface_type ==
+						2) { //默认
+						this.background_color = 'none' //手机底色
+						this.background_surface_image = result.surface_pic
+					}
+					this.$base.goods_feature_id = result.goods_feature_id
+					this.mix_scale = result.mix_scale //上传图片比率
+					this.design_height = result.design_height // 设计宽度
+					this.design_width = result.design_width // 设计高度
+					this.print_height = result.print_height // 设计基础宽度
+					this.print_width = result.print_width // 设计基础高度
+					this.design_widthrate = result.design_width / result.print_width // 设计区放大宽度比率
+					this.design_heightrate = result.design_height / result.print_height // 设计区放大高度比率
+					this.data.editorWidth = this.design_width * this.data.pixelRate // 设计宽度
+					this.data.editorHeight = this.design_height * this.data.pixelRate // 设计高度
+					this.center_scale = result.center_scale // 设计区中心点比率
+					this.location_scale = result.location_scale // 辅助线比率
+					this.editor_top = this.data.editorHeight * Number(this.location_scale) //辅助线距离
+					if (snapshot.length > 0) {
+						let listSnapshot = []
+						snapshot.forEach((item, index) => {
+							let list = JSON.parse(item)
+							list.bgImage = this.data.bgImage
+							list.bgImage_old = this.data.bgImage_old
+							list.goods_id = this.data.goods_id
+							listSnapshot.push(JSON.stringify(list))
+						})
+						snapshot = listSnapshot
+					}
+					//进入页面动画
+					if (this.translateX != 0) {
+						// 初始化位置
+						this.translateX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+							.editorWidth)
+						// 手机壳缓缓移动进入 1s
+						setTimeout(function() {
+							this.translateX = 0
+						}.bind(this), 1000)
+						// 背景淡淡消失 1s
+						setTimeout(function() {
+							this.isReady = true; // 撒礼花特效 
+							var animationDelLots = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animationDelLots.opacity(0).step()
+							this.setData({
+								translateXState: animationDelLots.export()
+							})
+							let animation = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animation.opacity(1).step()
+							this.setData({
+								translateHide: animation.export()
+							})
+						}.bind(this), 2000)
+						//手机顶部盒子离开视线 2s
+						setTimeout(function() {
+							let animationDelLots = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animationDelLots.translate(-((this.data.windowWidth - this.data.editorWidth) /
+								2 + this.data.editorWidth) * 2, 0).step(); //向左移动
+							this.setData({
+								translateLeft: animationDelLots.export()
+							})
+						}.bind(this), 3000)
+
+						//显示功能按钮
+						setTimeout(function() {
+							this.isReady = false; // 消失礼花
+							let animation = wx.createAnimation({
+								duration: 1000,
+								timingFunction: 'ease-out'
+							})
+							animation.opacity(1).step()
+							this.setData({
+								functionHide: animation.export()
+							})
+						}.bind(this), 4000)
+
+					} else {
+						setTimeout(function() {
+							this.isReady = true;
+						}.bind(this), 200)
+						setTimeout(function() {
+							this.isReady = false;
+						}.bind(this), 4000)
+					}
+				}).catch(err => {
+
+				});
+			},
+
+
+			//查询贴纸跟壁纸系列
+			category(type) {
+				if (type == 2) {
+					this.material_series_list = []
+					this.queryPage.material_series_id = 0
+					this.material_series_currentId = 0
+					this.delete_wrap_state = false
+					this.showone = false
+					this.queryPage.page = 1
+					//查询贴图分类 key=0贴图
+					homeservice.queryList({
+						s: 'Material.category',
+						machine_id: this.machine_id,
+						key: 0,
+						surface_color_series_id: this.$base.surfaceData
+							.surface_color_series_id //色系编号
+					}).then(result => {
+						this.Material_category = result
+						// this.Material_category.unshift({
+						// 	icon: "../../static/image/icon_new_default.png",
+						// 	icon_click: "../../static/image/icon_new_pressed.png",
+						// 	title: "最新"
+						// }, )
+						this.Adlists = this.diy_bannerList
+						this.queryPage.goods_id = this.data.goods_id
+						this.brands = this.Material_category
+						this.currentId = this.currentId_Material;
+						this.currentIndex = this.currentIndex_Material;
+						this.queryPage.s = 'Material.list'
+						this.queryPage.works_category_id = null
+						this.queryPage.material_category_id = null
+						if (this.brands[this.currentId].title == '热门') {
+							this.queryPage.is_hot = '1'
+							this.queryPage.is_new = null
+						} else if (this.brands[this.currentId].title == '最新') {
+							this.queryPage.is_new = '1'
+							this.queryPage.is_hot = null
+						} else {
+							this.queryPage.is_hot = null
+							this.queryPage.is_new = null
+							this.queryPage.material_category_id = this.Material_category[0].id
+							if (this.Material_category_id) {
+								this.queryPage.material_category_id = this.Material_category_id
+							}
+						}
+						if (this.mapping_material_series_currentId != 0) {
+							this.queryPage.material_series_id = this.mapping_material_series_currentId
+							this.material_series_currentId = this.mapping_material_series_currentId
+						}
+						this.MaterialseriesList()
+						this.$nextTick(() => {
+							this.$refs['scrollList'].open({
+								e: 2,
+								queryPage: this.queryPage,
+								val: this.brands[this.currentId].val
+							})
+						})
+					}).catch(err => {
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						})
+					});
+				}
+
+				if (type == 23) {
+					this.material_series_list = []
+					this.queryPage.material_series_id = 0
+					this.material_series_currentId = 0
+					this.delete_wrap_state = false
+					this.showone = false
+					this.queryPage.page = 1
+					//查询壁纸分类 key=1壁纸
+					homeservice.queryList({
+						s: 'Material.category',
+						machine_id: this.machine_id,
+						key: 1,
+						surface_color_series_id: this.$base.surfaceData.surface_color_series_id //色系编号
+					}).then(result => {
+						this.wallpaper_category = result
+						//this.wallpaper_category.unshift({
+						// 	icon: "../../static/image/icon_new_default.png",
+						// 	icon_click: "../../static/image/icon_new_pressed.png",
+						// 	title: "最新"
+						// }, )
+						this.Adlists = this.diy_backList
+						this.queryPage.goods_id = this.data.goods_id
+						this.brands = this.wallpaper_category //壁纸分类
+						this.currentId = this.currentId_wallpaper; /* 控制被选中 */
+						this.currentIndex = this.currentIndex_wallpaper; /* 控制位置 */
+						this.queryPage.s = 'Material.list'
+						this.queryPage.works_category_id = null //作品选中分类id
+						this.queryPage.material_category_id = null //贴图选中分类
+						if (this.wallpaper_material_series_currentId != 0) {
+							this.queryPage.material_series_id = this.wallpaper_material_series_currentId
+							this.material_series_currentId = this.wallpaper_material_series_currentId
+						}
+						if (this.brands[this.currentId].title == '热门') {
+							this.queryPage.is_hot = '1'
+							this.queryPage.is_new = null
+						} else if (this.brands[this.currentId].title == '最新') {
+							this.queryPage.is_new = '1'
+							this.queryPage.is_hot = null
+						} else {
+							this.queryPage.is_hot = null
+							this.queryPage.is_new = null
+							this.queryPage.material_category_id = this.wallpaper_category[0].id
+							if (this.wallpaper_category_id) {
+								this.queryPage.material_category_id = this.wallpaper_category_id
+							}
+						}
+						this.MaterialseriesList()
+						this.$nextTick(() => {
+							this.$refs['scrollList'].open({
+								e: 23,
+								queryPage: this.queryPage,
+							})
+						})
+					}).catch(err => {
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						});
+					});
+				}
+			},
+
+			//查询货到库存
+			getMachineProduct() {
+				homeservice.WorksList({ // 查询货到库存
+					machine_id: this.machine_id,
+					s: 'Product.getMachineProduct'
+				}).then(res => {
+					if (res.length <= 1) {
+						this.data.bgHeight = this.data.windowHeight * (861 / 1196)
+					} else {
+						this.data.bgHeight = this.data.windowHeight * (976 / 1196)
+					}
+					this.getStocklist = res
+				}).catch(err => {
+
+				});
+			},
+
+			getmachine_id() {
+				this.available = this.machineDetail.available //res.available //禁用下订单
+				if (this.available == 0) {
+					this.createWorkstext = '暂时缺货'
+				}
+				//判断配送版
+				if (this.machineDetail.delivery == 1 && this.machineDetail.machine_category_id == "64") {
+					this.isComeDelivery = true;
+				} //key:null
+				this.$base.coupon_flag_desc = this.machineDetail.coupon_flag_desc
+				this.support_pay = this.machineDetail.support_pay //单机版是否支付
+			},
+
+			itemlongtap(e) { //长按事件
+				var item = items[index]; // 获取当前选中的部件
+			},
+
+			orderUpdateSn() {
+				clearInterval(this.orderUpdateTime)
+				this.orderUpdateTime = null
+				this.orderUpdateTime = setInterval(function() {
+					homeservice.queryList({
+						s: 'Order.updateStockTime',
+						machine_id: this.machine_id,
+						sn: this.sn
+					}).then(res => {
+						this.sn = res.sn
+					}).catch(err => {
+						uni.showToast({
+							title: err.msg,
+							icon: 'none'
+						})
+					});
+				}.bind(this), 120000)
+			},
+
+			//获取作品明细
+			getWorkDetail() {
+
+			},
+
+
+
+			itemTouchStart: infoListTouchEvent.start.bind(infoListTouchEvent),
+			itemTouchMove: infoListTouchEvent.move.bind(infoListTouchEvent),
+			itemTouchEnd: infoListTouchEvent.end.bind(infoListTouchEvent),
+			itemTouchCancel: infoListTouchEvent.cancel.bind(infoListTouchEvent)
+		},
+
+		onLoad(options) {
+			this.options = options
+			let app = uni.getSystemInfoSync();
+			//胶囊信息
+			let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
+			this.headheight = app.statusBarHeight + menuButtonInfo.height + (menuButtonInfo.top - app.statusBarHeight) * 2
+			items = []
+			let that = this;
+			this.queryPage.partner_id = this.$base.partner_id;
+			wx.createSelectorQuery().select('.delete-wrap').boundingClientRect(function(rect) {
+				that.setData({
+					deleteTop: rect.top,
+				})
+			}).exec();
+			this.infoListTouchEvent = infoListTouchEvent;
+			this.infoListTouchEvent.bind({
+				doubleTap: function(e) { //是双击事件
+					this.isShowGif = false;
+					if (items[index].type == 0) {
+						that.state = true
+						that.$refs.index.init();
+					}
+				},
+				tap: function(e) {
+					if (items == null || items.length == 0) {
+						that.active = false;
+						that.guide_left = false
+					} else {
+						that.isShowGif = false;
+						that.isShowMoveMaterial = false;
+						that.drag_text_context = "单指可拖拽";
+						that.cutting_text_context = "双指可伸缩";
+						var curTime = e.timeStamp
+						var lastTime = e.currentTarget.dataset
+							.time // 通过e.currentTarget.dataset.time 访问到绑定到该组件的自定义数据
+						if (curTime - lastTime > 0) {
+							if (curTime - lastTime < 300) { //是双击事件
+								if (items[index].type == 0) {
+									that.state = true
+									that.$refs.index.init();
+								}
+							} else {
+								//点击选中部件
+								that.itemClick(e);
+							}
+						}
+						that.lastTapTime = curTime
+					}
+				},
+				touchStart: function(e) { //拖拽开始
+					let item = items[index];
+					that.isRotate = e.touches.length > 1;
+					that.dragStart(e);
+					//底部删除框出现动画
+					that.animation.bottom(0).step()
+					that.setData({
+						animationData: that.animation.export()
+					})
+					that.deleteWrap = false
+				},
+				pressMove: function(e) { //拖拽中
+					let item = items[index];
+					if (item.support_drag == 0) return; // 0不支持拖动,1支持拖动
+					if (!that.isRotate) {
+						that.dragMove(e);
+					}
+				},
+				touchEnd: function(e) { //拖拽结束
+					let item = items[index];
+					that.dragEnd(e)
+					if (item.scale != 1) {
+						//初始化的位置
+						drag.initPosscale(item)
+						drag.getTransferPositionangle(item.left, item.top, item.width, item.height, item.angle,
+							item.centerPos, item)
+						//缩放
+						item.scale = 1;
+						item.lastScale = 1
+						//图片放大响应的右下角按钮同比缩小
+						item.oScale = 1 / item.scale;
+					}
+					//底部删除框出现动画
+					that.animation.bottom(-100).step()
+					that.setData({
+						animationData: that.animation.export()
+					})
+					if (that.deleteWrap == true) {
+						that.deleteItem()
+						that.deleteWrap = false
+					}
+				},
+				touchCancel: function(e) { //手机触摸取消
+					that.isShowGif = false;
+					that.isShowMoveMaterial = true;
+					that.drag_text_context = "单击可选中";
+					that.cutting_text_context = "双击可裁剪";
+					that.$refs['textsettingsshare'].close()
+					if (items.length > 0) {
+						let item = items[index];
+						item.active = false
+						item.activeguide = false //辅助线
+						item.activescale = false // 旋转状态
+						item.activeedge = false // 边状态
+						that.data.itemList = items
+						that.data.listActive = false
+						that.active = false
+						that.guide_left = false;
+						that.deleteWrap = false
+						that.animation.bottom(-100).step()
+						that.setData({
+							animationData: that.animation.export()
+						})
+					}
+				}.bind(this),
+				rotate: function(e) { //双指缩放
+					let item = items[index]; /* && e.touches.length != 2 */
+					if (item.support_zoom == 0) {
+						return
+					}
+					//0不支持缩放,1时支持缩放
+					var oldWidth = (item.width * item.scale) * e.scale
+					if (oldWidth > 1200) {
+						return;
+					}
+					var newScale = Math.max(e.scale * item.lastScale, .01);
+					newScale || (newScale = item.lastScale);
+					//角度
+					item.rotate += e.angle;
+					item.angle = item.rotate;
+					//缩放
+					item.scale = newScale;
+					//图片放大响应的右下角按钮同比缩小
+					item.oScale = 1 / item.scale;
+					item.active = false //辅助线
+					item.activeguide = true //开启辅助线
+					item.activescale = false // 旋转状态
+					item.activehorn = false // 角状态
+					item.activeedge = false // 边状态
+					//赋值setData渲染
+					this.data.itemList = items
+				}.bind(this),
+			})
+			if (options.machineDetail != undefined && options.machineDetail != "") {
+				try {
+					this.machineDetail = JSON.parse(decodeURIComponent(options.machineDetail)); //获取设备详情数据
+					this.diy_upload_menu = this.machineDetail.diy_upload_menu
+				} catch (e) {
+					//TODO handle the exception
+				}
+			}
+			if (options.type) {
+				if (options.type == 3) {
+					this.isCustomize = true;
+					this.translateX = 0;
+				} else {
+					this.isCustomize = false;
+					this.translateX = -400;
+				}
+			}
+			if (options.machine_id != undefined) { // 判断是从设备进来
+				this.machine_id = options.machine_id // 设备id
+				this.queryPage.machine_id = options.machine_id // 设备id
+			}
+			this.machineGetBaseSetting()
+			//获取屏幕宽高
+			wx.getSystemInfo({
+				success: function(res) {
+					let pixelRate = res.windowWidth / 750;
+					that.data.windowWidth = res.windowWidth // 屏幕宽度
+					that.data.windowHeight = res.windowHeight // 屏幕高度
+					that.data.bgWidth = res.windowWidth // 画布宽度
+					that.data.bgHeight = res.windowHeight;
+					that.data.pixelRate = pixelRate // 屏幕宽度比率
+					if (options.works_id == undefined) {
+						if (options.machine_id != undefined) { // 判断是从设备进来
+							that.data.goods_id = options.goods_id // 商品id
+							that.key = options.key
+							that.sn = options.sn // 商品sn
+							that.dict_id = options.dict_id // //产品属性id
+							that.createWorkstext = '立即下单'
+							that.surface_type = that.$base.surfaceData.surface_type
+							that.surfaceName = that.$base.surfaceData.surfaceName
+							if (that.$base.surfaceData.surface_type == 0) { //默认
+								that.background_color = null //手机底色
+							}
+							if (that.$base.surfaceData.surface_type == 1) { //自带壳
+								that.background_color = that.$base.surfaceData.surface_color_id_text //手机底色 
+								//清空历史记录
+								items = []; // 当前显示的图片列表
+								index = 0; // 所点击的图片的索引
+								snapshot = []; // 操作历史记录清空
+								snapshotIndex = -1;
+							}
+							if (that.$base.surfaceData.surface_type == 2) { //定制壳
+								that.background_color = 'none' //手机底色 
+							}
+							if (that.isCustomize) {
+								that.getCustomDetail();
+								that.getmachine_id() // 判断设备是否正常
+							} else {
+								that.goodslist() // 获取产品详情数据
+								that.getmachine_id() // 判断设备是否正常
+								if (options.key != 2) {
+									that.orderUpdateSn() //定时器锁库存
+								}
+							}
+						} else {
+							// 首页进入-默认背景图
+							that.data.goods_id = options.goods_id ? options.goods_id : 21 // 商品id
+							that.goodslist() // 获取产品详情数据
+							that.createWorkstext = '保存'
+						}
+						// 作品分类 贴图分类
+						//that.category()
+					} else {
+						//作品分类 贴图分类
+						//that.category()
+						uni.showLoading({
+							title: '正在加载中...',
+							mask: true
+						})
+						that.works_id = options.works_id
+						if (options.pages == 'detail') {
+							that.createWorkstext = '生成'
+						} else if (options.pages == 'mine') {
+							that.createWorkstext = '更新'
+						}
+						var typefacedata = []
+						// 字体列表
+						homeservice.queryList({
+							s: 'Material.fontFamilyList'
+						}).then(result => {
+							typefacedata = result
+							typefacedata.forEach(item => {
+								item.long = false
+								item.textlong = null
+							})
+						}).catch(err => {});
+						//获取作品数据
+						homeservice.queryList({
+							s: 'Works.detail',
+							id: options.works_id
+						}).then(result => {
+							that.background_color = result.background_color == 'none' ? null : result
+								.background_color
+							that.data.goods_id = result.goods_id
+							that.data.user_id = result.user_id
+							that.shape_image = result.shape_image
+							that.shape_id = result.shape_id //形状id
+							that.shape_price = result.shape_price //形状价格
+							that.queryPage.goods_category_id = result.goods
+								.goods_category_id //星形接口列表增加,产品分类参数
+							that.titlename = result.goods.name
+							wx.setNavigationBarTitle({
+								title: result.goods.name
+							}) //修改头部名称
+							that.data.bgImage = result.goods.front_image // 背景图
+							that.mix_scale = result.goods.mix_scale //上传图片比率
+							that.design_height = result.goods.design_height // 设计宽度
+							that.design_width = result.goods.design_width // 设计高度
+							that.print_width = result.goods.print_width // 设计基础宽度
+							that.print_height = result.goods.print_height // 设计基础高度
+							that.design_widthrate = result.goods.design_width / result.goods
+								.print_width // 设计区放大宽度比率
+							that.design_heightrate = result.goods.design_height / result.goods
+								.print_height // 设计区放大高度比率
+							that.data.editorWidth = that.design_width * pixelRate // 设计宽度
+							that.data.editorHeight = that.design_height * pixelRate // 设计高度
+							that.center_scale = result.goods.center_scale // 设计区中心点比率
+							that.location_scale = result.goods.location_scale // 辅助线比率
+							that.editor_top = that.data.editorHeight * Number(that.location_scale) -
+								0.5 //辅助线距离
+							if (options.pages == 'mine') { //设计师页面进来
+								that.data.template = result.template
+								that.data.template_price = result.template_price
+								that.data.template_user_id = result.template_user_id
+							} else { //集美进来
+								that.data.template = result.id
+								that.data.template_price = result.sales_price
+								that.data.template_user_id = result.user_id
+							}
+							//读取背景图
+							uni.getImageInfo({
+								src: result.goods.front_image,
+								success: (front_image) => {
+									that.data.bgHeight = front_image
+										.height * (that.data.bgWidth / front_image
+											.width) // 画布高度
+									that.editory = result.goods
+										.center_scale * (that.data
+											.bgWidth / front_image.width
+										) //辅助线距离
+									that.front_image_long = true
+									var components = result.component;
+									for (var i = 0; i < components
+										.length; i++) {
+										var item = components[i];
+										var top = item.upper_left_y;
+										var left = item.upper_left_x;
+										if (item.rotate != 0.00) {
+											left = item.center_x - (item.width / 2);
+											top = item.center_y - (item.height / 2);
+										}
+										// 加载字体
+										if (item.type.value == 1) {
+											typefacedata.forEach(itm => {
+												if (itm.id == item.font_dict_id) {
+													loadFont(itm,
+														typefacedata
+													)
+												}
+											})
+										}
+
+										items.push({
+											support_zoom: item
+												.support_zoom, // 0是不支持缩放,为1时支持缩放
+											support_drag: item
+												.support_drag, // 0是不支持拖动,为1时支持拖动
+											is_under: item
+												.is_under ? item
+												.is_under : 0, //贴图是否为背景图
+											is_discount: item
+												.is_discount, //贴图是否用卷
+											idone: item.id,
+											id: i + 1,
+											type: item.type.value,
+											material_id: item
+												.material_id,
+											works_id: item
+												.works_id ? item
+												.works_id : null,
+											original_id: item
+												.original_id,
+											index: item.index,
+											font_family: item
+												.font_family
+												.replace('.ttf', ''),
+											font_dict_id: item
+												.font_dict_id,
+											font_style: item
+												.font_style,
+											font_size: item
+												.font_size *
+												pixelRate *
+												that
+												.design_widthrate,
+											font_color: item
+												.font_color,
+											under_color: item
+												.under_color,
+											content: item
+												.content, // 图片地址
+											top: top * pixelRate *
+												that
+												.design_heightrate,
+											left: left *
+												pixelRate * that
+												.design_widthrate,
+											x: item.center_x *
+												pixelRate * that
+												.design_widthrate,
+											y: item.center_y *
+												pixelRate * that
+												.design_heightrate,
+											scale: 1, // 缩放比例  1为不缩放
+											lastScale: 1, // 上一次的绽放比例
+											oScale: 1, // 缩放比例  1为不缩放
+											angle: parseFloat(item
+												.rotate), // 旋转角度
+											rotate: parseFloat(item
+												.rotate), // 旋转值
+											active: false, // 判定点击状态
+											width: item.width *
+												pixelRate * that
+												.design_widthrate, // 预设生成图片的宽度
+											height: item.height *
+												pixelRate * that
+												.design_heightrate, // 预设生成图片的高度
+											rScale: 1, // 图片原始缩放比例
+											// 新添加属性
+											activeguide: false, // 开启辅助线
+											activescale: false, // 开启旋转状态
+											activehorn: false, // 开启角状态
+											activeedge: false, // 开启边状态
+											initialScale: 1, // 图片缩放比例
+											initialscaling: 1, // 图片初始时缩放比例
+											initialScalex: 1, // 图片宽缩放比例
+											initialScaley: 1, // 图片高缩放比例
+											initialWidth: item
+												.image_width *
+												pixelRate * that
+												.design_widthrate, // 图片原始宽度
+											initialHeight: item
+												.image_height *
+												pixelRate * that
+												.design_heightrate, // 图片原始高度
+											frame_left: null, // 裁剪窗口x
+											image_left: (item
+													.image_left -
+													left) *
+												pixelRate * that
+												.design_widthrate, // 图片x
+											frame_top: null, // 裁剪窗口y
+											image_top: (item
+													.image_top -
+													top) *
+												pixelRate * that
+												.design_heightrate, // 图片y
+										});
+									}
+								}
+							})
+							index = null
+							//赋值
+							that.data.itemList = items
+							uni.hideLoading();
+						}).catch(err => {
+							uni.hideLoading();
+							uni.showToast({
+								title: err,
+								icon: 'none'
+							});
+						});
+					}
+				},
+			});
+		},
+		onShow(obj) {
+
+			if (this.machine_id != null && this.machine_id != "") {
+				this.machineGetBaseSetting();
+			}
+			if (this.options && this.options != null) {
+				if (this.options.type == 3) {
+					this.isCustomize = true;
+					this.data.goods_id = this.options.goods_id // 商品id
+				}
+			}
+
+			if (this.translateX > 0) {
+				this.translateX = 0
+				if (!this.isCustomize) {
+					setTimeout(function() {
+						//背景消失
+						var animationDelLots = wx.createAnimation({
+							duration: 1000,
+							timingFunction: 'ease-out'
+						})
+						animationDelLots.opacity(0).step()
+						this.setData({
+							translateXState: animationDelLots.export()
+						})
+						//手机顶部盒子和旧图显示
+						let animation = wx.createAnimation({
+							duration: 1000,
+							timingFunction: 'ease-out'
+						})
+						animation.opacity(1).step()
+						this.setData({
+							translateHide: animation.export()
+						})
+					}.bind(this), 2000)
+					//手机顶部盒子离开视线
+					setTimeout(function() {
+						let animationDelLots = wx.createAnimation({
+							duration: 2000,
+							timingFunction: 'ease-out'
+						})
+						animationDelLots.translate(-((this.data.windowWidth - this.data.editorWidth) / 2 + this
+							.data.editorWidth) * 2, 0).step(); //向左移动
+						this.setData({
+							translateLeft: animationDelLots.export()
+						})
+					}.bind(this), 3000)
+
+					//显示功能按钮
+					setTimeout(function() {
+						this.isReady = false;
+						let animation = wx.createAnimation({
+							duration: 1000,
+							timingFunction: 'ease-out'
+						})
+						animation.opacity(1).step()
+						this.setData({
+							functionHide: animation.export()
+						})
+					}.bind(this), 5000)
+				}
+			}
+
+			if (this.isCustomize) {
+				if (!this.isUpLoadImage) {
+					this.getCustomDetail();
+				}
+			} else {
+				if (obj) {
+					this.data.goods_id = obj // 商品id
+					//获取产品详情数据
+					this.goodslist()
+				}
+			}
+
+			var _this = this
+			wx.request({
+				url: Env.getBaseURL() + '/api/system_config/detail',
+				method: 'GET',
+				data: {},
+				success: function(res) {
+					_this.system_config = res.data.data
+					// _this.system_config.phone_diy.value = 1
+				}
+			})
+			var animation = wx.createAnimation({
+				duration: 1000,
+				timingFunction: 'ease',
+			})
+			this.animation = animation
+			//壁纸广告KEY:diy_back,贴纸广告KEY:diy_banner
+			homeservice.queryList({
+				s: 'Ad.list',
+				ad_position_key: 'diy_back',
+				machine_id: this.machine_id
+			}).then(result => {
+				this.diy_backList = result
+			}).catch(err => {
+
+			});
+			homeservice.queryList({
+				s: 'Ad.list',
+				ad_position_key: 'diy_banner',
+				machine_id: this.machine_id
+			}).then(result => {
+				this.diy_bannerList = result
+			}).catch(err => {
+
+			});
+			homeservice.queryList({
+				s: 'Ad.list',
+				ad_position_key: 'history_works',
+				machine_id: this.machine_id
+			}).then(result => {
+				this.history_bannerList = result
+			}).catch(err => {});
+
+			//增加是否能点击判断
+			setTimeout(function() {
+				_this.isHasClick = true;
+				//console.log('我是xx')
+			}, 5000);
+		},
+		//卸载程序
+		onUnload() {
+			items = []; // 当前显示的图片列表
+			index = 0; // 所点击的图片的索引
+			snapshot = []; // 操作历史记录
+			snapshotIndex = -1;
+			homeservice.setSnapshot(items)
+			//清除库存续时间接口
+			clearInterval(this.orderUpdateTime)
+			this.orderUpdateTime = null
+		}
+	};
+</script>
+
+<style lang="scss">
+	.translateXClass {
+		transition: all 2s;
+		-webkit-transition: all 2s;
+	}
+
+	page {
+		width: 100%;
+		height: 100%;
+	}
+
+	.page {
+		background: #FFFFFF !important;
+	}
+
+	/* 图片 */
+	image {
+		display: block;
+	}
+
+	/* 容器 */
+	.container {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		width: 100%;
+		height: 100%;
+		justify-content: center;
+		/* justify-content: center; */
+		/* justify-content: center; */
+	}
+
+	/* 部件列表和部件操作列表 */
+	.item-list,
+	.operate-list {
+		width: 280rpx;
+		height: 380rpx;
+		position: absolute;
+		left: 0;
+		right: 0;
+		top: 0;
+		// bottom:0;
+		margin: auto;
+	}
+
+	.item-list {
+		overflow: hidden;
+	}
+
+	.item-text {
+		font-family: '思源黑体 CN';
+		/*font-family: 'PingFang SC Regular';*/
+	}
+
+	.list-active {
+		// outline: #4EE2AE solid 1px;
+	}
+
+	.item-box {
+		position: absolute;
+	}
+
+	.active {
+		// outline: 0.5upx solid #4EE2AE;
+	}
+
+	/* 删除、缩放、旋转操作按钮 */
+	.rotate,
+	.rotate-red,
+	.scale,
+	.close {
+		width: 28px;
+		height: 28px;
+		position: absolute;
+		z-index: 99;
+		// background-image: url('http://tprint.refinecolor.com/static/images/wechat/sprites.png');
+		cursor: pointer;
+	}
+
+	.rotate {
+		background-image: url(../../static/icon/icon_refresh.png);
+		background-size: 100%;
+		right: 0;
+		left: 0;
+		margin: auto;
+		// background-position: -50px -10px;
+	}
+
+	.rotate-red {
+		background-image: url(../../static/icon/icon_refresh_red.png);
+		background-size: 100%;
+		right: 0;
+		left: 0;
+		margin: auto;
+		// background-position: -50px -10px;
+	}
+
+	.scale {
+		background-image: url(../../static/icon/icon_zoom.png);
+		background-size: 100%;
+		transform-origin: center;
+		// background-position: -10px -50px;
+	}
+
+	.frame-left-top-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		left: -30upx;
+		top: -30upx;
+		/*background-color: blue;*/
+	}
+
+
+	.frame-left-top {
+		position: absolute;
+		z-index: 100;
+		width: 30upx;
+		height: 30upx;
+		left: 24upx;
+		top: 24upx;
+		border-left: 6upx solid #864BC3;
+		border-top: 6upx solid #864BC3;
+	}
+
+	.frame-left-top::after,
+	.frame-right-top::after,
+	.frame-left-bottom::after,
+	.frame-right-bottom::after {
+		content: '';
+		position: absolute;
+		left: 0;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		transform: scale(1.5);
+		// border: 1px solid lightgray;
+	}
+
+	.frame-right-top-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		right: -30upx;
+		top: -30upx;
+		/*background-color: blue;*/
+	}
+
+	.frame-right-top {
+		position: absolute;
+		z-index: 100;
+		width: 30upx;
+		height: 30upx;
+		right: 24upx;
+		top: 24upx;
+		border-right: 6upx solid #864BC3;
+		border-top: 6upx solid #864BC3;
+	}
+
+	.frame-left-bottom-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		left: -30upx;
+		bottom: -30upx;
+		/*background-color: blue;*/
+	}
+
+	.frame-left-bottom {
+		position: absolute;
+		z-index: 100;
+		width: 30upx;
+		height: 30upx;
+		left: 24upx;
+		bottom: 24upx;
+		border-left: 6upx solid #864BC3;
+		border-bottom: 6upx solid #864BC3;
+	}
+
+	.frame-right-bottom-wrap {
+		position: absolute;
+		z-index: 100;
+		width: 60upx;
+		height: 60upx;
+		right: -30upx;
+		bottom: -30upx;
+		/*background-color: blue;*/
+	}
+
+	.frame-right-bottom {
+		position: absolute;
+		z-index: 100;
+		width: 30upx;
+		height: 30upx;
+		right: 24upx;
+		bottom: 24upx;
+		border-right: 6upx solid #864BC3;
+		border-bottom: 6upx solid #864BC3;
+	}
+
+	// 四边
+	.left_edge-wrap {
+		position: absolute;
+		z-index: 99;
+		left: -30upx;
+		width: 50upx;
+		height: 100%;
+		top: 0;
+		background: transparent;
+		/*background: red;*/
+	}
+
+
+	.left_edge {
+		position: absolute;
+		z-index: 99;
+		left: 0upx;
+		width: 55upx;
+		height: 55upx;
+		/* background: #864BC3; */
+		top: calc(50% - 20upx);
+	}
+
+	.left_edge::after,
+	.rightedge::after,
+	.topedge::after,
+	.bottomedge::after {
+		content: '';
+		position: absolute;
+		left: 0;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		transform: scale(2);
+		// border: 1px solid lightgray;
+	}
+
+	.rightedge-wrap {
+		position: absolute;
+		z-index: 99;
+		right: -30upx;
+		width: 55upx;
+		height: 100%;
+		background: transparent;
+		top: 0;
+		/*background: red;*/
+	}
+
+	.rightedge {
+		position: absolute;
+		z-index: 99;
+		right: -5upx;
+		width: 55upx;
+		height: 55upx;
+
+		top: calc(50% - 20upx);
+		align-items: center;
+
+	}
+
+	.topedge-wrap {
+		position: absolute;
+		z-index: 99;
+		top: -30upx;
+		width: 100%;
+		height: 55upx;
+		background: transparent;
+		left: 0;
+		right: 0;
+		margin: auto;
+		/*background: red;*/
+	}
+
+	.topedge {
+		position: absolute;
+		z-index: 99;
+		//top: 24upx;
+		width: 55upx;
+		height: 55upx;
+		/*  background: #864BC3; */
+		left: 0;
+		right: 0;
+		top: 10upx;
+		margin: auto;
+	}
+
+	.bottomedge-wrap {
+		position: absolute;
+		z-index: 99;
+		bottom: -30upx;
+		width: 100%;
+		height: 55upx;
+		background: transparent;
+		left: 0;
+		right: 0;
+		margin: auto;
+		/*background: red;*/
+	}
+
+	.bottomedge {
+		position: absolute;
+		z-index: 99;
+		bottom: -15upx;
+		width: 55upx;
+		height: 55upx;
+		/* background: #864BC3; */
+		left: 0;
+		right: 0;
+		margin: auto;
+	}
+
+	// .close {
+	// 	background-image: url(../../static/icon/icon_close.png);
+	// 	background-size: 100%;
+	// 	left: -14px;
+	// 	top: -14px;
+	// 	// background-position: -10px -10px;
+	// }
+
+	// 上一步、下一步按钮
+	.operation {
+		display: flex;
+		justify-items: center;
+		align-items: center;
+		z-index: 99;
+		position: fixed;
+		bottom: 198upx;
+		left: 0;
+	}
+
+	.operation_top {
+		overflow: hidden;
+		width: 89upx;
+		height: 88upx;
+		border-radius: 50%;
+	}
+
+	.operation_bottom {
+		overflow: hidden;
+		width: 89upx;
+		height: 88upx;
+		border-radius: 50%;
+	}
+
+	.toolLeft {
+		position: fixed;
+		top: 400upx;
+		left: 0;
+		width: 100upx;
+
+		.tool_li {
+			width: 100%;
+			height: 100upx;
+
+			.tool_li_img {
+				width: 40upx;
+				height: 40upx;
+				display: block;
+				margin: auto;
+			}
+
+			.tool_li_text {
+				text-align: center;
+				color: #FFFFFF;
+				font-size: 15upx;
+				margin-top: 10upx;
+			}
+		}
+	}
+
+	// 底部工具栏
+	.toolRight {
+		position: fixed;
+		top: 300upx;
+		right: 0;
+		width: 120upx;
+
+		.tool_li {
+			width: 100%;
+			height: 110upx;
+
+			.tool_li_img {
+				width: 44upx;
+				height: 40upx;
+				display: block;
+				margin: auto;
+			}
+
+			.tool_li_text {
+				text-align: center;
+				color: #FFFFFF;
+				font-size: 22upx;
+				margin-top: 10upx;
+			}
+		}
+	}
+
+	.toolBottom {
+		position: fixed;
+		bottom: 0;
+		z-index: 1000;
+		// width: 100%;
+		display: flex;
+		align-items: center;
+		height: 90upx;
+		right: 0;
+		// background: #292933;
+
+		.tool_li {
+			width: 25%;
+
+			.tool_li_img {
+				width: 44upx;
+				height: 40upx;
+				display: block;
+				margin: auto;
+			}
+
+			.tool_li_text {
+				text-align: center;
+				color: #FFFFFF;
+				font-size: 22upx;
+				margin-top: 10upx;
+			}
+		}
+
+		.tool_add {
+			width: 228upx;
+			background: #864BC3;
+			line-height: 90upx;
+			text-align: center;
+			color: #FFFFFF;
+			font-size: 36upx;
+			font-weight: 500;
+			color: #FFFFFF;
+			margin-left: auto;
+			border-radius: 45upx 0 0 45upx;
+		}
+
+		.grey {
+			background: #8F8F94 !important;
+		}
+	}
+
+	.tooltext {
+		position: fixed;
+		bottom: 0;
+		z-index: 1000;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		height: 160upx;
+		background: #292933;
+
+		.tooltext_li {
+			width: 25%;
+
+			.tooltext_li_image {
+				width: 50upx;
+				height: 50upx;
+				display: block;
+				margin: auto;
+			}
+
+			.tooltext_li_text {
+				text-align: center;
+				color: #FFFFFF;
+				font-size: 22upx;
+				margin-top: 10upx;
+			}
+		}
+	}
+
+	/* 底部分享 */
+	.uni-share {
+		position: relative;
+		display: flex;
+		flex-direction: column;
+		z-index: 9999;
+	}
+
+
+	// 分类
+	.scroll-container {
+		box-sizing: border-box;
+		white-space: nowrap;
+		// padding-left: 27upx;
+
+		.scroll-item {
+			text-align: center;
+			// display: inline-block;
+			// margin: 15upx 0upx;
+			height: 90upx;
+		}
+	}
+
+	.material-series-scroll-item {
+		text-align: center;
+		// display: inline-block; 
+		padding: 10upx 20upx;
+		color: #FFFFFF;
+		background: #000;
+		border-radius: 25upx;
+		float: left;
+		margin: 0 10upx 5upx;
+		font-size: 21upx;
+	}
+
+	.material-series-scroll-item-active {
+		background: #864BC3;
+	}
+
+	// 删除
+	.delete-wrap {
+		width: 100%;
+		height: 80px;
+		text-align: center;
+		font-size: 38rpx;
+		background: red;
+		color: #fff;
+		// position: absolute;
+		position: fixed;
+		bottom: -80px;
+		z-index: 999999;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.delete-wrap-active {
+		box-shadow: 0 0 15px #FFFFFF;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/index/js/drag.js b/pages/index/js/drag.js
new file mode 100644
index 0000000..03624fb
--- /dev/null
+++ b/pages/index/js/drag.js
@@ -0,0 +1,832 @@
+const drag = {
+	/**
+	 * 部件缩放中事件四角缩放
+	 */
+	scaleMove(e, item, data, allLineListData, designWidth, designHeight) {
+
+		item.isShowLineV = false; //初始化默认不显示
+		item.isShowLineH = false; //初始化默认不显示
+		var minwwidth = 20
+		var minwheight = 20
+		if (item.type == 0 || item.type == 2) {
+			minwwidth = 20
+			minwheight = 20
+		} else if (item.type == 1) {
+			minwwidth = 20
+			minwheight = 20
+		}
+		item.touchMoveX = e.touches[0].clientX; //记录移动后的x位置
+		item.touchMoveY = e.touches[0].clientY; //记录移动后的y位置
+		//属性
+		item.active = false //辅助线
+		item.activeguide = false //辅助线
+		item.activescale = false // 旋转状态
+		item.activehorn = true // 角状态
+		item.activeedge = false // 边状态
+		let width = item.touchMoveX - item.touchX //计算手指移动x轴距离
+		let height = item.touchMoveY - item.touchY //计算手指移动y轴距离
+		let c = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) //使用三角公式计算边c长度
+		let angle = this.getAngle(width, height) //计算移动位置角度差
+		let rad = (Math.PI / 180) * (angle - item.newRotate) //旋转角度转换公式
+		let diffY = (Math.sin(rad) * c) //计算角度差x轴
+		let diffX = (Math.cos(rad) * c) //计算角度差y轴
+		item.elmX = item.lastElmX
+		item.elmY = item.lastElmY
+		item.elmW = item.lastElmW
+		item.elmH = item.lastElmH
+		let scale = item.elmW / item.elmH; //计算宽高比例
+		let fixed;
+		if (item.typetext == "left-top") {
+			fixed = {
+				x: 'right',
+				y: 'bottom'
+			}
+			diffX = -diffX;
+			item.elmW += diffX //计算高度
+			item.elmH = item.elmW / scale; //计算宽度 对应比例
+		} else if (item.typetext == "left-bottom") {
+			fixed = {
+				x: 'right',
+				y: 'top'
+			}
+			diffX = -diffX
+			item.elmW += diffX //计算高度
+			item.elmH = item.elmW / scale; //计算宽度 对应比例
+		} else if (item.typetext == "right-top") {
+			fixed = {
+				x: 'left',
+				y: 'bottom'
+			}
+			item.elmW += diffX; //计算高度
+			item.elmH = item.elmW / scale; //计算宽度 对应比例
+		} else if (item.typetext == "right-bottom") {
+			fixed = {
+				x: 'left',
+				y: 'top'
+			}
+			item.elmW += diffX; //计算高度
+			item.elmH = item.elmW / scale; //计算宽度 对应比例
+		}
+
+		item.isDrag = true;
+		if (item.elmW < minwwidth) {
+			item.elmW = minwwidth //设置最小宽度
+			item.elmH = item.elmW / scale; //计算高度对应比例
+			if (item.type == 0 || item.type == 2) {
+				item.isDrag = false; //设置四周部件操作控件
+			}
+		}
+
+		if (item.elmH < minwheight) {
+			item.elmH = minwheight; //设置最小高度
+			item.elmW = item.elmH * scale; //计算宽度 对应比例
+			if (item.type == 0 || item.type == 2) {
+				item.isDrag = false; //设置四周部件操作控件
+			}
+		}
+
+		if (item.elmW > 800) {
+			item.elmW = 800 //设置最小宽度
+			item.elmH = item.elmW / scale; //计算高度对应比例
+		}
+
+		if (item.elmH > 800) {
+			item.elmH = 800 //设置最小宽度
+			item.elmW = item.elmH * scale; //计算宽度 对应比例
+		}
+
+		let getNewData = this.fixedTo(item, fixed, item.newRotate) //计算对角差距数据
+		item.elmX = getNewData.x; //赋值x轴新数据
+		item.elmY = getNewData.y; //赋值y轴新数据
+		item.left = item.elmX; //重新赋值左上角x位置
+		item.top = item.elmY; //重新赋值左上角y位置
+		item.width = item.elmW //重新设置宽度
+		item.height = item.elmH //重新设置高度
+
+		let newScale = item.elmH / item.lastElmH //计算新比例
+		item.initialScale = item.lastInitialScale * newScale //乘以对应之前比例
+		item.initialscaling = item.lastInitialscaling * newScale //乘以对应之前比例
+		if (item.lastImageLeft < 0) { //判断是否图片有左右间距
+			item.image_left = item.lastImageLeft * newScale
+		} else {
+			item.image_left = 0
+		}
+		if (item.lastImageTop < 0) { //判断是否图片有上下间距
+			item.image_top = item.lastImageTop * newScale
+		} else {
+			item.image_top = 0
+		}
+
+		item.fontscale = (item.lastFontscale * newScale) //乘以对应之前比例
+		item.font_size = (item.lastFontSize * newScale) //乘以对应之前比例
+		item.lineheight = (item.lastLineheight * newScale) //乘以对应之前比例
+
+		//记录中心位置
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+
+		item.x = item.centerPos.x;
+		item.y = item.centerPos.y;
+
+		item.edgestartX = e.touches[0].clientX; // 获取鼠标按下时光标x的值
+		item.edgestartY = e.touches[0].clientY; // 获取鼠标按下时光标Y的值
+
+		//计算圆角
+		this.getConterScale(item)
+	},
+
+	//计算相差角度
+	getAngle(x, y) {
+		let theta = Math.atan2(y, x) // range (-PI, PI]
+		theta = Math.round((180 / Math.PI) * theta) // rads to degs, range (-180, 180]
+		if (theta < 0) theta = 360 + theta // range [0, 360)
+		return theta
+	},
+
+	//计算位置
+	fixedTo(item, fixed, rotate) {
+		let rect = {
+			top: item.elmY,
+			right: item.elmX + item.elmW,
+			bottom: item.elmY + item.elmH,
+			left: item.elmX
+		}
+		let {
+			x: fixedX,
+			y: fixedY
+		} = this.rotatedPoint(
+			rect,
+			rotate,
+			fixed
+		)
+		let dX = item.fixedX - fixedX
+		let dY = item.fixedY - fixedY
+		return {
+			x: item.elmX + dX,
+			y: item.elmY + dY,
+		}
+	},
+
+
+	/**
+	 * @description: 记录按下数据
+	 */
+	recordPressDownData(item) {
+		item.lastElmX = item.left; //记录按下x轴坐标
+		item.lastElmY = item.top; //记录按下y轴坐标
+		item.lastElmW = item.width; //记录按下宽度
+		item.lastElmH = item.height; //记录按下高度
+		item.lastInitialScale = item.initialScale; //记录按下比例
+		item.lastInitialscaling = item.initialscaling; //记录按下比例
+		item.lastImageLeft = item.image_left; //记录按下图片左距离
+		item.lastImageTop = item.image_top; //记录按下图片上距离
+		item.lastFontscale = item.fontscale; //记录按下字体比例
+		item.lastFontSize = item.font_size; //记录按下字体大小
+		item.lastLineheight = item.lineheight; //记录按下行高
+		let rotate = Math.abs(item.angle) % 360 //计算角度
+		if (item.angle < 0) {
+			let multiple = Math.ceil(Math.abs(item.angle) / 360) //Math.ceil
+			rotate = item.angle + multiple * 360
+		}
+		if (rotate == 360) {
+			rotate = 0;
+		}
+		item.newRotate = rotate; //设置新旋转角度
+		let fixed;
+		if (item.typetext == "left-top") {
+			fixed = {
+				x: 'right',
+				y: 'bottom'
+			}
+		} else if (item.typetext == "left-bottom" || item.typetext == "left") {
+			fixed = {
+				x: 'right',
+				y: 'top'
+			}
+		} else if (item.typetext == "right-top" || item.typetext == "top") {
+			fixed = {
+				x: 'left',
+				y: 'bottom'
+			}
+		} else if (item.typetext == "right-bottom" || item.typetext == "right" || item.typetext == "bottom") {
+			fixed = {
+				x: 'left',
+				y: 'top'
+			}
+		}
+
+		//记录对应坐标点坐标
+		if (fixed != null) {
+			//初始化盒子上下左右位置
+			let rect = {
+				top: item.top,
+				right: item.left + item.width,
+				bottom: item.top + item.height,
+				left: item.left
+			}
+			let fixedCoordinate = this.rotatedPoint(rect, rotate, fixed)
+			item.fixedX = fixedCoordinate.x //记录按下对角x轴坐标
+			item.fixedY = fixedCoordinate.y //记录按下对角y轴坐标
+		}
+	},
+
+
+	//计算旋转后坐标点
+	rotatedPoint(rect, rotate, point) {
+		let {
+			top,
+			right,
+			bottom,
+			left
+		} = rect
+		let rad = (Math.PI / 180) * rotate
+		let cos = Math.cos(rad)
+		let sin = Math.sin(rad)
+		let originX = (right - left) / 2 + left
+		let originY = (bottom - top) / 2 + top
+		let x = rect[point.x]
+		let y = rect[point.y]
+		x -= originX
+		y -= originY
+		return {
+			x: Math.floor((x * cos - y * sin + originX) * 10000) / 10000,
+			y: Math.floor((x * sin + y * cos + originY) * 10000) / 10000,
+		}
+	},
+
+
+	//四边伸缩
+	edgeMove(e, item, data, allLineListData, designWidth, designHeight) {
+
+		//修改属性状态
+		item.active = true //辅助线
+		item.activeguide = false //辅助线
+		item.activescale = false // 旋转状态
+		item.activehorn = false // 角状态
+		item.activeedge = true // 边状态
+		item.isShowLineV = false; //初始化默认不显示
+		item.isShowLineH = false; //初始化默认不显示
+		item.edgemoveX = e.touches[0].clientX; //手指移动后x轴位置
+		item.edgemoveY = e.touches[0].clientY; //手指移动后y轴位置		
+		let width = item.edgemoveX - item.edgestartX //计算手指移动x轴距离
+		let height = item.edgemoveY - item.edgestartY //计算手指移动y轴距离
+		let c = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) //使用三角公式计算边c长度
+		let angle = this.getAngle(width, height) //计算移动位置角度差
+		let rad = (Math.PI / 180) * (angle - item.newRotate) //旋转角度转换公式
+		let diffY = (Math.sin(rad) * c) //计算角度差x轴
+		let diffX = (Math.cos(rad) * c) //计算角度差y轴
+
+		item.elmX = item.lastElmX
+		item.elmY = item.lastElmY
+		item.elmW = item.lastElmW
+		item.elmH = item.lastElmH
+
+		let fixed;
+		if (item.typetext == "left") { //左
+			fixed = {
+				x: 'right',
+				y: 'top'
+			}
+			item.elmW += diffX * (-1) //计算宽度
+		} else if (item.typetext == "top") { //下
+			fixed = {
+				x: 'left',
+				y: 'bottom'
+			}
+			item.elmH += diffY * (-1) //计算高度
+		} else if (item.typetext == "right") { //右
+			fixed = {
+				x: 'left',
+				y: 'top'
+			}
+			item.elmW += diffX * (1) //计算宽度
+		} else if (item.typetext == "bottom") { //下
+			fixed = {
+				x: 'left',
+				y: 'top'
+			}
+			item.elmH += diffY * (1) //计算高度
+		}
+
+		if (item.elmW < 20) {
+			item.elmW = 20
+		}
+		if (item.elmH < 20) {
+			item.elmH = 20
+		}
+
+		let getNewData = this.fixedTo(item, fixed, item.newRotate) //计算对角差距数据
+		item.elmX = getNewData.x; //赋值x轴新数据
+		item.elmY = getNewData.y; //赋值y轴新数据
+		item.left = item.elmX; //重新赋值左上角x位置
+		item.top = item.elmY; //重新赋值左上角y位置
+		item.width = item.elmW //重新设置宽度
+		item.height = item.elmH //重新设置高度
+
+		let newScale = 1;
+		if (item.typetext == "right") {
+
+			let right = designWidth - (item.left + item.width);
+			item.left = item.elmX; //重新赋值左上角x位置
+			item.width = item.elmW //重新设置宽度
+			newScale = item.elmW / item.lastElmW //计算新比例
+			if (newScale > 1) { //开始放大处理
+				let newWidthScale = Math.abs((item.elmW - item.lastElmW) / item.initialWidth);
+				item.initialScale = item.lastInitialScale + newWidthScale //乘以对应之前比例
+				item.initialscaling = item.lastInitialscaling + newWidthScale //乘以对应之前比例
+			}
+
+		} else if (item.typetext == "left") {
+
+			newScale = item.elmW / item.lastElmW //计算新比例
+			let distanceLeft = 0
+			if (item.lastImageLeft > 0) {
+				distanceLeft = 0;
+			} else {
+				distanceLeft = item.lastImageLeft + (item.elmW - item.lastElmW);
+			}
+			if (distanceLeft < 0) {
+				item.image_left = distanceLeft;
+			} else {
+				item.image_left = 0;
+				let newWidthScale = distanceLeft / item.initialWidth;
+				item.initialScale = item.lastInitialScale + newWidthScale //乘以对应之前比例
+				item.initialscaling = item.lastInitialscaling + newWidthScale //乘以对应之前比例
+			}
+
+		} else if (item.typetext == "top") {
+
+			newScale = item.elmH / item.lastElmH //计算新比例
+			let distanceTop = 0
+			if (item.lastImageTop > 0) {
+				distanceTop = 0;
+			} else {
+				distanceTop = item.lastImageTop + (item.elmH - item.lastElmH);
+			}
+
+			if (distanceTop < 0) {
+				item.image_top = distanceTop;
+			} else {
+				item.image_top = 0;
+				let newHeightScale = distanceTop / item.initialHeight;
+				item.initialScale = item.lastInitialScale + newHeightScale //乘以对应之前比例
+				item.initialscaling = item.lastInitialscaling + newHeightScale //乘以对应之前比例
+			}
+
+		} else if (item.typetext == "bottom") {
+
+			let buttom = designHeight - (item.top + item.height);
+			newScale = item.elmH / item.lastElmH //计算新比例
+			if (newScale > 1) { //开始放大处理
+				let newHeightScale = Math.abs((item.elmH - item.lastElmH) / item.initialHeight);
+				item.initialScale = item.lastInitialScale + newHeightScale //乘以对应之前比例
+				item.initialscaling = item.lastInitialscaling + newHeightScale //乘以对应之前比例
+			}
+		}
+		item.left = item.elmX; //重新赋值左上角x位置
+		item.top = item.elmY; //重新赋值左上角y位置
+		item.left = item.elmX; //重新赋值左上角x位置
+		item.top = item.elmY; //重新赋值左上角y位置
+		item.width = item.elmW //重新设置宽度
+		item.height = item.elmH //重新设置高度
+
+		//记录中心位置
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+
+		item.x = item.centerPos.x;
+		item.y = item.centerPos.y;
+
+		//计算圆角
+		this.getConterScale(item)
+	},
+
+
+	/**
+	 * @description: 初始化targetObj的位置
+	 */
+	initPos(item) {
+		if (item == null) {
+			return
+		}
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+		item.x = item.centerPos.x;
+		item.y = item.centerPos.y;
+		item.scaleone = item.width / item.height
+		item.initCenterPos = item.centerPos
+	},
+
+	/**
+	 * @description: 计算移动前坐标值
+	 */
+	getRotatedPoint(curPos, centerPos, angle) {
+
+		let radian = Math.PI / 180 * angle;
+		return {
+			x: Math.floor((curPos.x - centerPos.x) * Math.cos(radian) - (curPos.y - centerPos.y) * Math.sin(
+				radian) + centerPos.x),
+			y: Math.floor((curPos.y - centerPos.y) * Math.cos(radian) + (curPos.x - centerPos.x) * Math.sin(
+				radian) + centerPos.y)
+		}
+	},
+
+	/**
+	 * @description: 计算变换后的方框四个角的位置
+	 */
+	getTransferPosition(left, top, width, height, angle, center, item) {
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+		item.x = item.centerPos.x;
+		item.y = item.centerPos.y;
+	},
+
+	/**
+	 * 计算触摸点到圆心的距离
+	 * @param centerX   圆心的 x 坐标
+	 * @param centerY   圆心的 y 坐标
+	 * @param x         手点击的 x 坐标
+	 * @param y         手点击的 y 坐标
+	 * @returns {number}
+	 */
+	computeDistance: function(centerX, centerY, x, y) {
+		var diffX = x - centerX;
+		var diffY = y - centerY;
+		return Math.sqrt(diffX * diffX + diffY * diffY);
+	},
+
+	/**
+	 * @description: 初始化targetObj的位置
+	 */
+	initPosscale(item) {
+		item.fontscale = item.fontscale * item.scale
+		item.font_size = item.font_size * item.scale
+		item.lineheight = item.lineheight * item.scale
+		item.left = item.left - (item.width * item.scale - item.width) / 2
+		item.top = item.top - (item.height * item.scale - item.height) / 2
+		item.width = item.width * item.scale
+		item.height = item.height * item.scale
+		item.initialWidth = item.initialWidth * item.scale
+		item.initialHeight = item.initialHeight * item.scale
+		item.image_top = item.image_top * item.scale
+		item.image_left = item.image_left * item.scale
+		//记录中心位置
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+		item.scaleone = item.width / item.height
+		item.initCenterPos = item.centerPos
+	},
+
+	/**
+	 * @description: 计算变换后的方框四个角的位置
+	 */
+	getTransferPositionangle(left, top, width, height, angle, center, item) {
+		// 计算变换后的方框四个角的位置
+	},
+
+	/**
+	 * 自创建新数据
+	 */
+	getNewDataInfo(item) {
+
+		//记录中心位置
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+
+		item.x = item.centerPos.x;
+		item.y = item.centerPos.y;
+
+		item.startX = item.x;
+		item.startY = item.y;
+
+		let moveXDistance = item.startX + 0.01;
+		let moveYDistance = item.startY + 0.01;
+
+		item.moveX = moveXDistance;
+		item.moveY = moveYDistance;
+
+		//追加改动值
+		item.left += item.moveX - item.startX; // x方向
+		item.top += item.moveY - item.startY; // y方向
+
+		item.x = item.left + item.width / 2;
+		item.y = item.top + item.height / 2;
+
+		item.xheart = item.left + (item.width) / 2 // 方块圆心
+		item.yheart = item.top + (item.height) / 2 // 方块圆心
+		item.heart_startX = moveXDistance; // 用于恢复startX数据
+		item.heart_startY = moveYDistance; // 用于恢复startY数据
+
+		let roat = Math.abs(item.angle) % 360
+		if (item.angle < 0) {
+			let multiple = Math.ceil(Math.abs(item.angle) / 360)
+			roat = item.angle + multiple * 360
+		}
+		this.initPos(item)
+	},
+
+
+	/**
+	 * 断是否吸取功能数据 
+	 * item  选中对象
+	 * allLineListData 所有数据集合
+	 */
+	getIshasDrawData(item, allLineListData) {
+		//初始化选中对象左上角坐标位置
+		var pos = {
+			left: item.left,
+			top: item.top
+		};
+		//初始化选中坐标数据
+		var chosenGuides = {
+			top: {
+				dist: 5,
+			},
+			left: {
+				dist: 5,
+			}
+		};
+		//查询出来选择item坐标数据
+		let selectLineListData = this.addallLineListDataXAndY(item)
+		//循环对比坐标点寻找位置
+		if (allLineListData != null && allLineListData.length > 0 && selectLineListData != null &&
+			selectLineListData.length > 0) {
+			allLineListData.forEach((guide, i) => {
+				selectLineListData.forEach((elemGuide, i) => {
+					if (guide.type == elemGuide.type) {
+						var prop = guide.type == "h" ? "top" : "left";
+						var d = Math.abs(elemGuide[prop] - guide[prop]);
+						if (d < chosenGuides[prop].dist) {
+							chosenGuides[prop].dist = d;
+							chosenGuides[prop].offset = elemGuide[prop] - pos[prop];
+							chosenGuides[prop].guide = guide;
+						}
+					}
+				});
+			});
+		}
+		return chosenGuides;
+	},
+
+
+
+
+	/**
+	 * 图片拖动中事件
+	 */
+	dragMove(e, item, data, editor_top) {
+
+		item.isShowLineV = false;
+		item.isShowLineH = false;
+		let mouseX = e.touches[0].clientX;
+		let mouseY = e.touches[0].clientY;
+		item.elmX = item.lastElmX
+		item.elmY = item.lastElmY
+		item.elmW = item.lastElmW
+		item.elmH = item.lastElmH
+		let diffX = mouseX - item.startX
+		let diffY = mouseY - item.startY
+		let dX = diffX
+		let dY = diffY
+
+		item.elmX += diffX
+		item.elmY += diffY
+
+		item.left = item.elmX
+		item.top = item.elmY
+
+		if (item.newRotate == 0) {
+			if (item.left > (data.editorWidth / 2 - 5) && item.left < (data.editorWidth / 2 + 5)) {
+				/* 辅助线左侧磁性吸附 */
+				item.elmX = data.editorWidth / 2
+			} else if (item.left > (data.editorWidth / 2 - item.width - 5) && item.left < (data.editorWidth / 2 - item.width + 5)) {
+				/* 辅助线右侧磁性吸附 */
+				item.elmX = data.editorWidth / 2 - item.width
+			} else if (item.left > -5 && item.left < 5) {
+				//裁剪区左边框磁性吸附
+				item.elmX = 0
+			} else if (item.left > data.editorWidth - item.width - 5 && item.left < data.editorWidth - item.width + 5) {
+				// 裁剪区右边框磁性吸附
+				item.elmX = data.editorWidth - item.width
+			} else if (item.left > ((data.editorWidth - item.width) / 2 - 5) && item.left < ((data.editorWidth - item.width) / 2 + 5)) {
+				/* 辅助线居中磁性吸附 */
+				item.elmX = (data.editorWidth - item.width) / 2
+				//wx.vibrateShort();
+			}
+		}
+
+		if (item.newRotate == 0) {
+			if (item.top > (editor_top - item.height - 5) && item.top < (editor_top - item.height + 5)) {
+				/*辅助线下边框磁性吸附 */
+				item.elmY = editor_top - item.height
+			} else if (item.top > -5 && item.top < 5) {
+				//裁剪区上边框磁性吸附
+				item.elmY = 0
+			} else if (item.top > data.editorHeight - item.height - 5 && item.top < data.editorHeight - item.height + 5) {
+				//裁剪区下边框磁性吸附
+				item.elmY = data.editorHeight - item.height
+			} else if (item.top > (editor_top - (item.height / 2) - 5) && item.top < (editor_top - (item.height / 2) + 5)) {
+				/*辅助线居中磁性吸附 */
+				item.elmY = editor_top - (item.height / 2)
+				//wx.vibrateShort();
+			}
+		}
+
+		item.left = item.elmX
+		item.top = item.elmY
+
+		//记录中心位置
+		item.centerPos = {
+			x: item.left + item.width / 2,
+			y: item.top + item.height / 2
+		}
+		item.x = item.centerPos.x;
+		item.y = item.centerPos.y;
+	},
+
+
+	//添加所有参考线x轴y轴
+	addallLineListDataXAndY(item) {
+
+		if (item.angle != 0) {
+			var center = {
+				x: item.left + (item.width) / 2,
+				y: item.top + (item.height) / 2
+			};
+			var topLeft = {
+				x: item.left,
+				y: item.top
+			};
+			var topRight = {
+				x: item.left + item.width,
+				y: item.top
+			};
+			var bottomleft = {
+				x: item.left,
+				y: item.top + item.height
+			};
+			var bottomRight = {
+				x: item.left + item.width,
+				y: item.top + item.height
+			};
+			var point1 = this.calNewPos(topLeft, center, item.angle);
+			var point2 = this.calNewPos(topRight, center, item.angle);
+			var point3 = this.calNewPos(bottomleft, center, item.angle);
+			var point4 = this.calNewPos(bottomRight, center, item.angle);
+			return [{
+					type: "h",
+					left: point1.x,
+					top: point1.y
+				}, {
+					type: "h",
+					left: point2.x,
+					top: point2.y
+				}, {
+					type: "h",
+					left: point3.x,
+					top: point3.y
+				}, {
+					type: "h",
+					left: point4.x,
+					top: point4.y
+				},
+				{
+					type: "v",
+					left: point1.x,
+					top: point1.y
+				},
+				{
+					type: "v",
+					left: point2.x,
+					top: point2.y
+				},
+				{
+					type: "v",
+					left: point3.x,
+					top: point3.y
+				},
+				{
+					type: "v",
+					left: point4.x,
+					top: point4.y
+				},
+			];
+		} else {
+			return [{
+					type: "h",
+					left: item.left,
+					top: item.top
+				},
+				{
+					type: "h",
+					left: item.left,
+					top: item.top + item.height
+				},
+				{
+					type: "v",
+					left: item.left,
+					top: item.top
+				},
+				{
+					type: "v",
+					left: item.left + item.width,
+					top: item.top
+				},
+				{
+					type: "h",
+					left: item.left,
+					top: item.top + (item.height) / 2
+				},
+				{
+					type: "v",
+					left: item.left + (item.width) / 2,
+					top: item.top
+				}
+			]
+		}
+	},
+
+	/* 通过旧坐标、旋转角度、圆心计算旋转后点的新坐标 */
+	calNewPos(origin, center, angle) {
+		// 计算
+		let radian = Math.PI / 180 * angle;
+		let newX = (origin.x - center.x) * Math.cos(radian) - (origin.y - center.y) *
+			Math.sin(radian) + center.x;
+		let newY = (origin.y - center.y) * Math.cos(radian) + (origin.x - center.x) *
+			Math.sin(radian) + center.y;
+		// 取10位小数
+		newX = newX.toFixed(4)
+		newY = newY.toFixed(4)
+		return {
+			x: newX,
+			y: newY
+		};
+	},
+
+	/**
+	 * 拖动修改x轴y轴坐标中事件
+	 */
+	dragMoveUpdateXAndY(clientX, clientY, item) {
+		let moveXDistance = item.startX + clientX;
+		let moveYDistance = item.startY + clientY;
+
+		item.moveX = moveXDistance; //移动x轴位置
+		item.moveY = moveYDistance; //移动y轴位置
+
+		item.left += item.moveX - item.startX; // x方向
+		item.top += item.moveY - item.startY; // y方向
+		item.x += item.moveX - item.startX; // 方块圆心
+		item.y += item.moveY - item.startY; // 方块圆心
+
+		// 磁性吸附部分
+		item.xheart = item.left + (item.width) / 2 // 方块圆心
+		item.yheart = item.top + (item.height) / 2 // 方块圆心
+		item.heart_startX = moveXDistance; // 用于恢复startX数据
+		item.heart_startY = moveYDistance; // 用于恢复startY数据
+
+		this.initPos(item)
+
+		item.startX = moveXDistance;
+		item.startY = moveYDistance;
+
+		// 恢复
+		if (item.heart_startX != undefined) {
+			item.startX = item.heart_startX;
+			item.startY = item.heart_startY;
+		}
+		if (item.xheart != undefined) {
+			item.x = item.xheart
+			item.y = item.yheart
+		}
+	},
+
+	//计算圆角缩放比例
+	getConterScale(item) {
+		let scale = 0;
+		if (item.isFillet) {
+			let imageWid = item.width
+			let imageHei = item.height
+			if (imageHei > imageWid) {
+				scale = imageHei / 2;
+			} else {
+				scale = imageWid / 2;
+			}
+		}
+		item.conterScale = scale;
+	},
+
+}
+
+export default drag
diff --git a/pages/index/mall.vue b/pages/index/mall.vue
new file mode 100644
index 0000000..d4aeff9
--- /dev/null
+++ b/pages/index/mall.vue
@@ -0,0 +1,730 @@
+<template>
+	<view class="full-width">
+		<!-- 自定义头部 -->
+		<view class='flex commonHead' :style="{height: titleHeight +'px'}">
+			<view class='commonHead-wrap flex'>
+				<view class='commonHead_left' @click="tomine()">
+					<view class='commonHead_left_back'>
+						<view class="commonHead_left_back_img">
+							<image :src="portraitUrl" style="width: 50upx; height: 50upx; border-radius: 30upx; margin-top: 10upx; background: #FFFFFF; "
+								 mode="aspectFill"></image>
+						</view>
+					</view>
+				</view>
+				<view class='commonHead_right flex'>
+					<view class='commonHead_right_text line1'>手机壳定制站</view>
+				</view>
+			</view>
+		</view>
+		<!-- 无设备 -->
+		<view v-if="long && LoupanList.length == 0" style="min-height: 100%;">
+			<view class="start" style="padding-top: 200upx;">
+				<image src="../../static/home_icon_default_no.png" mode="aspectFill" class="start_img"></image>
+				<view class="start_title">啊嘞,附近没有手机壳定制站哦</view>
+			</view>
+			<image src="../../static/logo.jpg" mode="aspectFill" style="width: 664upx;
+				height: 757upx;opacity: 0.03; position: absolute; left: 0; bottom: 0;z-index: -1;"></image>
+			<view @click="experience()" style="width: 230upx; height: 70upx; line-height: 70upx; text-align: center; color: #FFFFFF;
+			margin:40upx auto 0; border-radius: 35upx; background: linear-gradient(to right,#834DC4,#1983D7);">
+				再找一找
+			</view>
+			<!-- 定制体验 -->
+			<view v-if="system_config.phone_diy.value == 0" @click="doubleTap" @touchstart="touchStart"
+				@touchend="touchEnd" style="width: 500upx; position: fixed; bottom:100upx; margin: auto; 
+			height: 164upx; background: #131319; left: 0; right: 0; z-index: 99; border-radius: 20upx; 
+			display: flex; align-items: center;">
+				<view style="background: #282A32; width: 120upx;
+					height: 120upx;border-radius: 50%; margin: 22upx 30upx 22upx 46upx;text-align: center;">
+					<image style="width: 63upx; height: 27upx; margin:46upx auto; display: inline-block;"
+						src="../../static/mine/icon_diy.png" mode=""></image>
+				</view>
+				<view style="color: #FFFFFF; font-size: 36upx;">定制体验</view>
+			</view>
+		</view>
+		<!-- 有设备 -->
+		<view v-if="LoupanList.length > 0">
+			<view style="margin-top: 29upx;">
+				<view style="width: 690upx; margin:30upx auto 30upx; display: flex;">
+					<view>
+						<view style="position: relative; width: 320upx; height: 160upx;" @click="order()">
+							<image src="../../static/main/dingdan@3x.png" mode=""
+								style="width: 320upx; height: 160upx; position: absolute;z-index: -1;"></image>
+							<view
+								style="margin-left:26upx; padding-top: 27upx; font-size: 36upx; color: #FFFFFF;font-weight: bold;">
+								订单</view>
+							<view style="margin-top: 15upx;margin-left:26upx;font-size: 24upx;
+								font-weight: 400; color: #FFFFFF;">我的定制</view>
+						</view>
+						<view style="margin-top: 16upx; position: relative;width: 320upx; height: 160upx;"
+							@click="coupons()">
+							<image src="../../static/main/huayihua@3x.png" mode=""
+								style="width: 320upx; height: 160upx; position: absolute;z-index: -1;"></image>
+							<view
+								style="margin-left:26upx; padding-top: 27upx; font-size: 36upx; color: #FFFFFF;font-weight: bold;">
+								滑一滑</view>
+						</view>
+					</view>
+					<view style="margin-left: 15upx;width: 350upx; height: 340upx;" @click="tomine()">
+						<image src="../../static/main/wo@3x.png" mode=""
+							style="width: 350upx; height: 340upx; position: absolute;z-index: -1;"></image>
+						<view
+							style="margin-left:30upx; padding-top: 39upx; font-size: 36upx; color: #FFFFFF;font-weight: bold;">
+							个人中心</view>
+						<view style="margin-top: 15upx;margin-left:30upx;font-size: 24upx;
+							font-weight: 400; color: #FFFFFF;">更多作品更多精彩</view>
+					</view>
+				</view>
+				<!-- v-if="system_config.phone_diy.value == 0" -->
+				<view v-if="system_config.phone_diy.value == 0" @tap="doubleTap" @touchstart="touchStart"
+					@touchend="touchEnd"
+					style="position: fixed; z-index: 99; right: 0; bottom: 524upx; display: flex;align-items: center;justify-content: center;
+				   width: 100upx; height: 88upx; background: linear-gradient(92deg, #178CE6, #984ACE); border-radius: 44upx 0px 0px 44upx;">
+					<view style="font-size: 24upx; font-weight: 800; color: #FFFFFF;">
+						<view>定制</view>
+						<view>体验</view>
+					</view>
+				</view>
+				<!-- 附近定制站 -->
+				<view style="font-size: 36upx; margin-top: 40upx; margin-left: 40upx; font-weight: bold; color: #FFFFFF;">附近定制站</view>
+				<view style="width: 690upx; margin: 30upx auto 0; background: #131319; border-radius: 10upx;">
+					<view v-for="(item, index) in LoupanList" :key="index" @click="goMachineDetail(item)">
+						<view v-if="index != 0" style="width: 689upx; height: 1upx; background: #CCCCCC; opacity: 0.1;">
+						</view>
+						<view
+							style="height: 160upx; display: flex; align-items: center; padding: 29upx 20upx 30upx 19upx;">
+							<image
+								style="width: 160upx; height: 164upx; margin: 0upx 21upx 0upx 0upx; border-radius: 10upx;"
+								mode="aspectFill" :src="item.image + '?x-oss-process=image/resize,lfit,w_375'"></image>
+							<view style="width: calc(100% - 281upx);">
+								<view style="margin: 5upx 0 10upx; font-size: 32upx; font-weight: 500; color: #FFFFFF;
+								width: 90%; white-space: nowrap;  text-overflow: ellipsis; overflow: hidden; word-break: break-all;"
+									:style="{opacity:item.status.value == 1 || item.status.value == 2  ? '1' : '0.4'}">
+									{{item.short_name || ''}}
+								</view>
+								<view style="font-size: 24upx; font-weight: 500; color: #FFFFFF; opacity: 0.4;">
+									营业时间:{{item.start_time || ''}}-{{item.end_time || ''}}
+								</view>
+								<view style="margin: 28upx 0 10upx;">
+									<!-- 设备状态 0:离线 1:正常 2:生产中 3:故障 4:调试 5:升级中 -->
+									<!-- 正常、打印中:正在定制,其他的都是:休息中 -->
+									<text v-if="item.status.value == 0" class="statuslist"
+										style="background:#F2A03E;">正在休息</text>
+									<text v-if="item.status.value == 1" class="statuslist"
+										style="background:#5CE6B5;">正在定制</text>
+									<text v-if="item.status.value == 2" class="statuslist"
+										style="background:#5CE6B5;">正在定制</text>
+									<text v-if="item.status.value == 3" class="statuslist"
+										style="background:#F2A03E;">正在休息</text>
+									<text v-if="item.status.value == 4" class="statuslist"
+										style="background:#F2A03E;">正在休息</text>
+									<text v-if="item.status.value == 5" class="statuslist"
+										style="background:#F2A03E;">正在休息</text>
+								</view>
+							</view>
+							<view @click.stop="toLocation(item)" v-if="item.distance"
+								style="width: 100upx;margin-left:auto;">
+								<view
+									style="width: 60upx; height: 60upx; background: #FFFFFF; border-radius: 50%; margin: auto;">
+									<view class="iconfont iconditu" style="color: #5E93F9; font-size: 32upx; 
+									line-height: 60upx; text-align: center;"></view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>	
+		</view>
+	</view>
+</template>
+
+<script>
+	import Env from '@/util/Env.js';
+	import userService from '@/service/UserService';
+	import homeservice from '@/service/homeservice.js';
+	import Signin from './Signin.vue';
+	import FrImage from '@/components/fr-image/fr-image.vue';
+	var pixelRationum = null;
+	export default {
+		components: {
+			Signin,
+			FrImage
+		},
+		computed: {},
+		data() {
+			return {
+				titleHeight: null,
+				long: false,
+				LoupanList: [],
+				newOrderlist: null,
+				isShow: true, //是否已经弹出
+				animMaind: {}, //旋转动画
+				animMain: {}, //旋转动画
+				animAdd: {}, //item位移,透明度
+				animDelLots: {}, //item位移,透明度
+				animstart: false,
+				bganimstart: false,
+				touchStartTime: null,
+				touchEndTime: null,
+				lastTapTime: null,
+				currentSwiper: 0,
+				imgheights: [],
+				imageLoadstate: false,
+				system_config: null,
+				portraitUrl: null //头像地址
+			};
+		},
+		
+		methods: {
+
+			//调转色彩公园优惠券
+			toCoupon(item) {
+			
+			},
+
+			imageLoad(e) {
+				//获取图片真实宽度
+				var imgwidth = e.detail.width,
+					imgheight = e.detail.height,
+					//宽高比
+					ratio = imgwidth / imgheight;
+				//计算的高度值
+				var viewHeight = 750 / ratio;
+				var imgheight = viewHeight
+				var imgheights = this.imgheights
+				//把每一张图片的高度记录到数组里
+				imgheights[e.target.dataset['index']] = imgheight; // 改了这里 赋值给当前 index
+				this.imgheights = imgheights
+				this.setData({
+					imgheights: imgheights
+				})
+				this.imageLoadstate = true
+			},
+			
+			//轮播图
+			toJump(item) {
+				if (item.appid && item.go_url) {
+					var url = this.$Env.getBaseURL();
+					var envVersionName = "trial";
+					if (url.indexOf("colorpark") != -1) {
+						envVersionName = "release";
+					}
+					wx.navigateToMiniProgram({
+						appId: item.appid,
+						path: item.go_url || '/pages/index/mall',
+						extraData: {
+							foo: 'bar'
+						},
+						envVersion: envVersionName,
+						success(res) {
+							// 打开成功
+						}
+					})
+				} else if (item.go_url) {
+					uni.navigateTo({
+						url: './start-up?machine_id=' + item.go_url.split('=')[1]
+					})
+				}
+			},
+			swiperChange(e) {
+				this.currentSwiper = e.detail.current
+			},
+			experience() {
+				uni.navigateTo({
+					url: '../mall/experience'
+				})
+			},
+			tomyorder() { //订单列表
+				uni.navigateTo({
+					url: '../mine/myorder'
+				})
+			},
+			toLocation(item) {
+				uni.showLoading({
+					title: '导航加载中...'
+				});
+				uni.openLocation({
+					latitude: Number(item.latitude),
+					longitude: Number(item.longitude),
+					name: item.short_name,
+					success: (result) => {
+						uni.hideLoading();
+					},
+					fail: (res) => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '地址信息获取失败',
+							icon: 'none'
+						});
+					}
+				});
+			},
+			getQueryString(url, name) {
+				var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
+				var r = url.substr(1).match(reg)
+				if (r != null) {
+					return r[2]
+				}
+				return null;
+			},
+			
+			setData(obj) {
+				let that = this;
+				let keys = [];
+				let val, data;
+				Object.keys(obj).forEach(function(key) {
+					keys = key.split('.');
+					val = obj[key];
+					data = that.$data;
+					keys.forEach(function(key2, index) {
+						if (index + 1 == keys.length) {
+							that.$set(data, key2, val);
+						} else {
+							if (!data[key2]) {
+								that.$set(data, key2, {});
+							}
+						}
+						data = data[key2];
+					})
+				});
+			},
+
+			order() {
+
+				var url = this.$Env.getBaseURL();
+				var envVersionName = "trial";
+				if (url.indexOf("colorpark") != -1) {
+					envVersionName = "release";
+				}
+
+				wx.navigateToMiniProgram({
+					appId: this.$Env.getappId(),
+					path: '/pages/mine/myorder',
+					extraData: {
+						foo: 'bar'
+					},
+					envVersion: envVersionName,
+					success(res) {
+						// 打开成功
+					}
+				})
+			},
+			/* path: '/pages/login/coupons', */
+			coupons() {
+				var url = this.$Env.getBaseURL();
+				var envVersionName = "trial";
+				if (url.indexOf("colorpark") != -1) {
+					envVersionName = "release";
+				}
+				//console.log("envVersionName="+envVersionName);
+				wx.navigateToMiniProgram({
+					appId: Env.getappId(),
+					path: '/pages/index/recommend?selectTitleType=2',
+					extraData: {
+						foo: 'bar'
+					},
+					envVersion: envVersionName,
+					success(res) {
+						// 打开成功
+					}
+				})
+			},
+			tomine() {
+				wx.navigateToMiniProgram({
+					appId: this.$Env.getappId(),
+					// path: '/pages/index/recommend',
+					path: '/pages/index/mine',
+					extraData: {
+						foo: 'bar'
+					},
+					envVersion: Env.getenvVersion(),
+					success(res) {
+						// 打开成功
+					}
+				})
+			},
+			// 防止重复点击
+			touchStart(e) {
+				this.touchStartTime = e.timeStamp;
+			},
+			touchEnd(e) {
+				this.touchEndTime = e.timeStamp;
+			},
+			doubleTap(e) {
+				// 控制点击事件在350ms内触发,加这层判断是为了防止长按时会触发点击事件
+				if (this.touchEndTime - this.touchStartTime < 350) {
+					// 当前点击的时间
+					const currentTime = e.timeStamp;
+					const lastTapTime = this.lastTapTime;
+					// 更新最后一次点击时间
+					this.lastTapTime = currentTime;
+					// 如果两次点击时间在300毫秒内,则认为是双击事件
+					if (currentTime - lastTapTime > 300) {
+						// console.log('防止重复点击')
+						if (!this.$AppContext.checkLogin()) {
+							this.tologo('navigateTo')
+						} else {
+							// this.showOrHide()
+							// uni.navigateTo({url: '/pages/index/index?goods_id=21'})
+							uni.navigateTo({
+								url: './start-up?machine_id=' + this.$Env.getmachineId() + '&worksid=0'
+							});
+						}
+					}
+				}
+			},
+			// 加载数据
+			loadGoodsList() {
+				uni.showLoading({
+					title: '正在加载中...'
+				})
+				homeservice.queryList({
+					s: 'Machine.shopList',
+					longitude: this.$base.longitude || 0,
+					latitude: this.$base.latitude || 0,
+					distance: 5,
+				}).then(result => {
+					this.long = true
+					result.data.forEach(item => {
+						item.distance = Number(item.distance).toFixed(2)
+					})
+					this.LoupanList = result.data
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+					// uni.showToast({
+					// 	title: err.msg,
+					// 	icon: 'none'
+					// });
+				});
+			},
+			Account_newOrder() {
+				homeservice.queryList({
+					s: 'Account.newOrder'
+				}).then(result => {
+					if (result.sales_price != undefined) {
+						this.newOrderlist = result
+						this.newOrderlist.sales_price = Number(this.newOrderlist.sales_price) > 0 ? this
+							.newOrderlist.sales_price : ''
+					}
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.stopPullDownRefresh();
+					// uni.showToast({
+					// 	title: err.msg,
+					// 	icon: 'none'
+					// });
+				});
+			},
+			
+			getSetting() {
+				this.loadGoodsList()
+				// const that = this
+				// uni.getSetting({
+				// 	success(res) {
+				// 		if (res.authSetting['scope.userLocation']) { //同意
+				// 			that.getLocation()
+				// 		} else { //拒绝
+				// 			that.getAuthorize()
+				// 		}
+				// 	}
+				// })
+			},
+			//  获取用户的地理位置,
+			getAuthorize() {
+				//uni.hideLoading();
+				// uni.showToast({title: '操作太频繁了,歇一歇',icon:'none',duration: 2000});
+				this.loadGoodsList()
+			},
+			// 用户授权
+			getAuthorize() {
+				const that = this
+				uni.authorize({
+					scope: 'scope.userLocation',
+					success(res) {
+						that.getLocation()
+					},
+					// 授权失败
+					fail(err) {
+						uni.showModal({
+							title: '提示',
+							content: '请授权位置获取附近的商家!',
+							showCancel: false,
+							confirmText: '确认授权',
+							success() {
+								uni.openSetting({
+									success(res) {
+										// console.log(res)
+										that.getAuthorize()
+									},
+									fail(err) {
+										// console.log(err)
+									}
+								})
+							}
+						})
+					}
+				})
+			},
+			// 设备详情
+			goMachineDetail(item) {
+				uni.navigateTo({
+					//url: './start-up?machine_id=' + item.id + '&worksid=0'
+					url: './start-up?machine_id=' + item.id + '&worksid=0'
+				});
+			},
+			tologo(e) {
+				// 先登陆
+				let that = this;
+				uni.login({
+					provider: 'weixin',
+					success: (res) => {
+						userService.login({
+							s: 'Init.init',
+							code: res.code
+						}).then(r => {
+							that.Account_newOrder();
+							if (e == 'navigateTo') {
+								uni.navigateTo({
+									url: './start-up?machine_id=' + that.$Env.getmachineId() +
+										'&worksid=0'
+								});
+							}
+						}).catch(err => {
+							that.$refs.Signin.init()
+							// uni.showToast({title: err.msg,icon: 'none'})
+						});
+					},
+					fail: (res) => {
+						// uni.showToast({
+						// 	title: res.msg,
+						// 	icon: 'none'
+						// })
+					}
+				});
+			},
+			phone_mall() {
+				// homeservice.queryList({s: 'Ad.list',ad_position_key: 'phone_mall'}).then(result => {
+				// 	this.Adlists = result
+				// 	uni.stopPullDownRefresh();
+				// }).catch(err => {
+				// 	uni.stopPullDownRefresh();
+				// 	uni.showToast({title: err.msg,icon: 'none'});
+				// });
+			},
+			systemConfig() {
+				var _this = this
+				wx.request({
+					url: _this.$Env.getDevBaseURL() + '/api/system_config/detail',
+					method: 'GET',
+					data: {},
+					header: {
+						//设置参数内容类型为x-www-form-urlencoded
+						'content-type': 'application/x-www-form-urlencoded',
+						'Accept': 'application/json'
+					},
+					success: function(res) {
+						_this.system_config = res.data.data
+						uni.stopPullDownRefresh();
+						uni.hideLoading();
+					},
+					fail: function(err) {
+						uni.stopPullDownRefresh();
+						uni.hideLoading();
+					},
+					complete: function(end) {
+						uni.stopPullDownRefresh();
+						uni.hideLoading();
+					}
+				})
+			}
+		},
+		// 下拉加载
+		onPullDownRefresh() {
+			this.getSetting() // 获取附近店铺
+			// 获取最新订单
+			if (!this.$AppContext.checkLogin()) {
+
+			} else {
+				this.Account_newOrder()
+			}
+			this.phone_mall()
+			this.systemConfig()
+		},
+		// 上拉加载
+		onReachBottom() {},
+		// 滑动
+		onPageScroll(t) {},
+		// 分享好友
+		onShareAppMessage() {
+			return {
+				title: '',
+				imageUrl: '',
+				path: '',
+				success: (res) => {},
+			}
+		},
+		// 分享朋友圈
+		onShareTimeline() {
+			return {
+				title: '',
+				imageUrl: '',
+				path: '',
+				query: 'kjbfrom=pyq'
+			}
+		},
+		onLoad(options) {
+			this.getSetting() // 获取附近店铺
+			if (this.$AppContext.checkLogin()) {
+				this.Account_newOrder() // 获取最新订单
+			}
+			if (options.q) { // 分销系统 获取二维码的携带的链接信息
+				let qrUrl = decodeURIComponent(options.q)
+				let promoter_id = qrUrl.replace(/[^0-9]/ig, "")
+				this.$base.promoter_id = promoter_id
+			}
+			var appUser = userService.getCacheUserInfo();
+			if (appUser != null) {
+				this.portraitUrl = appUser.portrait
+			}
+
+		},
+		onShow() {
+			let sys = this.$base.appInformation ? this.$base.appInformation : wx.getSystemInfoSync(); // 自定义页头适配
+			pixelRationum = sys.windowWidth / 375
+			let navBarHeight = sys.screenHeight - sys.windowHeight - sys.statusBarHeight;
+			this.titleHeight = sys.statusBarHeight + 46
+			this.phone_mall()
+			this.systemConfig()
+		}
+	};
+</script>
+
+<style lang="scss">
+	@import "./css/main.css";
+
+	ec-canvas {
+		width: 100%;
+		height: 100%;
+	}
+
+	page {
+		background: #282932 !important;
+		width: 100%;
+		margin: 0;
+		padding: 0;
+	}
+
+	.qiun-columns {
+		display: flex;
+		flex-direction: column !important;
+	}
+
+	.qiun-charts {
+		width: 750upx;
+		height: 500upx;
+		background-color: #FFFFFF;
+	}
+
+	.charts {
+		width: 750upx;
+		height: 500upx;
+		background-color: #FFFFFF;
+	}
+
+	.imgSrcstate {
+		position: absolute;
+		width: 100%;
+		right: -900px;
+		top: -600px;
+		display: none;
+	}
+
+	.imgSrcdisplay {
+		z-index: 0 !important;
+	}
+
+
+
+
+
+	.statuslist {
+		font-size: 24upx;
+		padding: 5upx 27upx 5upx 25upx;
+		border-radius: 17upx;
+		font-weight: 500;
+		color: #FFFFFF;
+	}
+
+	.start {
+		.start_img {
+			width: 513upx;
+			height: 251upx;
+			display: block;
+			margin: 0upx auto 102upx;
+		}
+
+		.start_title {
+			font-size: 30upx;
+			text-align: center;
+			color: #FFFFFF;
+		}
+
+		.start_text {
+			width: 70%;
+			text-align: center;
+			font-size: 28upx;
+			font-family: Source Han Sans CN;
+			font-weight: 400;
+			color: #888888;
+			margin: 22upx auto 0;
+			line-height: 28upx;
+		}
+	}
+
+	//悬浮按钮
+	.buttom {
+		position: fixed;
+		bottom: 30upx;
+		margin: auto;
+		left: 0;
+		right: 0;
+		z-index: 99;
+		width: 120upx;
+		height: 120upx;
+		border-radius: 50%;
+		font-size: 36upx;
+		text-align: center;
+		line-height: 120upx;
+		font-weight: 800;
+		color: #FFFFFF;
+		background: linear-gradient(to right, #834DC4, #1983D7);
+	}
+
+	.canbutton {
+		color: #23b7cb;
+		font-size: 15px;
+		padding: 5px 15px;
+		border: 1px transparent solid;
+		border-radius: 30px;
+		position: relative;
+		width: 140upx;
+		margin: 40upx auto 0;
+		background: #282932;
+		text-align: center;
+	}
+
+	.canbutton:after {
+		content: '';
+		position: absolute;
+		top: -3px;
+		bottom: -3px;
+		left: -3px;
+		right: -3px;
+		background: linear-gradient(to right, #834DC4, #1983D7);
+		border-radius: 30px;
+		content: '';
+		z-index: -1;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/index/start-up.vue b/pages/index/start-up.vue
new file mode 100644
index 0000000..183d4bd
--- /dev/null
+++ b/pages/index/start-up.vue
@@ -0,0 +1,856 @@
+<template>
+	<view class="full-width full-height">
+		<view @tap="game" v-if="statusloading == 1"
+			style="position: fixed; z-index: 99; right: 0; bottom: 524upx; display: flex;align-items: center;justify-content: center;
+		  		width: 100upx; height: 88upx; background: linear-gradient(92deg, #178CE6, #984ACE); border-radius: 44upx 0px 0px 44upx;">
+			<view style="font-size: 24upx; font-weight: 800; color: #FFFFFF;">
+				<view>排队</view>
+				<view>信息</view>
+			</view>
+		</view>
+		
+		<view @tap="toProxyApplet" v-if="list.is_open_manage == 1"
+			style="position: fixed; z-index: 99; right: 0; bottom: 400upx; display: flex;align-items: center;justify-content: center;
+		  		width: 100upx; height: 88upx; background: linear-gradient(92deg, #178CE6, #984ACE); border-radius: 44upx 0px 0px 44upx;">
+			<view style="font-size: 24upx; font-weight: 800; color: #FFFFFF;">
+				 <view>运营</view>
+				 <view>中心</view>
+			</view>
+		</view>
+		
+		<!-- 自定义头部 -->
+		<myhead :worksid="worksid" :title="myheadtext" :color="'#864BC3'" :titleShow="true" :backShow="true"
+			:background="'none'"></myhead>
+		<view style="position: relative;width: 100%; height: 100%; z-index: 2;">
+			<!-- 轮播图 status-->
+			<view v-if="statusloading == 1" class='swiper-box' style="width: 100%; height: 100%;">
+				<swiper :autoplay="true" :interval="3000" :duration="1000" @change="swiperChange"
+					class="swiper full-width" style="width: 100%; height: 100%; border-radius: 0;">
+					<swiper-item v-for="(item, index) in Adlists" :key="index" class="swiper-item full-width">
+						<fr-image :src="item.content + '?x-oss-process=image/resize,lfit,w_720'" mode="aspectFill"
+							loading-ing-img="two-balls" />
+					</swiper-item>
+				</swiper>
+				<view style="position: fixed; bottom: 232upx; text-align: center;left: 0; right: 0;">
+					<view class="dots">
+						<view v-for="(item, index) in Adlists" class="dot-wrapper" :key="index">
+							<view class="dot iconfont"
+								:class="[index == currentSwiper ? 'iconsanjiaoxing':'iconxingzhuang-sanjiaoxing' ]">
+							</view>
+						</view>
+					</view>
+				</view>
+				<view @click="Customize_now"
+					:class="['experiencebutton', { 'noexperiencebutton': isNowCustomized == true }]"
+					hover-class="loginBtn-hover" style="position: fixed; bottom: 120upx; text-align: center;left: 0; right: 0;
+				     width: 420upx; height: 105upx; line-height: 105upx; border-radius: 53upx; font-size: 39upx;">
+					立即定制
+				</view>
+				<!-- <view @click="toProxyApplet()" v-if="list.is_open_manage == 1" style="position: fixed; bottom: 35upx; 
+				text-align: center;left: 0; right: 0;font-size: 34upx; 
+				margin: auto;
+				color: #fff; 
+				line-height:64upx;
+				background: linear-gradient(to left, #834DC4, #1983D7);
+				width: 240upx; height: 60upx;  border-radius: 30upx;">运营中心</view> -->
+			</view>
+			<!-- 错误提示信息 -->
+			<view v-if="statusloading == 2" style="min-height: 100%;background: #131319 !important;">
+				<view class="start" style="padding-bottom: 100upx; padding-top: 200upx;">
+					<image src="../../static/icon_guaqi.png" mode="aspectFill" class="start_img"></image>
+					<view class="start_text" style="margin-top: -80upx;font-size: 31upx;">{{machine_id || ''}}</view>
+					<view class="start_text" style="margin-top: 100upx;">{{msg || ''}}</view>
+					<view @click="tomakePhoneCall">
+						<view class="start_text">联系客服</view>
+						<view class="start_text" style="display: flex; justify-content: center; align-items: center;">
+							<image src="../../static/phone.png" mode=""
+								style="width: 32upx; height: 32upx; margin-right: 5upx;"></image>
+							{{phone || '18938664545'}}
+						</view>
+					</view>
+				</view>
+				<image src="../../static/logo.jpg" mode="aspectFill"
+					style="width: 664upx; height: 757upx; opacity: 0.03; position: absolute; left: 0; bottom: 0; z-index: -1;">
+				</image>
+			</view>
+			<view v-if="statusloading == 2"
+				style="margin-top: -50upx;text-align: center;color: #888888; font-weight: 400; line-height: 40upx;">
+				<text style="font-size: 22upx;">深圳市瑞丰彩科技有限公司</text>
+			</view>
+		</view>
+		<!-- 手机壳品牌 -->
+		<switchBrands ref="switchBrands" @goodsbrands="goodsbrands" @toCustomSize="toCustomSize()"></switchBrands>
+		<!-- 登录弹框 -->
+		<Signin ref="Signin"></Signin>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js';
+	import uniPopup from './common/uni-popup/uni-popup.vue'
+	import myhead from './head/head.vue';
+	import Signin from '../index/Signin.vue';
+	import userService from '@/service/UserService';
+	import FrImage from '@/components/fr-image/fr-image.vue'
+	import switchBrands from './components/switchBrands.vue'; // 手机壳
+	import Env from '@/util/Env.js';
+	export default {
+		components: {
+			uniPopup,
+			myhead,
+			Signin,
+			FrImage,
+			switchBrands,
+		},
+		computed: {},
+		data() {
+			return {
+				isNowCustomized: false,
+				Adlists: [{}, {}],
+				currentSwiper: 0,
+				catrgoryList: null,
+				sizelist: [],
+				brandtext: null,
+				modeltext: null,
+				goods_id: null,
+				dict_id: null,
+				machine_id: null,
+				key: null, //1直营配送站 2 万能通用版 3色彩自助站
+				list: null,
+				sn: null,
+				myheadtext: '打印',
+				myadress: {
+					latitude: "",
+					longitude: "",
+					distance: null
+				},
+				stockstatus: null,
+				msg: null,
+				worksid: 1,
+				statusloading: null, //加载状态
+				phone: '18938664545',
+				isLoad: false, //是否加载
+				baseSetting: null, //配置信息
+				moduleInfo: null, //识别型号信息
+				show_admin_login: 0, // 显示是否显示代理
+			};
+		},
+
+		methods: {
+
+
+			//调转代理小程序
+			toProxyApplet() {
+				var url = Env.getBaseURL();
+				var envVersionName = "trial";
+				if (url.indexOf("colorpark") != -1) {
+					envVersionName = "release";
+				}
+				wx.navigateToMiniProgram({
+					appId: 'wx9cd3934f286f3d71',
+					envVersion: envVersionName,
+					path: 'pages/index/start-up?machine_id=' + this.machine_id + "&partner_id=" + this.list.partner_id + "&appletType=1",
+					success(res) {
+					
+					}
+				})
+			},
+			
+			//首次进来检查是否
+			toFirstCheck() {
+				let that = this;
+				uni.login({
+					provider: 'weixin',
+					success: (res) => {
+						userService.login({
+							s: 'Init.checkAdminAuth',
+							code: res.code,
+							partner_id: that.list.partner_id
+						}).then(result => {
+							that.show_admin_login = result.show_admin_login
+						}).catch(err => {
+				
+						});
+					},
+					fail: (res) => {
+			
+					}
+				});
+			},
+
+			//获取开关配置
+			machineGetBaseSetting() { // 获取设备是否开启支付、是否开放材质的接口
+				homeservice.machineGetBaseSetting({
+					s: 'Machine.getBaseSetting',
+					machine_id: this.machine_id,
+				}).then(result => {
+					this.baseSetting = result
+				}).catch(err => {
+
+				});
+			},
+
+			//自定义尺寸
+			toCustomSize() {
+				uni.navigateTo({
+					url: '../index/custom-size?machine_id=' + this.machine_id +
+						'&key=' + this.key +
+						"&machineDetail=" + encodeURIComponent(JSON.stringify(this.list)) +
+						"&isFirstPage=true"
+				})
+				this.$refs['switchBrands'].cancelBrand();
+			},
+
+			goodsbrands(obj) {
+				this.brandtext = obj.goods_id_e.modeltext // 品牌名
+				this.modeltext = obj.goods_id_e.modeltext //机型名
+				this.goods_id = obj.goods_id_e.goods_id //产品id
+				this.dict_id = obj.goods_id_e.dict_id //产品属性id
+				this.$base.surfaceData = {
+					surface_type: obj.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: obj.surface_id, //材质对应的编号,没有的话就为0或者不传
+					surface_color: obj.surface_color, //材质颜色
+					surfaceName: obj.surfaceName, //材质名称
+					surface_color_series_id: obj.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: obj.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+					surface_color_series_id_text: obj.surface_color_series_id_text,
+					surface_color_id_text: obj.surface_color_id_text,
+				}
+				this.changeChannel()
+			},
+
+			game() {
+				uni.navigateTo({
+					url: '../mall/lineUp?machine_id=' + this.machine_id + '&key=' + this.key
+				})
+			},
+
+			//打电话
+			tomakePhoneCall() {
+				uni.showLoading({
+					title: '跳转中...',
+					mask: true
+				})
+				uni.makePhoneCall({
+					phoneNumber: this.phone || '18938664545', //仅为示例
+					success(res) {
+						uni.hideLoading();
+					},
+					fail(err) {
+						uni.hideLoading();
+						uni.showToast({
+							title: '拨打的电话失败',
+							icon: 'none',
+							duration: 2000
+						});
+					}
+				});
+			},
+
+			//获取定位信息
+			getSetting() {
+				this.OrderlockAttrStock();
+			},
+
+			//获取用户的地理位置,
+			getLocation() {
+				uni.showLoading({
+					title: '自动获取定位信息...',
+					mask: true
+				})
+				const that = this
+				uni.getLocation({
+					type: 'gcj02',
+					altitude: true,
+					success(res) {
+						uni.hideLoading();
+						that.$base.longitude = res.longitude
+						that.$base.latitude = res.latitude
+						that.myadress.latitude = res.latitude
+						that.myadress.longitude = res.longitude
+						that.isLoad = true;
+						that.getDetail()
+					},
+					// 授权失败
+					fail(err) {
+						uni.hideLoading();
+						that.$base.longitude = 0
+						that.$base.latitude = 0
+						that.myadress.latitude = 0
+						that.myadress.longitude = 0
+						that.isLoad = true;
+						that.getDetail()
+					}
+				})
+			},
+
+			//再次请求用户授权
+			getAuthorize() {
+				const that = this
+				uni.authorize({
+					scope: 'scope.userLocation',
+					success(res) {
+						that.getLocation()
+					},
+					// 授权失败
+					fail(err) {
+						uni.showModal({
+							title: '提示',
+							content: '请授权位置获取附近的商家!',
+							showCancel: false,
+							confirmText: '确认授权',
+							success() {
+								uni.openSetting({
+									success(res) {
+										that.getAuthorize()
+									},
+									fail(err) {
+
+									}
+								})
+							}
+						})
+					}
+				})
+			},
+
+			//方法定义 lat,lng
+			GetDistance(lat1, lng1, lat2, lng2) {
+				var radLat1 = lat1 * Math.PI / 180.0;
+				var radLat2 = lat2 * Math.PI / 180.0;
+				var a = radLat1 - radLat2;
+				var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
+				var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math
+					.pow(Math.sin(b / 2), 2)));
+				s = s * 6378.137; // EARTH_RADIUS;
+				s = Math.round(s * 10000) / 10000;
+				return s;
+			},
+
+			tologo() {
+				let that = this;
+				uni.login({
+					provider: 'weixin',
+					success: (res) => {
+						userService.login({
+							s: 'Init.init',
+							code: res.code
+						}).then(r => {
+							that.getSetting();
+						}).catch(err => {
+							that.$refs.Signin.init();
+						});
+					},
+					fail: (res) => {
+
+					}
+				});
+			},
+
+			
+
+			//获取该手机型号对应的商品信息
+			DeviceAccessgetModelGoods() {
+				let isShowCustomizeData = this.list.customize_size == 1 ? true : false;
+				if (this.moduleInfo != null) {
+					if (this.catrgoryList.length > 0) { //自动识别
+						this.$base.appInformation.model = this.moduleInfo.name
+						this.goods_id = this.moduleInfo.id //产品id
+						this.$base.goodsOldId = this.moduleInfo.id //产品id
+						this.$base.goodsTemporaryId = this.moduleInfo.id //产品id
+						this.dict_id = this.moduleInfo.dict_id //产品属性id
+						this.modeltext = this.moduleInfo.name //机型名
+						this.$nextTick(() => {
+							this.isNowCustomized = false;
+							this.$refs['switchBrands'].open({
+								machine_id: this.machine_id,
+								key: this.key,
+								goods_id: this.goods_id, //产品id
+								dict_id: this.dict_id, //产品属性id
+								sn: this.sn,
+								switchBrandState: 1, //0正常 1跳过选择手机型号 2定制页选择材质
+								isShowCustomize: isShowCustomizeData,
+								baseSetting: this.baseSetting
+							})
+						})
+					} else {
+						this.$nextTick(() => {
+							this.isNowCustomized = false;
+							this.$refs['switchBrands'].open({
+								machine_id: this.machine_id,
+								key: this.key,
+								goods_id: this.goods_id,
+								dict_id: this.dict_id,
+								sn: this.sn,
+								switchBrandState: 0,
+								isShowCustomize: isShowCustomizeData,
+								baseSetting: this.baseSetting
+								//0正常 1跳过选择手机型号 2定制页选择材质
+							})
+						})
+					}
+				} else {
+					this.goods_id = null
+					this.$nextTick(() => {
+						this.isNowCustomized = false;
+						this.$refs['switchBrands'].open({
+							machine_id: this.machine_id,
+							key: this.key,
+							goods_id: this.goods_id,
+							dict_id: this.dict_id,
+							sn: this.sn,
+							switchBrandState: 0, //0正常 1跳过选择手机型号 2定制页选择材质
+							isShowCustomize: this.list.customize_size == 1 ? true : false,
+							baseSetting: this.baseSetting
+						})
+					})
+				}
+			},
+
+			//获取该手机型号对应的商品信息
+			DeviceAccessgetModelGoodsFirst() {
+				homeservice.DeviceAccessgetModelGoods({
+					s: 'DeviceAccess.getModelGoods',
+					machine_id: this.machine_id,
+					brand: this.$base.appInformationOld.brand, //设备品牌
+					model: this.$base.appInformationOld.model, //设备型号
+				}).then(result => {
+					this.moduleInfo = result;
+				}).catch(err => {
+					this.moduleInfo = null
+				});
+			},
+
+			//查找品牌
+			productfind() {
+				//获取品牌数据
+				homeservice.queryList({
+					s: 'product.find',
+					machine_id: this.machine_id,
+					key: this.key
+				}).then(result => {
+					this.catrgoryList = result[0].brand;
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				})
+			},
+
+			//释放锁定库存
+			OrderlockAttrStock() {
+				this.sizelist = []
+				this.brandtext = null
+				this.modeltext = null
+				this.goods_id = null
+				this.dict_id = null
+				this.DeviceAccessgetModelGoods()
+				homeservice.queryList({
+					s: 'Order.newLockAttrStock',
+					machine_id: this.machine_id, //设备id
+					goods_id: null, //产品
+					dict_id: null, //产品属性id
+					old_sn: null,
+					onlyClear: 1
+				}).then(Orderresult => {
+					this.sizelist = []
+					this.brandtext = null
+					this.modeltext = null
+					this.goods_id = null
+					this.dict_id = null
+				}).catch(err => {
+					this.sizelist = []
+					this.brandtext = null
+					this.modeltext = null
+					this.goods_id = null
+					this.dict_id = null
+				});
+			},
+
+			//立即定制
+			Customize_now() {
+				if (this.isNowCustomized) {
+					return
+				}
+				this.isNowCustomized = true;
+				setTimeout(function() {
+					this.isNowCustomized = false;
+				}.bind(this), 3000)
+				let that = this;
+				if (!this.$AppContext.checkLogin()) {
+					this.tologo()
+				} else {
+					if (this.list != null) {
+						if (this.list.status.value == 1 || this.list.status.value == 2) {
+							//单机版无视距离
+							if (this.key == 2) {
+								if (this.stockstatus == '缺货') {
+									uni.showToast({
+										title: '当前机器缺货',
+										icon: 'none',
+										duration: 1500
+									});
+								} else {
+									this.OrderlockAttrStock()
+								}
+							} else {
+								that.OrderlockAttrStock()
+							}
+						} else if (this.list.status.value == 0 || this.list.status.value == 3 || this.list.status.value ==
+							4 || this.list.status.value == 5) {
+							uni.showToast({
+								title: '设备休息中',
+								icon: 'none',
+								duration: 2000
+							});
+						}
+					} else {
+
+					}
+				}
+			},
+
+			changeChannel() {
+				var loading = false
+				if (loading) return;
+				if (this.goods_id == null) {
+					uni.showToast({
+						title: '请选择手机壳型号!',
+						icon: 'none'
+					});
+					return false;
+				}
+				loading = true
+				if (loading) {
+					if (this.key == 2) {
+						uni.navigateTo({
+							url: '../index/index?machine_id=' + this.machine_id + '&goods_id=' + this.goods_id +
+								'&key=' + this.key + "&machineDetail=" + encodeURIComponent(JSON.stringify(this
+									.list)) +
+								"&isFirstPage=true"
+						})
+					} else {
+						//锁定库存
+						homeservice.queryList({
+							s: 'Order.newLockAttrStock',
+							machine_id: this.machine_id, //设备id
+							goods_id: this.goods_id, //产品
+							dict_id: this.dict_id, //产品属性id
+							old_sn: this.sn
+						}).then(result => {
+							this.$base.lockInventory = result //锁库存储存信息
+							this.sn = result.sn
+							uni.navigateTo({
+								url: '../index/index?machine_id=' + this.machine_id + '&goods_id=' + this
+									.goods_id +
+									'&key=' + this.key + '&sn=' + this.sn + '&dict_id=' + this.dict_id +
+									"&machineDetail=" + encodeURIComponent(JSON.stringify(this.list))
+							})
+							uni.setStorage({
+								key: 'setgood',
+								data: {
+									sn: this.sn,
+									brandtext: this.brandtext,
+									modeltext: this.modeltext,
+									goods_id: this.goods_id
+								},
+								success: function() {
+									//console.log('success');
+								}
+							});
+						}).catch(err => {
+							uni.showToast({
+								title: err.msg || err.data,
+								icon: 'none'
+							});
+						});
+					}
+				}
+			},
+			change(e) {
+
+			},
+
+			swiperChange(e) {
+				this.currentSwiper = e.detail.current
+			},
+
+			getDetail() {
+				uni.showLoading({
+					title: '正在加载中...',
+					mask: true
+				})
+				homeservice.WorksList({
+					machine_id: this.machine_id,
+					s: 'machine.newDetail'
+				}).then(res => {
+					this.statusloading = 1;
+					if (res) {
+						this.list = res;
+						if (this.list != null) {
+							this.toFirstCheck();
+							this.phone = this.list.phone;
+							if (this.list.flag != null) {
+								let value = this.list.flag.value
+								if (value == "N") {
+									this.msg = "稍等片刻,我很快恢复"
+									this.myheadtext = '歇一歇' //头部标题栏
+									this.statusloading = 2
+									uni.stopPullDownRefresh();
+									uni.hideLoading();
+									return;
+								}
+							}
+						}
+						this.$base.partner_id = this.list.partner_id;
+						this.list.machine_category_text = this.list.category.title
+						this.key = this.list.category.key
+						this.myheadtext = this.machine_id + '-' + res.code //头部标题栏
+						if (res.shop_id) {
+							this.myadress.distance = this.GetDistance(this.myadress.latitude, this.myadress
+								.longitude, res.shop.latitude, res.shop.longitude).toFixed(2)
+						}
+						this.productfind() // 获取品牌数据
+						//this.toFirstCheck();
+					}
+					uni.stopPullDownRefresh();
+					uni.hideLoading();
+				}).catch(err => {
+					this.statusloading = 2
+					this.msg = err.msg
+					uni.stopPullDownRefresh();
+					uni.hideLoading();
+					this.myheadtext = '歇一歇' //头部标题栏
+				});
+			},
+
+			Adlist() { // 轮播图
+				homeservice.queryList({
+					s: 'Ad.list',
+					ad_position_key: 'index_top',
+					machine_id: this.machine_id
+				}).then(result => {
+					this.Adlists = result
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.stopPullDownRefresh();
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+			getQueryString(url, name) {
+				var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
+				var r = url.substr(1).match(reg)
+				if (r != null) {
+					return r[2]
+				}
+				return null;
+			}
+		},
+		//上拉刷新 
+		onReachBottom() {},
+		//下拉加载
+		onPullDownRefresh() {
+			uni.stopPullDownRefresh();
+			//this.getLocation();
+			// homeservice.queryList({ // 释放锁定库存
+			// 	// s: 'Order.lockAttrStock',
+			// 	s: 'Order.newLockAttrStock',
+			// 	machine_id: this.machine_id, //设备id
+			// 	goods_id: null, //产品
+			// 	dict_id: null, //产品属性id
+			// 	old_sn: null,
+			// 	onlyClear: 1
+			// }).then(result => {
+			// 	uni.stopPullDownRefresh();
+			// }).catch(err => {
+			// 	uni.stopPullDownRefresh();
+			// 	uni.showToast({
+			// 		title: err.msg || err.data,
+			// 		icon: 'none'
+			// 	});
+			// });
+		},
+		// 分享转发
+		onShareAppMessage(options) {
+			var that = this;
+			// 设置转发内容
+			var shareObj = {
+				title: '色彩公园手机壳',
+				path: '/pages/index/start-up?machine_id=' + this.machine_id, // 默认是当前页面,必须是以‘/’开头的完整路径
+				imageUrl: '', //转发时显示的图片路径,支持网络和本地,不传则使用当前页默认截图。
+				success: function(res) { // 转发成功之后的回调     
+					if (res.errMsg == 'shareAppMessage:ok') {}
+				}
+			};
+			// 来自页面内的按钮的转发
+			// if (options.from == 'button') {
+			// 	var dataid = options.target.dataset; //上方data-id=shareBtn设置的值
+			// 	shareObj.imageUrl = dataid.img
+			// 	shareObj.path = '/packageA/pages/detail?bbsId=' + dataid.id
+			// }
+			// 返回shareObj
+			return shareObj;
+		},
+		onShareTimeline() {
+			return {
+				title: '色彩公园手机壳',
+				path: '/pages/index/start-up?machine_id=' + this.machine_id,
+				imageUrl: '',
+				query: 'kjbfrom=pyq'
+			}
+		},
+		onLoad(options) {
+			this.machine_id = options.machine_id
+			if (options.worksid) {
+				this.worksid = options.worksid
+			}
+			if (options.q) {
+				let qrUrl = decodeURIComponent(options.q)
+				this.machine_id = this.getQueryString(qrUrl, 'machine_id')
+				this.$base.promoter_id = this.getQueryString(qrUrl, 'promoter_id')
+			}
+			this.Adlist()
+			this.isLoad = true;
+			if (this.machine_id != null && this.machine_id != "") {
+				this.getDetail();
+			}
+			this.machineGetBaseSetting();
+			this.DeviceAccessgetModelGoodsFirst();
+			// if (this.$base.latitude && this.$base.longitude) {
+			// 	this.myadress.latitude = this.$base.latitude
+			// 	this.myadress.longitude = this.$base.longitude
+			// 	this.isLoad = true;
+			// 	this.getDetail()
+			// } else {
+			// 	this.getSetting();
+			// }
+			this.$base.machine_id = this.machine_id
+		},
+		onShow(options) {
+			if (this.machine_id != null && this.machine_id != "") {
+				//this.getDetail();
+				this.machineGetBaseSetting();
+			}
+		},
+	};
+</script>
+
+<style lang="scss">
+	@import "./css/main.css";
+
+	page {
+		width: 100%;
+		height: 100%;
+		background: #FFFFFF;
+
+		.experiencebutton {
+			width: 230upx;
+			height: 70upx;
+			line-height: 70upx;
+			text-align: center;
+			color: #FFFFFF;
+			margin: 40upx auto 0;
+			border-radius: 35upx;
+			background: linear-gradient(to right, #834DC4, #1983D7);
+			font-size: 26upx;
+		}
+
+
+		.noexperiencebutton {
+			width: 230upx;
+			height: 70upx;
+			line-height: 70upx;
+			text-align: center;
+			color: #FFFFFF;
+			margin: 40upx auto 0;
+			border-radius: 35upx;
+			background: linear-gradient(to right, #999999, #999999);
+			font-size: 26upx;
+		}
+
+
+		.loginBtn-hover {
+			background: linear-gradient(to left, #834DC4, #1983D7);
+		}
+
+		.canbutton {
+			color: #FFFFFF;
+			font-size: 26upx;
+			width: 218upx;
+			height: 58upx;
+			line-height: 58upx;
+			border: 1px transparent solid;
+			border-radius: 30px;
+			position: relative;
+			margin: auto;
+			background: #292933;
+			text-align: center;
+		}
+
+		.canbutton:after {
+			content: '';
+			position: absolute;
+			top: -3px;
+			bottom: -3px;
+			left: -3px;
+			right: -3px;
+			background: linear-gradient(to right, #834DC4, #1983D7);
+			border-radius: 30px;
+			content: '';
+			z-index: -1;
+		}
+
+		//品牌
+		.brandactive {
+			background: #E4D0F6 !important;
+		}
+
+		//型号
+		.model {
+			padding: 0upx 20upx;
+			height: 60upx;
+			line-height: 60upx;
+			background: #141319;
+			text-align: center;
+			color: #FFFFFF;
+			border-radius: 30upx;
+			margin-right: 20upx;
+			font-size: 28upx;
+		}
+
+		.modelactive {
+			color: #553177 !important;
+		}
+
+		// 错误提示信息
+		.start {
+			.start_img {
+				width: 260upx;
+				height: 260upx;
+				display: block;
+				margin: 0upx auto 102upx;
+			}
+
+			.start_title {
+				font-size: 30upx;
+				text-align: center;
+				color: #FFFFFF;
+			}
+
+			.start_text {
+				width: 70%;
+				text-align: center;
+				font-size: 28upx;
+				font-family: Source Han Sans CN;
+				font-weight: 400;
+				color: #FFFFFF;
+				margin: 22upx auto 0;
+				line-height: 28upx;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/index/tuya.vue b/pages/index/tuya.vue
new file mode 100644
index 0000000..fa6cf39
--- /dev/null
+++ b/pages/index/tuya.vue
@@ -0,0 +1,693 @@
+<template>
+	<view v-if="openState">
+	<!-- 品牌 -->
+			<uni-popup ref="brandscenter" type="center" @change="change" :style="{height: MobilePhoneHeight +'px',width: MobilePhoneWidth +'px'}">
+				<view style="display: flex; flex-direction: column;">
+					<view :style="{height: MobilePhoneHeight +'px',width: MobilePhoneWidth +'px'}"
+					style="border-radius: 30upx; position: relative; overflow: hidden;">
+						<view class="board-container">
+							<!-- 遮罩 -->
+							<!-- <view style="position: absolute; bottom: 0; left: 0; height: 100%; width: 100%; z-index: 1; opacity: 0.8;" @click.stop.prevent="cancelBrand('share')"></view> -->
+							<view class="board" :style="{width: data.editorWidth +'px',height: data.editorHeight +'px'}"
+							:class="{'board-out':colorPanelShow}">
+								<canvas class="board-canvas" canvas-id="drawCanvas" disable-scroll="true"
+								 @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd"></canvas>
+							</view>
+							<!-- 工具 -->
+							<Toolbar :penColor="currentColor" @penWidthChange="penWidthChangeHandler" 
+							@toolItemTap="toolItemTapHandler" @colorPickTap="colorPickTapHandler" :toolArr="toolArr" 
+							style="position: fixed; bottom: 0; width: 100%; z-index: 101;"></Toolbar>
+						</view>
+					</view>
+				</view>
+			</uni-popup>
+		</view>
+</template>
+
+<script>
+	import Toolbar from '../../components/toolbar/toolbar.vue'
+	import uniPopup from './common/uni-popup/uni-popup.vue';
+	import Env from '@/util/Env.js';
+	export default {
+		components: {
+			Toolbar,
+			uniPopup
+		},
+		onShareAppMessage(res) {
+			return {
+				title: '你绝对看不出我画的是什么?',
+				path: '/pages/index/index'
+			}
+		},
+		data() {
+			return {
+				historylist:[],
+				colorPanelShow: false,
+				drawInfos: [],
+				curDrawArr: [],
+				startX: 0,
+				startY: 0,
+				drawContext: {},
+				currentColor: '#000',
+				begin: false,
+				bgColor: 'rgba(255, 255, 255, 0)',
+				toolArr: [
+					// {
+					// 	title: '清空',
+					// 	icon: '../../static/png/tool_clear.png',
+					// 	selectIcon: '../../static/png/tool_clear_s.png',
+					// 	select: false,
+					// 	url: 'clear'
+					// }, 
+					{
+						title: '撤销',
+						icon: '../../static/png/tool_eraser.png',
+						selectIcon: '../../static/png/tool_eraser.png',
+						select: false,
+						url: 'eraser'
+					}, 
+					// {
+					// 	title: '画笔',
+					// 	icon: '../../static/png/tool_pen.png',
+					// 	selectIcon: '../../static/png/tool_pen_s.png',
+					// 	select: true,
+					// 	url: 'pen'
+					// }, 
+					// {
+					// 	title: '颜色',
+					// 	icon: '../../static/png/tool_color.png',
+					// 	selectIcon: '../../static/png/tool_color_s.png',
+					// 	select: false,
+					// 	url: 'color'
+					// }, 
+					{
+						title: '确认',
+						icon: '../../static/png/icon_confirm.png',
+						selectIcon: '../../static/png/icon_confirm.png',
+						select: false,
+						url: 'save'
+					}
+				],
+				lineWidth: 6,
+				penMode: true,
+				rectMode: false,
+				hollowRectMode: false,
+				circleMode: false,
+				hollowCircleMode: false,
+				lastHollowRect: {},
+				lastHollowCircle: {},
+				
+				MobilePhoneHeight:0,
+				MobilePhoneWidth:0,
+				pixelRate:1,
+				data:{},
+				openState:false,
+				canvas_neto:[]
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			uploadDIY(tempFilePaths) {
+				uni.showLoading({title: '生成中...',mask: true})
+				var _this = this
+				wx.request({
+				  url: Env.getDevBaseURL() + '/api/AliossSign/getSign',
+				  method: 'GET',
+				  data:'',
+				  header: {
+					'content-type':'application/x-www-form-urlencoded',
+					'Accept': 'application/json'
+				  },
+				  success: function (res) {
+						var atter = res.data
+						let time = new Date().getTime() + Math.floor((Math.random() * 1000) + 1)
+						wx.uploadFile({
+							url: atter.host.replace("http:", "https:"),
+							filePath: tempFilePaths,
+							name: 'file',
+							formData: {
+								'key': atter.dir + time + '.png',
+								'OSSAccessKeyId': atter.accessid,
+								'policy': atter.policy,
+								'Signature':  atter.signature,
+								'success_action_status': '200',
+								'callback':atter.callback,
+							},
+							success: function(res) {
+								if (res.statusCode != 200) {
+									console.log({errCode: '599', msg:'其他错误'})
+									return;
+								}
+								if (res.statusCode == 200){
+								  uni.showToast({ title: '生成涂鸦成功', icon: 'none',duration: 3000 })
+								  // console.log(atter.host + '/' + atter.dir + time + '.png')
+								  let url = atter.host + '/' + atter.dir + time + '.png'
+								  _this.$emit('tuyaimg',url)
+								  _this.$refs['brandscenter'].close()
+								  _this.openState = false
+								}
+							},
+							fail: function(err) {
+								wx.showToast({title: '生成涂鸦成功失败!',icon: 'none',duration: 1200})
+							},
+							complete: function(err) {
+								// console.log('总共' + successUp + '张上传成功,' + failUp + '张上传失败!');
+							}
+						})
+					}
+				})
+			},
+			change(){},
+			cancelBrand(){
+				this.clearDrawBoard()
+				this.$refs['brandscenter'].close()
+				this.openState = false
+			},
+			open(e){
+				this.canvas_neto = []
+				this.currentColor = '#000'
+				this.lineWidth = 6
+				this.openState = true
+				this.data = e.data
+				//获取屏幕宽高
+				let that = this
+				wx.getSystemInfo({
+					success: function(res) {
+						that.MobilePhoneHeight = res.windowHeight // 屏幕高度
+						that.MobilePhoneWidth = res.windowWidth // 屏幕高度
+						that.pixelRate = res.windowWidth / 750;
+					},
+				})
+				this.$nextTick(() => {
+					this.$refs['brandscenter'].open()
+					setTimeout(function(){
+						this.drawContext = uni.createCanvasContext('drawCanvas',this);
+						this.initBoard();
+						this.fillWelcomeBackground(this.drawContext);
+					}.bind(this),500)
+				})
+			},
+			colorPickTapHandler(obj) {
+				// console.log('我点击的颜色:' + JSON.stringify(obj));
+				this.colorPanelShow = false;
+				this.toolArr.forEach(item => {
+					item.select = false;
+					if (item.title === '画笔') {
+						item.select = true;
+					}
+				})
+				this.rectMode = false;
+				this.hollowRectMode = false;
+				this.circleMode = false;
+				this.hollowCircleMode = false;
+				this.penMode = true;
+				this.currentColor = obj.color;
+				this.drawContext.strokeStyle = obj.color;
+			},
+			penWidthChangeHandler(width) {
+				// console.log('画笔宽度:' + width);
+				this.lineWidth = width;
+				this.drawContext.setLineWidth(width);
+				this.drawContext.setLineCap('round') // 让线条圆润
+			},
+			toolItemTapHandler(index) {
+				const that = this;
+				let url = this.toolArr[index]['url'];
+				switch (url) {
+					case 'clear':
+						this.clearDrawBoard();
+						break;
+					case 'eraser':
+						this.canvas_restore()
+						// this.drawContext.strokeStyle = 'rgba(255, 255, 255, 0)';
+						this.colorPanelShow = false;
+						break;
+					case 'pen':
+						this.drawContext.strokeStyle = this.currentColor;
+						this.colorPanelShow = false;
+						this.rectMode = false;
+						this.hollowRectMode = false;
+						this.circleMode = false;
+						this.hollowCircleMode = false;
+						this.penMode = true;
+						break;
+					case 'color':
+						this.colorPanelShow = !this.colorPanelShow;
+						// this.drawMode = this.colorPanelShow ? false : true;
+						break;
+					case 'save':
+						if(that.canvas_neto.length < 1){
+							that.cancelBrand();
+							return false
+						}
+						uni.canvasToTempFilePath({
+							canvasId: 'drawCanvas',
+							success: function(res) {
+								// console.log('回调参数:' + JSON.stringify(res))
+								that.uploadDIY(res.tempFilePath);
+								// console.log('回调参数:' + JSON.stringify(res));
+								// 在H5平台下,tempFilePath 为 base64
+								// uni.saveImageToPhotosAlbum({
+								// 	filePath: res.tempFilePath,
+								// 	success: function(res) {
+								// 		console.log('回调参数:' + JSON.stringify(res))
+								// 		// console.log('成功回调参数:' + JSON.stringify(res));
+								// 		// that.$api.msgSuccess('保存成功');
+								// 	},
+								// 	fail: function(res) {
+								// 		console.log('回调参数:' + JSON.stringify(res))
+								// 		// console.log('失败回调参数:' + JSON.stringify(res));
+								// 		// that.$api.msgSuccess('保存成功');
+								// 	}
+								// });
+							},
+							fail: function(res) {
+								console.log('fail' + JSON.stringify(res));
+							}
+						},that)
+						break;
+					case 'close':
+						this.cancelBrand();
+						break;
+					// case 'hollowRect':
+					// 	this.hollowRectMode = true;
+					// 	this.rectMode = false;
+					// 	this.circleMode = false;
+					// 	this.hollowCircleMode = false;
+					// 	this.penMode = false;
+					// 	this.colorPanelShow = false;
+					// 	this.drawContext.strokeStyle = this.currentColor;
+					// 	// this.drawContext.restore();
+					// 	break;
+					// case 'hollowCircle':
+					// 	this.hollowRectMode = false;
+					// 	this.rectMode = false;
+					// 	this.circleMode = false;
+					// 	this.hollowCircleMode = true;
+					// 	this.penMode = false;
+					// 	this.colorPanelShow = false;
+					// 	this.drawContext.strokeStyle = this.currentColor;
+					// 	break;
+					// case 'rect':
+					// 	this.hollowRectMode = false;
+					// 	this.rectMode = true;
+					// 	this.circleMode = false;
+					// 	this.hollowCircleMode = false;
+					// 	this.penMode = false;
+					// 	this.colorPanelShow = false;
+					// 	this.drawContext.strokeStyle = this.currentColor;
+					// 	break;
+					// case 'circle':
+					// 	this.hollowRectMode = false;
+					// 	this.rectMode = false;
+					// 	this.circleMode = true;
+					// 	this.hollowCircleMode = false;
+					// 	this.penMode = false;
+					// 	this.colorPanelShow = false;
+					// 	this.drawContext.strokeStyle = this.currentColor;
+					// 	break;
+					default:
+						break;
+				}
+				if (url === 'clear' || url === 'save' || url === 'share' || url === 'close' || url === 'eraser') {
+					return;
+				}
+				this.toolArr.forEach((item, indexPath) => {
+					item.select = false;
+					if (indexPath === index) {
+						item.select = true;
+					}
+				})
+			},
+			clearDrawBoard() {
+				this.canvas_neto = []
+				this.initBoard();
+				this.fillBackground(this.drawContext);
+			},
+			initBoard() {
+				this.drawContext.setLineCap('round') // 让线条圆润
+				this.drawContext.strokeStyle = this.currentColor;
+				this.drawContext.setLineWidth(this.lineWidth);
+			},
+			touchStart(e) {
+				this.initBoard();
+				if (this.penMode) {
+					// console.log('我能够进行绘制--touchStart---x' + e.touches[0].x + '----y----' + e.touches[0].y);
+					this.lineBegin(e.touches[0].x, e.touches[0].y)
+					this.canvas_neto.push({
+						point_x:e.touches[0].x,
+						point_y:e.touches[0].y,
+						currentColor:this.currentColor,
+						lineWidth:this.lineWidth,
+						list:[],
+					})
+					this.draw(true);
+				} else if (this.rectMode) {
+					// this.rectBegin(e.touches[0].x, e.touches[0].y)
+				} else if (this.hollowRectMode) {
+					// this.hollowRectBegin(e.touches[0].x, e.touches[0].y)
+				} else if (this.hollowCircleMode) {
+					// this.hollowCircleBegin(e.touches[0].x, e.touches[0].y)
+				} else if (this.circleMode) {
+					// this.circleBegin(e.touches[0].x, e.touches[0].y)
+				}
+				this.curDrawArr.push({
+					x: e.touches[0].x,
+					y: e.touches[0].y
+				});
+			},
+			touchMove(e) {
+				if (this.begin) {
+					if (this.penMode) {
+						// console.log('我能够进行绘制--touchMove----x' + e.touches[0].x + '----y----' + e.touches[0].y);
+						this.lineAddPoint(e.touches[0].x, e.touches[0].y);
+						this.draw(true);
+						this.canvas_neto[this.canvas_neto.length - 1].list.push({x:e.touches[0].x,y:e.touches[0].y})
+					} else if (this.rectMode) {
+						// this.drawRect(e.touches[0].x, e.touches[0].y, true);
+					} else if (this.hollowRectMode) {
+						// this.drawHollowRect(e.touches[0].x, e.touches[0].y, true);
+					} else if (this.hollowCircleMode) {
+						// this.drawHollowCircle(e.touches[0].x, e.touches[0].y, true);
+					} else if (this.circleMode) {
+						// this.drawCircle(e.touches[0].x, e.touches[0].y, true);
+					}
+					this.curDrawArr.push({
+						x: e.touches[0].x,
+						y: e.touches[0].y
+					});
+				}
+			},
+			touchEnd(e) {
+				// console.log('结束的坐标x:' + e.changedTouches[0].x + '结束的坐标y:' + e.changedTouches[0].y );
+				if (this.penMode) {
+					// console.log('我能够进行绘制--touchEnd----x' + e.changedTouches[0].x + '----y----' + e.changedTouches[0].y);
+					this.canvas_neto[this.canvas_neto.length - 1].list.push({x:e.changedTouches[0].x,y:e.changedTouches[0].y})
+					this.curDrawArr = [];
+					this.lineEnd();
+				} else if (this.rectMode) {
+					// this.drawRect(e.changedTouches[0].x, e.changedTouches[0].y, true);
+				} else if (this.hollowRectMode) {
+					// this.drawHollowRect(e.changedTouches[0].x, e.changedTouches[0].y, true);
+				} else if (this.hollowCircleMode) {
+					// this.drawHollowCircle(e.changedTouches[0].x, e.changedTouches[0].y, true);
+				} else if (this.circleMode) {
+					// this.drawCircle(e.changedTouches[0].x, e.changedTouches[0].y, true);
+				}
+			},
+			hollowRectBegin(x, y) {
+				this.begin = true;
+				this.drawContext.beginPath()
+				this.startX = x;
+				this.startY = y;
+			},
+			rectBegin(x, y) {
+				this.begin = true;
+				this.drawContext.beginPath()
+				this.startX = x;
+				this.startY = y;
+			},
+			hollowCircleBegin(x, y) {
+				this.begin = true;
+				this.drawContext.beginPath()
+				this.startX = x;
+				this.startY = y;
+			},
+			circleBegin(x, y) {
+				this.begin = true;
+				this.drawContext.beginPath()
+				this.startX = x;
+				this.startY = y;
+			},
+			/**
+			 * 这里是画实体矩形
+			 */
+			// drawRect(x, y, isReverse) {
+			// 	let width = (x - this.startX) ? (x - this.startX) : (this.startX - x);
+			// 	let height = (y - this.startY) ? (y - this.startY) : (this.startY - y);
+			// 	this.drawContext.rect(this.startX, this.startY, width, height);
+			// 	this.drawContext.setFillStyle(this.currentColor);
+			// 	this.drawContext.fill();
+			// 	this.draw(isReverse);
+			// },
+			/**
+			 * 这里是画空心矩形
+			 * 方法是根据四个坐标点画
+			 * 四条线进行连接
+			 */
+			// drawHollowRect(x, y, isReverse) {
+			// 	let pointLT = {};
+			// 	let pointRB = {};
+			// 	let pointRT = {};
+			// 	let pointLB = {};
+			// 	let center = {};
+
+			// 	pointLT.X = (this.startX <= x) ? this.startX : x;
+			// 	pointLT.Y = (this.startY <= y) ? this.startY : y;
+
+			// 	pointRB.X = (this.startX >= x) ? this.startX : x;
+			// 	pointRB.Y = (this.startY >= y) ? this.startY : y;
+
+			// 	pointRT.X = pointRB.X;
+			// 	pointRT.Y = pointLT.Y;
+
+
+			// 	pointLB.X = pointLT.X;
+			// 	pointLB.Y = pointRB.Y;
+
+			// 	let width = (x - this.startX) ? (x - this.startX) : (this.startX - x);
+			// 	let height = (y - this.startY) ? (y - this.startY) : (this.startY - y);
+			// 	this.drawContext.rect(this.startX, this.startY, width, height);
+			// 	this.drawContext.setStrokeStyle(this.currentColor);
+			// 	this.drawContext.stroke();
+			// 	this.draw(isReverse);
+
+			// 	this.lastHollowRect = {
+			// 		x: this.startX,
+			// 		y: this.startY,
+			// 		width: Math.abs(width),
+			// 		height: Math.abs(height),
+			// 		pointLT: pointLT
+			// 	}
+			// 	this.clearLastHollowRect();
+			// },
+			// clearLastHollowRect() {
+			// 	console.log('上一个矩形对象:' + JSON.stringify(this.lastHollowRect));
+			// 	this.drawContext.clearRect(this.lastHollowRect.pointLT.X + this.lineWidth / 2, this.lastHollowRect.pointLT.Y + this
+			// 		.lineWidth / 2, this.lastHollowRect.width - this.lineWidth, this.lastHollowRect.height - this.lineWidth);
+			// },
+			// clearLastHollowCircle(x, y, r, cxt) { //(x,y)为要清除的圆的圆心,r为半径,cxt为context
+			// 	var stepClear = 1; //别忘记这一步  
+			// 	clearArc(x, y, r);
+
+			// 	function clearArc(x, y, radius) {
+			// 		var calcWidth = radius - stepClear;
+			// 		var calcHeight = Math.sqrt(radius * radius - calcWidth * calcWidth);
+
+			// 		var posX = x - calcWidth;
+			// 		var posY = y - calcHeight;
+
+			// 		var widthX = 2 * calcWidth;
+			// 		var heightY = 2 * calcHeight;
+
+			// 		if (stepClear <= radius) {
+			// 			cxt.clearRect(posX, posY, widthX, heightY);
+			// 			stepClear += 1;
+			// 			clearArc(x, y, radius);
+			// 		}
+			// 	}
+			// },
+			/**
+			 * 这里是画
+			 * 实心圆
+			 */
+			// drawCircle(x, y, isReverse) {
+			// 	let pointLT = {};
+			// 	let pointRB = {};
+			// 	let pointRT = {};
+			// 	let pointLB = {};
+			// 	let center = {};
+
+			// 	pointLT.X = (this.startX <= x) ? this.startX : x;
+			// 	pointLT.Y = (this.startY <= y) ? this.startY : y;
+
+			// 	pointRB.X = (this.startX >= x) ? this.startX : x;
+			// 	pointRB.Y = (this.startY >= y) ? this.startY : y;
+
+			// 	pointRT.X = pointRB.X;
+			// 	pointRT.Y = pointLT.Y;
+
+
+			// 	pointLB.X = pointLT.X;
+			// 	pointLB.Y = pointRB.Y;
+
+			// 	center.X = (pointRB.X + pointLT.X) / 2;
+			// 	center.Y = (pointRB.Y + pointLT.Y) / 2;
+
+			// 	let dx = pointRB.X - pointLT.X;
+			// 	let dy = pointRB.Y - pointLT.Y;
+			// 	let r = Math.sqrt(dx * dx + dy * dy) / 2;
+
+			// 	// console.log('圆心坐标:' + JSON.stringify(center));
+			// 	// console.log('半径:' + JSON.stringify(r));
+			// 	this.drawContext.arc(center.X, center.Y, r, 0, 2 * Math.PI);
+			// 	this.drawContext.setFillStyle(this.currentColor);
+			// 	this.drawContext.fill();
+			// 	// this.drawContext.stroke();
+			// 	this.draw(isReverse);
+			// },
+			/**
+			 * 这里是画
+			 * 空心圆
+			 */
+			// drawHollowCircle(x, y, isReverse) {
+			// 	let pointLT = {};
+			// 	let pointRB = {};
+			// 	let center = {};
+
+			// 	pointLT.X = (this.startX <= x) ? this.startX : x;
+			// 	pointLT.Y = (this.startY <= y) ? this.startY : y;
+
+			// 	pointRB.X = (this.startX >= x) ? this.startX : x;
+			// 	pointRB.Y = (this.startY >= y) ? this.startY : y;
+
+			// 	center.X = (pointRB.X + pointLT.X) / 2;
+			// 	center.Y = (pointRB.Y + pointLT.Y) / 2;
+
+			// 	let dx = pointRB.X - pointLT.X;
+			// 	let dy = pointRB.Y - pointLT.Y;
+			// 	let r = Math.sqrt(dx * dx + dy * dy) / 2;
+
+			// 	// console.log('圆心坐标:' + JSON.stringify(center));
+			// 	// console.log('半径:' + JSON.stringify(r));
+			// 	this.drawContext.arc(center.X, center.Y, r, 0, 2 * Math.PI);
+			// 	// this.drawContext.setFillStyle(this.currentColor);
+			// 	// this.drawContext.fill();
+			// 	this.drawContext.stroke();
+				
+			// 	this.drawContext.beginPath();
+			// 	this.drawContext.arc(center.X, center.Y, r - this.lineWidth / 2, 0, 2 * Math.PI);
+			// 	this.drawContext.setFillStyle(this.bgColor);
+			// 	this.drawContext.fill();
+				
+			// 	this.draw(isReverse);
+
+			// 	// this.clearLastHollowCircle(center.X, center.Y, r - this.lineWidth / 2, this.drawContext);
+			// },
+			// 开始绘制线条
+			lineBegin: function(x, y) {
+				this.begin = true;
+				this.drawContext.beginPath()
+				this.startX = x;
+				this.startY = y;
+				this.drawContext.moveTo(this.startX, this.startY)
+				this.lineAddPoint(x, y);
+			},
+			// 绘制线条中间添加点
+			lineAddPoint: function(x, y) {
+				this.drawContext.moveTo(this.startX, this.startY)
+				this.drawContext.lineTo(x, y);
+				this.drawContext.stroke();
+				this.startX = x;
+				this.startY = y;
+			},
+			// 绘制线条结束
+			lineEnd: function() {
+				this.drawContext.closePath();
+				this.begin = false;
+			},
+			// canvas上下文设置背景为透明色
+			fillBackground: function(context) {
+				const query = uni.createSelectorQuery().in(this);
+				query.select('.board').boundingClientRect(data => {
+					// console.log("得到布局位置信息" + JSON.stringify(data));
+					context.setFillStyle(this.bgColor);
+					context.fillRect(0, 0, data.width, data.height); //TODO context的宽和高待定
+					context.fill();
+					context.draw();
+				}).exec();
+			},
+			// canvas上下文设置背景为透明色
+			fillWelcomeBackground: function(context) {
+				const query = uni.createSelectorQuery().in(this);
+				query.select('.board').boundingClientRect(data => {
+					// console.log("得到布局位置信息" + JSON.stringify(data));
+					context.setFillStyle(this.bgColor);
+					context.fillRect(0, 0, data.width, data.height); //TODO context的宽和高待定
+					context.fill();
+					let pikaqiuW = 318;
+					let pikaqiuH = 288;
+					let pikaqiuX = (data.width - 318)/2;
+					let pikaqiuY = 80;
+					context.draw();
+				}).exec();
+			},
+			// 绘制canvas
+			// isReverse: 是否保留之前的像素
+			draw(isReverse = false, cb) {
+				this.drawContext.draw(isReverse, () => {
+					if (cb && typeof(cb) == "function") {
+						cb();
+					}
+				});
+			},
+			// 撤销方法
+			canvas_restore(e){
+				// console.log(this.canvas_neto)
+			    var that = this
+			    var canvas_neto = that.canvas_neto
+			    if(canvas_neto.length < 1){
+					uni.showToast({title: '不能再继续撤销了',icon: 'none'});
+					return false
+			    }
+			    this.drawContext.clearRect(0, 0, that.data.editorWidth, that.data.editorHeight)
+				canvas_neto.splice(canvas_neto.length - 1, 1); 
+				for(let i = 0;i < canvas_neto.length;i++){
+					this.drawContext.beginPath()
+					this.drawContext.moveTo(canvas_neto[i].point_x, canvas_neto[i].point_y)
+					this.drawContext.setLineCap('round') // 让线条圆润
+					this.drawContext.strokeStyle = canvas_neto[i].currentColor;
+					this.drawContext.setLineWidth(canvas_neto[i].lineWidth);
+					for(let j = 0;j < canvas_neto[i].list.length;j++){
+						this.drawContext.lineTo(canvas_neto[i].list[j].x, canvas_neto[i].list[j].y)
+						this.drawContext.stroke()
+					}
+				}
+				this.drawContext.draw();
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.board-container {
+		height: 100%;
+		width: 100%;
+			
+		.board {
+			position: absolute;
+			top: 0;
+			left: 0;
+			bottom: 0;
+			right: 0;
+			margin: auto;
+			transform: translateY(0);
+			display: block;
+			z-index: 100;
+
+			.board-canvas {
+				width: 100%;
+				height: 100%;
+				z-index: 100;
+			}
+
+		}
+		
+		.board-out {
+			transform: translateY(100%);
+			display: none;
+		}
+	}
+</style>
diff --git a/pages/login/common/t-game.vue b/pages/login/common/t-game.vue
new file mode 100644
index 0000000..f1460f0
--- /dev/null
+++ b/pages/login/common/t-game.vue
@@ -0,0 +1,245 @@
+<template>
+	<view v-show="show" class="t-wrapper" @touchmove.stop.prevent="moveHandle">
+		<view class="t-mask" :class="{active:active}" @click.stop="close"></view>
+		<view class="t-box" :class="{active:active}">
+			<!-- <view class="t-header">
+				<view class="t-header-button" @click="close">取消</view>
+				<view class="t-header-button" @click="confirm">确认</view>
+			</view> -->
+			<view style="width: 100%; height: 100%; position: absolute;">
+				<refresh @interrupt="interrupt" @pushToInterrupt="pushToInterrupt" @finished="finished" @scrolltolower="g" :scrollHeight="windowHeight">
+					<template slot="top">
+						<view style="color: #FFFFFF;position: absolute;  top: 0;width: 100%; text-align: center;" 
+						:style="'height:' + 40 + 'px; line-height:' + 40 + 'px;'">{{tip}}</view>
+					</template>
+					<template slot="content">
+						<view style="width:100%; margin: auto; height:calc(100% - 40upx); overflow: hidden;">
+							<view style="float: left; width: calc(100% / 3); margin: 40upx 0 0;" v-for="(item, index) in datalist" :key="index" @click="Worksdetail(item)">
+								<view style="width: 148.5upx; height: 204.6upx;margin: auto; position: relative;">
+									<image style="width: 148.5upx; height: 148.5upx; margin: auto;" 
+									:src="item.image + '?x-oss-process=image/resize,lfit,w_112'"
+									 mode="aspectFit"></image>
+									<!-- <view :style="{'mask-image':item.image ? 'url(' + item.image + ')' : 'none', 
+									'-webkit-mask-image':item.image ? 'url(' + item.image + ')' : 'none',background:item.design_color}"
+									  style="overflow: hidden; mask-size: 100%; -webkit-mask-size: 100%;
+									  margin-left:auto; margin-right: auto;mask-repeat:no-repeat;-webkit-mask-repeat: no-repeat;
+									  width: 148.5upx; height: 204.6upx; margin: auto;">
+									</view> -->
+									<view v-if="Number(item.game_discount) >  0" 
+									style="min-width: 39upx; position: absolute; top: 0; right: 0; 
+									background: #EF5354; border-radius: 8upx 0upx 11upx 8upx; text-align: center; padding: 2upx 8upx;
+									font-size: 12upx; font-weight: bold; color: #FFFFFF;">奖励¥{{item.game_discount}}</view>
+									<view style="display: flex; justify-content: center;">
+										<image v-for="(t, j) in item.game_level" :key="j"
+										 src="../../../static/xingxing.png" mode="" 
+										style="width: 15upx; height: 14upx;"></image>
+									</view>
+									
+								</view>
+							</view>
+							<view class="align-center" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);"
+							 v-if="datalist.length == 0">
+								<span class="iconfont icon-wushuju" style="font-size: 100upx; text-align: center; color: #B2B2B2;"></span>
+								<view style="color: #B2B2B2; text-align: center; line-height: 50upx;font-size: 24upx;">啊嘞,还是一片荒漠</view>
+							</view>
+						</view>
+					</template>
+					<template slot="bottom">
+						<view>
+						没有更多数据了
+						</view>
+					</template>
+				</refresh>
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js';
+	import refresh from '@/components/xing-refresh/xing-refresh.vue';
+	export default {
+		props: {
+			windowHeight: {
+				type: Number,
+				default: 563
+			}
+		},
+		components: {
+			refresh
+		},
+		data() {
+			return {
+				show: false,
+				active: false,
+				queryPage:{
+					page: 1,
+					per_page: 50,
+					's':'Works.gameWorksList',
+					'used_applets':4,
+					'game_type':1
+				},
+				datalist: [], //作品、贴图列表
+				tip: ''
+			};
+		},
+		created() {
+			
+		},
+		methods: {
+			Worksdetail(item){
+				this.close();
+				this.$emit('Worksdetail',item)
+			},
+			g(e){
+				uni.showLoading({
+					title: '正在加载中...'
+				})
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.datalist = this.datalist.concat(result.data)
+					this.queryPage.page += 1;
+					if (Math.ceil(result.total / result.per_page) <= this.queryPage.page) {
+						return setTimeout(() => {
+							uni.showToast({title: '没有更多数据了!',icon: 'none'});
+						}, 500);
+					}
+					uni.hideLoading();
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'})
+					uni.hideLoading();
+				});
+			},
+			interrupt(e) {
+				this.tip = '刷新中'
+				//模拟发送请求
+				setTimeout(e, 500);
+				this.tip = '刷新成功';
+				this.queryPage.page = 1
+				this.getShapeList()
+			},
+			pushToInterrupt() {
+				this.tip = '释放刷新';
+			},
+			finished() {
+				this.tip = '下拉刷新';
+			},
+			open(queryPage) {
+				this.show = true;
+				this.active = true;
+				// this.queryPage = queryPage
+				this.getShapeList()
+			},
+			// 贴图列表
+			getShapeList(){
+				this.queryPage.page = 1
+				this.datalist = []
+				uni.showLoading({title: '正在加载中...'})
+				homeservice.gameWorksList(this.queryPage).then(result => {
+					this.datalist = result.data
+					this.queryPage.page += 1;
+					uni.hideLoading();
+					this.tip = '';
+				}).catch(err => {
+					uni.showToast({title: err.msg,icon: 'none'})
+					uni.hideLoading();
+				});
+			},
+			moveHandle() {},
+			close() {
+				this.active = false;
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false;
+					}, 500)
+				})
+			},
+			// confirm() {
+			// 	this.close();
+			// 	this.$emit('confirm', {
+			// 		rgba: this.rgba,
+			// 		hex: this.hex
+			// 	})
+			// },
+		}
+	};
+</script>
+
+<style lang="scss">
+	//隐藏滚动条
+	::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		color: transparent;
+		display: none;
+	}
+	
+	.t-wrapper {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		box-sizing: border-box;
+		z-index: 9999;
+	}
+
+	.t-box {
+		width: 100%;
+		position: absolute;
+		bottom: 0;
+		padding: 30upx 0;
+		padding-top: 0;
+		// background: #262730;
+		background: #FFFFFF;
+		transition: all 0.3s;
+		transform: translateY(100%);
+		min-height: 80%;
+		overflow: hidden;
+	}
+
+	.t-box.active {
+		transform: translateY(0%);
+	}
+
+	.t-header {
+		display: flex;
+		justify-content: space-between;
+		width: 100%;
+		height: 100upx;
+		border-bottom: 1px #eee solid;
+		box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);
+		background: #fff;
+	}
+
+	.t-header-button {
+		display: flex;
+		align-items: center;
+		width: 150upx;
+		height: 100upx;
+		font-size: 30upx;
+		color: #666;
+		padding-left: 20upx;
+	}
+
+	.t-header-button:last-child {
+		justify-content: flex-end;
+		padding-right: 20upx;
+	}
+
+	.t-mask {
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.6);
+		z-index: -1;
+		transition: all 0.3s;
+		opacity: 0;
+	}
+
+	.t-mask.active {
+		opacity: 1;
+	}
+</style>
diff --git a/pages/login/login.vue b/pages/login/login.vue
new file mode 100644
index 0000000..3632cc2
--- /dev/null
+++ b/pages/login/login.vue
@@ -0,0 +1,352 @@
+<template>
+	<view class="full-width full-height">
+		<view style="min-height: 100%;">
+			<view class="start">
+				<image src="../../static/logo.jpg" mode="aspectFill" class="start_img"></image>
+				<view class="start_title">ColorPark</view>
+				<view class="start_text">{{startText}}</view>
+				<view class="longTitle">
+					<view>ColorPark,把爱穿在身上、棒在手心</view>
+					你的第一份爱的定制在这里开始
+				</view>
+				<view class="footer_but">
+					<!-- <button open-type="getUserInfo" @getuserinfo="getUserInfo" lang="zh_CN">
+						<image src="../../static/icon_wechat.png" mode="aspectFill"
+							style="width: 34upx; height: 30upx;"></image>
+						<text style="margin-left: 13upx;">微信一键登录</text>
+					</button> -->
+					<!-- 小程序登录、用户信息相关接口调整 -->
+					<button class="buttonGetUserInfo" hover-class="hover-class-bg" v-if="canIUseGetUserProfile"
+						@tap="getUserProfile">
+						<image src="../../static/icon_wechat.png" mode="aspectFill" class="icon_wechat"></image>
+						<text style="margin-left: 13upx;">获取头像昵称</text>
+					</button>
+					<button v-else open-type="getUserInfo" @getuserinfo="getUserInfo" lang="zh_CN"
+						class="buttonGetUserInfo" hover-class="hover-class-bg">
+						<image src="../../static/icon_wechat.png" mode="aspectFill" class="icon_wechat"></image>
+						<text style="margin-left: 13upx;">获取头像昵称</text>
+					</button>
+				</view>
+				<image src="../../static/logo.jpg" mode="aspectFill" class="logoimage"></image>
+			</view>
+		</view>
+		<view class="bottomText"> {{company}}</view>
+	</view>
+</template>
+
+<script>
+	import userService from '@/service/UserService';
+	import Env from '@/util/Env.js';
+	export default {
+		components: {},
+		computed: {
+			startText(){
+				return Env.getmalltext() || '色彩公园'
+			},
+			company(){
+				return Env.getcompany() || '深圳市瑞丰彩科技有限公司'
+			}
+		},
+		data() {
+			return {
+				long: false,
+				LoupanList: [],
+				userInfo: {
+					nickname: null
+				},
+				code: null,
+				canIUseGetUserProfile: false
+			};
+		},
+		methods: {
+			getUserProfile(e) {
+				uni.getSetting({
+					success(res){
+						//console.log('获取用户信息是否用户同意')
+						//console.log(res.authSetting)
+						//console.log(res.authSetting['scope.userInfo'])
+					}
+				})
+				let that = this;
+			    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
+			    // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
+			    wx.getUserProfile({
+				  lang:'zh_CN',
+			      desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+			      success: (Userres) => {
+					  console.log('getUserInfo 获取头像昵称')
+					  console.log(Userres)
+					  that.$base.Userres = Userres
+					  uni.showLoading({title: '正在登录中...',mask: true});
+					  uni.login({
+					  	provider: 'weixin',
+					  	success: (weixinres) => {
+					  		//console.log('uni.login')
+					  		//console.log(weixinres)
+					  		if (weixinres.code) {
+					  			that.loginInfo = Userres.userInfo;
+					  			that.loginInfo.encryptedData = Userres.encryptedData;
+					  			that.loginInfo.iv = Userres.iv;
+					  			that.loginInfo.code = weixinres.code;
+					  			userService.setWxInfo(that.loginInfo);
+					  			userService.cacheWxInfo(that.loginInfo);
+					  			userService.login({
+					  				s: 'Init.init',
+					  				code: that.loginInfo.code,
+					  				nickname: that.loginInfo.nickName || '微信用户',
+					  				gender:that.loginInfo.gender,
+					  				portrait: that.loginInfo.avatarUrl,
+					  				encryptedData:that.loginInfo.encryptedData,
+					  				iv:that.loginInfo.iv,
+									promoter_id:that.$base.promoter_id ,// 推广的员的编号
+									machine_id:that.$base.machine_id,//用户进入设备id
+					  			}).then(result => {
+									uni.hideLoading();
+					  				uni.showToast({title: '登录成功',icon: 'none'});
+					  				if (that.code) {
+					  					uni.redirectTo({
+					  						url: '../index/mall'
+					  					})
+					  				} else {
+					  					uni.navigateBack();
+					  				}
+					  			}).catch(err => {
+					  				uni.hideLoading();
+					  				uni.showToast({title: err.msg,icon: 'none'});
+					  			})
+					  		} else {
+								uni.hideLoading();
+					  			console.log('登录失败!' + res.errMsg)
+								uni.showToast({title: '登录失败!',icon: 'none'});
+					  		}
+					  	},
+					  	fail: (err) => {
+							uni.hideLoading();
+					  		console.error('uni.login授权登录失败:' + JSON.stringify(err));
+							uni.showToast({title: '授权登录失败',icon: 'none'});
+					  	}
+					  })
+			      },
+				  fail(err) {
+					uni.hideLoading();
+					//console.log("wx.getUserProfile获取用户信息失败", err)
+					uni.showToast({title: '获取用户信息失败',icon: 'none'});
+				  }
+			    })
+			},
+			getUserInfo(e) {
+				let that = this;
+				uni.getSetting({
+					success(res){
+						//console.log('获取用户信息是否用户同意')
+						//console.log(res.authSetting)
+						//console.log(res.authSetting['scope.userInfo'])
+					}
+				})
+				uni.getUserInfo({
+					success(Userres) {
+						//console.log('getUserInfo 获取头像昵称')
+						//console.log(Userres)
+						that.$base.Userres = Userres
+						uni.showLoading({title: '正在登录中...',mask: true});
+						uni.login({
+							provider: 'weixin',
+							success: (weixinres) => {
+								console.log('uni.login')
+								console.log(weixinres)
+								if (weixinres.code) {
+									that.loginInfo = Userres.userInfo;
+									that.loginInfo.encryptedData = Userres.encryptedData;
+									that.loginInfo.iv = Userres.iv;
+									that.loginInfo.code = weixinres.code;
+									userService.setWxInfo(that.loginInfo);
+									userService.cacheWxInfo(that.loginInfo);
+									userService.login({
+										s: 'Init.init',
+										code: that.loginInfo.code,
+										nickname: that.loginInfo.nickName || '微信用户',
+										gender:that.loginInfo.gender,
+										portrait: that.loginInfo.avatarUrl,
+										encryptedData: that.loginInfo.encryptedData,
+										iv: that.loginInfo.iv,
+										promoter_id: that.$base.promoter_id, // 推广的员的编号
+										machine_id: that.$base.machine_id, //用户进入设备id
+									}).then(result => {
+										uni.hideLoading();
+										uni.showToast({title: '登录成功',icon: 'none'});
+										if (that.code) {
+											uni.redirectTo({
+												url: '../index/mall'
+											})
+										} else {
+											uni.navigateBack();
+										}
+									}).catch(err => {
+										console.log(err)
+										uni.hideLoading();
+										uni.showToast({title: err.msg,icon: 'none'});
+									})
+								} else {
+									uni.hideLoading();
+									//console.error('uni.login授权登录失败:' + JSON.stringify(err));
+									uni.showToast({title: '授权登录失败',icon: 'none'});
+								}
+							},
+							fail: (err) => {
+								uni.hideLoading();
+								//console.error('授权登录失败:' + JSON.stringify(err));
+								uni.showToast({title: '授权登录失败',icon: 'none'});
+							}
+						})
+					},
+					fail(err) {
+						uni.hideLoading();
+						//console.log("wx.getUserProfile获取用户信息失败", err)
+						uni.showToast({title: '获取用户信息失败',icon: 'none'});
+					}
+				})
+			},
+			// 打开权限设置页提示框
+			showSettingToast(e) {
+				const that = this
+				wx.showModal({
+					title: '温馨提示',
+					content: '您已拒绝获取微信信息,请开启',
+					confirmText: '去设置',
+					showCancel: false,
+					content: e,
+					success: function(res) {
+						if (res.confirm) {
+							// /打开授权设置
+							uni.openSetting({
+								success(res) {
+									if (res.authSetting['scope.userInfo']) {
+										that.getUserInfo(e)
+									} else {
+										that.showSettingToast(e)
+									}
+								},
+								fail(err) {
+									console.log(err)
+								}
+							})
+						}
+					}
+				})
+			}
+		},
+		onLoad(options) {
+			console.log(options)
+			if (options.code) {
+				this.code = options.code
+			}
+		},
+		onShow() {
+			console.log('wx.getUserProfile')
+			console.log(wx.getUserProfile)
+			if (wx.getUserProfile) {
+				console.log('wx.getUserProfile可以使用')
+			  this.canIUseGetUserProfile = true
+			}
+			// // 判断用户有没有登录
+			// if (!this.$AppContext.checkLogin()) {
+
+			// } else {
+			// 	//先登陆
+			// 	let stat = this;
+			// 	uni.login({
+			// 		provider: 'weixin',
+			// 		success: (res) => {
+			// 			userService.login({s: 'Init.init',code: res.code}).then(data => {
+			// 				if (stat.$AppContext.checkLogin()) {
+			// 					stat.userInfo = data
+			// 				}
+			// 			}).catch(err => {
+			// 				uni.showToast({
+			// 					title: err.msg,
+			// 					icon: 'none'
+			// 				})
+			// 			});
+			// 		},
+			// 		fail: (res) => {
+			// 			uni.showToast({
+			// 				title: res.msg,
+			// 				icon: 'none'
+			// 			})
+			// 		}
+			// 	});
+			// }
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		width: 100%;
+		height: 100%;
+		background: #141319;
+	}
+
+	.start {
+		padding-bottom: 60upx; padding-top: 200upx;
+		.start_img {
+			width: 161upx;
+			height: 144upx;
+			display: block;
+			margin: 0upx auto 45upx;
+		}
+
+		.start_title {
+			font-size: 38upx;
+			font-weight: bold;
+			text-align: center;
+			color: #FFFFFF;
+		}
+
+		.start_text {
+			text-align: center;
+			font-size: 24upx;
+			font-family: Source Han Sans CN;
+			font-weight: 400;
+			color: #FFFFFF;
+			margin-top: 22upx;
+		}
+
+		.footer_but {
+			color: #fff;
+			text-align: center;
+			line-height: 90upx;
+			width: 610upx;
+			height: 90upx;
+			background: #F56364;
+			border-radius: 44upx;
+			margin: auto;
+			position: relative;
+			z-index: 99;
+		}
+	}
+
+	.buttonGetUserInfo {
+		background: #F56364;
+		font-size: 28upx;
+		color: #FFFFFF;
+		height: 90upx;
+		line-height: 90upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	.logoimage{
+		width: 664upx; height: 757upx; opacity: 0.03; position: absolute; left: 0; bottom: 0;
+	}
+	.bottomText{
+		margin-top: -60upx;text-align: center;color: #888888;font-size: 24upx; font-weight: 400; line-height: 60upx;
+	}
+	.longTitle{
+		width: 418upx; height: 71upx; margin: 128upx auto 111upx; font-size: 24upx;
+		font-family: PingFang SC; font-weight: 300; color: #FFFFFF; line-height: 48upx;text-align: center;
+	}
+	.icon_wechat{
+		width: 34upx; height: 30upx;
+	}
+</style>
diff --git a/pages/mall/experience.vue b/pages/mall/experience.vue
new file mode 100644
index 0000000..c382bf7
--- /dev/null
+++ b/pages/mall/experience.vue
@@ -0,0 +1,526 @@
+<template>
+	<view class="full-width content-color full-height">
+		<view v-if="loading == 1">
+			<view  v-if="key == 2" style="padding-top: 20upx;">
+				<view v-if="!list" style="margin: 50upx auto;text-align: center; color: #ccc;">啊嘞,了解色彩站</view>
+				<view style="width: 690upx; margin: auto; background: #282932; border-radius: 10upx;">
+					<view style="width: calc(100% - 46upx); margin:auto; padding: 38upx 0 28upx;">
+						<view style="display: flex; align-items: center; justify-items: center;">
+							<view style="width: 60%; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; word-break: break-all;
+							font-size: 40upx;color: #FFFFFF;">{{list.code || ''}}</view>
+							<view v-if="list.status.value == 1 || list.status.value == 2" @click="lineupone()" class="customized" style="background: #5CE6B5;color: #FFFFFF;">
+								正在定制:{{list.wait_user_num}}人
+							</view>
+							<view v-if="list.status.value == 0 || list.status.value == 3 || list.status.value == 4 || list.status.value == 5"
+							 @click="lineupone()" class="customized" style="background: #F2A03E;color: #FFFFFF;">
+								正在休息
+							</view>
+						</view>
+					</view>
+					<view style="display: flex;width: calc(100% - 40upx); margin:auto;padding: 29upx 0 40upx;">
+						<!-- 店铺图片 -->
+						<image @click="previewImg(list.shop.image,0)" :src="list.shop.image ? list.shop.image:'../../static/one.jpg'" mode="aspectFill" 
+						style="width: 314upx; height: 198upx; border-radius: 5upx;"></image>
+						<!-- 设备图片 -->
+						<image @click="previewImg(list.cover,0)" :src="list.cover ? list.cover:'../../static/two.jpg'" mode="aspectFill" 
+						style="width: 314upx; height: 198upx; border-radius: 5upx;margin-left: auto;"></image>
+					</view>
+					<view v-if="list.status.value == 1 || list.status.value == 2" style="background: #5CE6B3; height: 10upx; border-radius:0 0 10upx 10upx;"></view>
+					<view v-if="list.status.value == 0 || list.status.value == 3 || list.status.value == 4 || list.status.value == 5" style="background: #F2A03E; height: 10upx; border-radius:0 0 10upx 10upx;"></view>
+				</view>
+			</view>
+			<!-- //1直营配送站 2 万能通用版 3色彩自助站 -->
+			<view v-if="key == 1 || key == 3" style="padding-top: 20upx;">
+				<view v-if="!list" style="margin: 50upx auto;text-align: center; color: #ccc;">啊嘞,了解色彩站</view>
+				<view v-if="list" class="full-width content-color">
+					<view style="width: 690upx; margin: auto; background: #282932; border-radius: 10upx;">
+						<view style="width: calc(100% - 46upx); margin:auto; padding: 38upx 0 28upx;">
+							<view style="display: flex; align-items: center; justify-items: center;">
+								<view style="width: 60%; 
+								white-space: nowrap; text-overflow: ellipsis; overflow: hidden; word-break: break-all;
+								font-size: 40upx;color: #FFFFFF;">{{list.shop.short_name || ''}}</view>
+								<view v-if="list.status.value == 1 || list.status.value == 2" @click="lineupone()" class="customized" style="background: #5CE6B5;color: #FFFFFF;">
+									正在定制:{{list.wait_user_num}}人
+								</view>
+								<view v-if="list.status.value == 0 || list.status.value == 3 || list.status.value == 4 || list.status.value == 5"
+								 @click="lineupone()" class="customized" style="background: #F2A03E;color: #FFFFFF;">
+									正在休息
+								</view>
+							</view>
+						</view>
+						<view style="width: calc(100% - 46upx); margin:auto;font-size: 26upx;color: #888888;">
+							<text>营业时间:</text>
+							<text v-if="list">{{start_time(list)}}-{{end_time(list)}}</text>
+						</view>
+						<view style="display: flex;width: calc(100% - 40upx); margin:auto;padding: 29upx 0 42upx;">
+							<!-- 店铺图片 -->
+							<image @click="previewImg(list.shop.image,0)" :src="list.shop.image ? list.shop.image:'../../static/one.jpg'" mode="aspectFill" 
+							style="width: 314upx; height: 198upx; border-radius: 5upx;"></image>
+							<!-- 设备图片 -->
+							<image @click="previewImg(list.cover,0)" :src="list.cover ? list.cover:'../../static/two.jpg'" mode="aspectFill" 
+							style="width: 314upx; height: 198upx; border-radius: 5upx;margin-left: auto;"></image>
+						</view>
+						<view @click="markertap" style="display: flex; align-items: center; 
+						width: calc(100% - 40upx); margin:auto;padding: 0 0 40upx;">
+							<view style="width: calc(100% - 100upx); font-size: 28upx; font-weight: 400; color: #FFFFFF; line-height: 40upx;
+							 text-overflow: -o-ellipsis-lastline; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3; line-clamp: 3; -webkit-box-orient: vertical; ">
+								{{addressdata()}}
+							</view>
+							<view style="width: 100upx;margin-left:auto;">
+								<view style="width: 70upx; height: 70upx; background: #FFFFFF; border-radius: 50%; margin: auto;">
+									<view class="iconfont iconditu" style="color: #5CE6B5; font-size: 32upx; 
+									line-height: 70upx; text-align: center;"></view>
+								</view>
+								<view style="width: 100upx;text-align: center;font-size: 24upx; color: #FFFFFF; margin-top: 10upx;">
+									{{myadress.distance >= 1 ? myadress.distance : myadress.distance * 1000 || '未知'}}{{myadress.distance >= 1 ? 'km' : 'm'}}
+								</view>
+							</view>
+						</view>
+						<view style="width: 633upx; height: 1px; background: #CCCCCC; opacity: 0.07; margin: auto;"></view>
+						<!-- 商品尺码库存 -->
+						<!-- <view v-if="key != 2" style="font-size: 28upx;color: #fff;background: #282932; border-radius: 10upx; padding: 20upx 20upx; overflow: hidden;" 
+						v-for="(itemstock,index) in list.stock" :key="index" @click="ordersize(itemstock.goods_id)">
+							<view style="line-height: 66upx; width: calc(100% - 66upx); margin: auto; text-align: center;">
+								<label v-for="(item,index) in itemstock.sub" :key="index" style="margin-right: 20upx;" >
+									<text style="font-weight: bold;">{{item.goods_size}}{{list.shop_id ? ':':''}}</text>
+									<text v-if="key != 2">
+										<text v-if="item.stock == 0" style="color: red;margin-left: 5upx;">{{item.stock}}件</text>
+										<text v-if="item.stock > 0 && item.stock < 10" style="color: yellow;margin-left: 5upx;">{{item.stock}}件</text>
+										<text v-if="item.stock >= 10" style="color: #ccc;margin-left: 5upx;">{{item.stock}}件</text>
+									</text>
+								</label>
+							</view>
+						</view> -->
+						<!-- <view v-if="key != 2"  style="margin:30upx; display: flex; align-items: center; width: calc(100% - 60upx);">
+							<view v-for="(item,index) in list.stock[0].sub" :key="index">
+								<view v-if="item.stock >= 1" class="size"  :class="[sizetext_id == item.id ? 'sizeactive':'' ]"  
+								@click="sizeclick(item)"> {{item.goods_size}} </view>
+								<view v-else class="size" style="color:#333333;"> {{item.goods_size}} </view>
+							</view>
+							<view style="color: #5CE6B6; margin-left: auto;" @click="ordersize(list.stock[0].goods_id)">尺码参考</view>
+						</view> -->
+						<view v-if="list.status.value == 1 || list.status.value == 2" style="background: #5CE6B3; height: 10upx; border-radius:0 0 10upx 10upx;"></view>
+						<view v-if="list.status.value == 0 || list.status.value == 3 || list.status.value == 4 || list.status.value == 5" style="background: #F2A03E; height: 10upx; border-radius:0 0 10upx 10upx;"></view>
+						
+						<view style="text-align: center; margin: 50upx 0; color: #FFFFFF;">
+							最近的色彩站离我
+							<text style="color: #5CE6B3;">{{myadress.distance >= 1 ? myadress.distance : myadress.distance * 1000 || '未知'}}{{myadress.distance >= 1 ? 'km' : 'm'}}</text>
+						</view>
+						<view @click="markertap" style="width: 230upx; height: 70upx; line-height: 70upx; text-align: center; color: #fff;
+						margin:60upx auto 0; border: 1upx solid #5CE6B3; border-radius: 35upx; background: #5CE6B3;">
+							我要去这里
+						</view>
+						<view @click="tomain" style="width: 230upx; height: 70upx; line-height: 70upx; text-align: center; color: #5CE6B3;
+						margin:60upx auto 0; border: 1upx solid #5CE6B3; border-radius: 35upx;">
+							去首页逛逛
+						</view>
+						<view style="height: 60upx;"></view>
+					</view>
+				</view>
+				
+			</view>
+		</view>
+		<!-- 错误提示信息 -->
+		<view v-if="loading == 2" style="min-height: 100%;">
+			<view class="start" style="padding-bottom: 100upx; padding-top: 200upx;">
+				<image src="../../static/home_icon_default_no.png" mode="aspectFill" class="start_img"></image>
+				<view class="start_title">啊嘞,当前没手机壳定制站在线哦</view>
+			</view>
+			<image src="../../static/logo.jpg" mode="aspectFill" style="width: 664upx; height: 757upx; opacity: 0.03; position: absolute; left: 0; bottom: 0;"></image>
+		</view>
+		<!-- 登录弹框 -->
+		<Signin ref="Signin"></Signin>
+	</view>
+</template>
+
+<script>
+	import Env from '@/util/Env.js';
+	import homeservice from '@/service/homeservice.js';
+	import userService from '@/service/UserService';
+	import Signin from '../index/Signin.vue';
+	export default {
+		components: {
+			Signin
+		},
+		computed: {
+			
+		},
+		data() {
+			return {
+				key:null,//1直营配送站 2 万能通用版 3色彩自助站
+				stockstatus:null,
+				imagePropone:{
+					mode:'widthFix',
+					padding:0,
+				},
+				imageProp:{
+					mode:'',
+					padding:0,
+				},
+				titleHeight: null,
+				params: {
+					machine_id: null,
+					s: 'machine.detail'
+				},
+				list: null,
+				loading:null,
+				myadress:{
+					latitude: "",
+					longitude: "",
+					distance:null
+				},
+				Adlists:[],
+				currentSwiper: 0,
+				msg:null,
+				
+				sizetext_id:null,
+				sizetext:null,
+				sizestock:null,
+				channel_no:null,
+				dict_id:null,
+				sn:null,
+			}
+		},
+		methods: {
+			tomain(){
+				uni.navigateTo({
+					url: '../index/mall'
+				})
+			},
+			ordersize(id){
+				uni.navigateTo({
+					url: '../mine/goodsordersize?id=' + id
+				})
+			},
+			// 打印列表
+			lineupone(){
+				uni.navigateTo({
+					url: '../mall/lineUp?machine_id=' + this.params.machine_id
+				})
+			},
+			// 地址转换
+			addressdata(){
+				return this.list.shop.address.replace('<br/>', '') || ''
+			},
+			start_time(e){
+				if(e != null && e.shop.start_time != null){
+					return e.shop.start_time.substr(0, 5)
+				}else{
+					return '';
+				}
+			},
+			end_time(e){
+				if(e != null && e.shop.end_time != null){
+					return e.shop.end_time.substr(0, 5)
+				}else{
+					return '';
+				}
+			},
+			previewImg(imgs, index) {
+				uni.previewImage({
+					current: index,
+					urls: [imgs]
+				});
+			},
+			insertStr(soure, start, newStr){   
+			   return soure.slice(0, start) + newStr + soure.slice(start);
+			},
+			getDetail() {
+				// 获取附近最近的色彩站
+				homeservice.queryList({
+					s: 'Machine.shopList',
+					longitude: this.myadress.latitude,
+					latitude: this.myadress.longitude,
+					distance:null,
+					test:1,
+				}).then(result => {
+					if(result.data.length > 0){
+						this.params.machine_id = result.data[0].id
+						uni.showLoading({title: '正在加载中...'})
+						homeservice.WorksList(this.params).then(res => {
+							this.loading = 1;
+							// this.loading = 2;
+							this.list = res;
+							this.list.shop.image = this.list.shop.image ? this.list.shop.image:'https://rfc.oss-cn-shenzhen.aliyuncs.com/back/16046524295fa50d8d35821.jpg'
+							this.list.cover = this.list.cover ? this.list.cover:'https://rfc.oss-cn-shenzhen.aliyuncs.com/back/16035294635f93eaf781904.jpg'
+							this.list.machine_category_text = null
+							this.Adlists = []
+							if(this.list.shop_id){
+								this.Adlists.push(res.shop.image,res.cover)
+							}else{
+								this.Adlists.push(res.cover)
+							}
+							this.list.category.forEach(item=>{
+								if(item.id ==  this.list.machine_category_id){
+									this.list.machine_category_text = item.title
+									this.key = item.key
+								}
+							})
+							// 检验库存是否为空
+							let num = 0
+							if(this.list.stock.length == 0){
+								this.stockstatus = '缺货'
+							}else{
+								this.list.stock.forEach(item=>{
+									item.sub.forEach(itemsub=>{
+										num += itemsub.stock
+									})
+								})
+								if(num == 0){
+									this.stockstatus = '缺货'
+								}
+							}
+							if(res.shop_id){
+								this.myadress.distance = this.GetDistance(this.myadress.latitude, this.myadress.longitude, res.shop.latitude, res.shop.longitude).toFixed(2)
+							}
+							uni.stopPullDownRefresh();
+							uni.hideLoading();
+						}).catch(err => {
+							this.msg = err.msg
+							uni.stopPullDownRefresh();
+							uni.hideLoading();
+							this.loading = 2;
+						});
+					}else{
+						this.loading = 2;
+					}
+				}).catch(err => {
+					
+				});
+			},
+			// 导航
+			markertap(e) {
+				uni.showLoading({title: '导航加载中...'});
+				uni.openLocation({
+					latitude: Number(this.list.shop.latitude),
+					longitude: Number(this.list.shop.longitude),
+					name: this.list.shop.short_name,
+					success: (result) => {
+						uni.hideLoading();
+					},
+					fail: (res) => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '地址信息获取失败',
+							icon: 'none'
+						});
+					}
+				});
+			},
+			// 方法定义 lat,lng
+			GetDistance(lat1, lng1, lat2, lng2) {
+				var radLat1 = lat1 * Math.PI / 180.0;
+				var radLat2 = lat2 * Math.PI / 180.0;
+				var a = radLat1 - radLat2;
+				var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
+				var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
+					Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
+				s = s * 6378.137; // EARTH_RADIUS;
+				s = Math.round(s * 10000) / 10000;
+				return s;
+			},
+			getSetting() {
+				const that = this
+				uni.getSetting({
+					success(res) {
+						if (res.authSetting['scope.userLocation']) {
+							that.getLocation()
+						} else {
+							that.getAuthorize()
+						}
+					}
+				})
+			},
+			//  获取用户的地理位置,
+			getLocation() {
+				uni.showLoading({
+					title: '自动获取定位信息...'
+				})
+				const that = this
+				uni.getLocation({
+					type: 'gcj02',
+					altitude: true,
+					success(res) {
+						uni.hideLoading();
+						that.myadress = {
+							latitude: res.latitude,
+							longitude: res.longitude
+						}
+						that.getDetail()
+					},
+					// 授权失败
+					fail(err) {
+						uni.hideLoading();
+						// uni.showToast({title: '操作太频繁了,歇一歇',icon:'none',duration: 2000});
+						that.myadress = {
+							latitude: 0,
+							longitude: 0
+						}
+						that.getDetail()
+					}
+				})
+			},
+			// 用户授权
+			getAuthorize() {
+				const that = this
+				uni.authorize({
+					scope: 'scope.userLocation',
+					success(res) {
+						that.getLocation()
+					},
+					// 授权失败
+					fail(err) {
+						uni.showModal({
+							title: '提示',
+							content: '请授权位置获取附近的商家!',
+							showCancel: false,
+							confirmText: '确认授权',
+							success() {
+								uni.openSetting({
+									success(res) {
+										that.getAuthorize()
+									},
+									fail(err) {
+									}
+								})
+							}
+						})
+					}
+				})
+			},
+			getQueryString(url, name) {
+			  var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
+			  var r = url.substr(1).match(reg)
+			  if (r != null) {
+			    return r[2]
+			  }
+			  return null;
+			},
+			tologo(){
+				// 先登陆
+				let that = this;
+				uni.login({
+					provider: 'weixin',
+					success: (res) => {
+						userService.login({s: 'Init.init',code: res.code}).then(r => {
+							that.getSetting();
+						}).catch(err => {
+							that.$refs.Signin.init();
+						});
+					},
+					fail: (res) => {
+						uni.showToast({title: res.msg,icon: 'none'})
+					}
+				});
+			}
+		},
+		//上拉刷新
+		onReachBottom() {
+			
+		},
+		//下拉加载
+		onPullDownRefresh() {
+			
+		},
+		onReady() {
+			
+		},
+		onLoad(options) {
+			this.getSetting()
+		},
+		onShow() {
+			
+		},
+		onUnload() {
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "../index/css/main.css";
+	
+	.p{
+		width: calc(100% - 60upx);
+		margin: 0 30upx;
+		font-size: 26upx;
+		text-align:justify; 
+		text-justify:inter-ideograph;
+		color: #FFFFFF;
+	}
+	.p .text{
+		margin-top: 20upx;
+	}
+	.p .span{
+		width: calc(100% - 60upx);
+		margin: 0 30upx;
+		font-size: 26upx;
+		text-align:justify; 
+		text-justify:inter-ideograph;
+		color: #FFFFFF;
+	}
+	
+	/* 解决图片之间间隙 */
+	.weixin-parse-img{
+	  display: flex; 
+	  margin-top:-5rpx; 
+	  width: 100% !important;
+	}
+	page {
+		width: 100%;
+		background: #131319 !important;
+	}
+	.bottom{
+		position: fixed; 
+		bottom: 0upx; 
+		background: #F56364;
+		width: 100%;
+		height: 100upx;
+		line-height:100upx; 
+		text-align: center;
+		font-size: 36upx;
+		color: #fff;
+		z-index: 9999;
+	}
+	
+	.start {
+		.start_img {
+			width: 513upx;
+			height: 251upx;
+			display: block;
+			margin: 0upx auto 102upx;
+		}
+		.start_title {
+			font-size: 30upx;
+			text-align: center;
+			color: #FFFFFF;
+		}
+		.start_text {
+			width: 70%;
+			text-align: center;
+			font-size: 28upx;
+			font-family: Source Han Sans CN;
+			font-weight: 400;
+			color: #FFFFFF;
+			margin: 22upx auto 0;
+			line-height: 28upx;
+		}
+	}
+	
+	.customized{
+		margin-left: auto; width: 198upx;height: 48upx;line-height:48upx;
+		font-size: 24upx; border-radius: 24upx;
+		text-align: center;vertical-align: middle;
+	}
+	// 尺码
+	.size{
+		width: 68upx; height: 68upx; background: #1E1E2A; text-align: center;
+		line-height: 68upx; color: #888888; border-radius: 5upx;
+		margin-right: 26upx;border: 1upx solid #1E1E2A;
+	}
+	.sizeactive{
+		width: 68upx; height: 68upx; background: #1E1E2A; text-align: center;
+		line-height: 68upx; border-radius: 5upx; 
+		border: 1upx solid #EF6262; color: #EF6262;
+	}
+</style>
diff --git a/pages/mall/knowPhone.vue b/pages/mall/knowPhone.vue
new file mode 100644
index 0000000..fe1fcea
--- /dev/null
+++ b/pages/mall/knowPhone.vue
@@ -0,0 +1,215 @@
+<template>
+	<view class="full-width content-color full-height">
+		<!-- <view class="red">设备品牌:{{app.brand}}</view>
+		<view class="red">设备型号:{{app.model}}</view> -->
+		<!-- <view>设备像素比:{{app.pixelRatio}}</view>
+		<view>屏幕宽度:{{app.screenWidth}}</view>
+		<view>屏幕高度:{{app.screenHeight}}</view>
+		<view>可使用窗口宽度:{{app.windowWidth}}</view>
+		<view>可使用窗口高度:{{app.windowHeight}}</view>
+		<view>可使用窗口的顶部位置:{{app.windowTop}}</view>
+		<view>可使用窗口的底部位置:{{app.windowBottom}}</view>
+		<view>状态栏的高度:{{app.statusBarHeight}}</view>
+		<view>导航栏的高度:{{app.navigationBarHeight}}</view>	
+		<view>标题栏高度:{{app.titleBarHeight}}</view>
+		<view>应用设置的语言:{{app.language}}</view>	
+		<view>引擎版本号:{{app.version}}	</view>
+		<view>设备磁盘容量:{{app.storage}}</view>	
+		<view>当前电量百分比:{{app.currentBattery}}	</view>
+		<view>宿主APP名称:{{app.appName}}</view>
+		<view>App平台:{{app.AppPlatform}}</view>
+		<view>宿主平台:{{app.host}}</view>
+		<view>当前运行的客户端:{{app.app}}</view>
+		<view>上一次缓存的位置信息:{{app.cacheLocation}}</view>
+		<view>操作系统版本:{{app.system}}</view>
+		<view>客户端平台:{{app.platform}}</view>
+		<view>用户字体大小设置:{{app.fontSizeSetting}}</view>
+		<view>客户端基础库版本:{{app.SDKVersion}}</view>
+		<view>宿主平台版本号:{{app.swanNativeVersion}}</view>	
+		<view>允许微信使用相册的开关(仅 iOS 有效):{{app.albumAuthorized}}</view>
+		<view>允许微信使用摄像头的开关:{{app.cameraAuthorized}}</view>
+		<view>允许微信使用定位的开关:{{app.locationAuthorized}}</view>
+		<view>允许微信使用麦克风的开关:{{app.microphoneAuthorized}}</view>
+		<view>允许微信通知的开关:{{app.notificationAuthorized}}</view>
+		<view>允许微信通知带有提醒的开关(仅 iOS 有效):{{app.notificationAlertAuthorized}}</view>
+		<view>允许微信通知带有标记的开关(仅 iOS 有效):{{app.notificationBadgeAuthorized}}</view>
+		<view>允许微信通知带有声音的开关(仅 iOS 有效):{{app.notificationSoundAuthorized}}</view>
+		<view>蓝牙的系统开关:{{app.bluetoothEnabled}}</view>
+		<view>地理位置的系统开关:{{app.locationEnabled}}</view>
+		<view>Wi-Fi 的系统开关:{{app.wifiEnabled}}</view>
+		<view>在竖屏正方向下的安全区域:{{app.safeArea}}</view>
+		<view>在竖屏正方向下的安全区域插入位置(2.5.3+):{{app.safeAreaInsets}}</view>
+		<view>设备id:{{app.deviceId}}</view> -->
+		<view v-if="err" style="width: 100%; height: 100%;">
+			<view v-if="err.exist_model > 0 && err.model_stock > 0" style="color: #FFFFFF;">
+				<view style="display: flex; justify-content: center; margin: auto; align-items: center;">
+					<image :src="err.goods_image" mode="widthFix" style="width: 60%; border-radius: 5upx; background: #FFFFFF;"></image>
+				</view>
+				<view style="color: #F56364; text-align: center; font-size: 35upx;margin:50upx auto 20upx;">{{err.goods_name || ''}}</view>
+				<!-- <view style="display: flex; justify-content: center;">
+					<view style="margin:50upx auto 20upx; padding: 10upx 20upx;">
+						<view style="display: flex; line-height: 55upx; font-size: 35upx;">
+							<text>型号品牌:</text>
+							<text style="color: #F56364;">{{err.brand || ''}}</text>
+						</view>
+						<view style="display: flex; line-height: 55upx; font-size: 35upx;">
+							<text>型号名称:</text>
+							<text style="color: #F56364;">{{err.goods_name || ''}}</text>
+						</view>
+						<view style="display: flex; line-height: 55upx; font-size: 35upx;">
+							<text>入网型号:</text>
+							<text style="color: #F56364;">{{err.model || ''}}</text>
+						</view>
+					</view>
+				</view> -->
+				<!-- <view style="margin-top: 50upx; font-size: 35upx; text-align: left;">
+					<view>型号品牌:<text style="color: #F56364;">{{err.brand || ''}}</text></view>
+					<view>型号名称:<text style="color: #F56364;">{{err.goods_name || ''}}</text></view>
+					<view>入网型号:<text style="color: #F56364;">{{err.model || ''}}</text></view>
+				</view> -->
+			</view>
+			<view v-else style="display: flex;justify-content: center; align-items: center; 
+			width: 100%; height: 100%;color: #F56364; font-size: 35upx;">
+				手机无法识别,请在屏幕自主选择型号
+			</view>
+			<button v-if="err.exist_model > 0 && err.model_stock > 0 && buttonGetUserInfoState == true" class="buttonGetUserInfo" hover-class="hover-class-bg" @tap="getUserProfile">
+				<text>确认型号</text>
+			</button>
+			<button v-else class="buttonGetUserInfo hover-class-bg" @tap="getUserProfile">
+				<text>确认型号</text>
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	import Env from '@/util/Env.js'
+	import http from '@/util/http.js';
+	export default {
+		computed: {},
+		data() {
+			return {
+				machine_id:null,
+				app:null,
+				goods_id:null,
+				dict_id:null,
+				modeltext:null,
+				err:null,
+				buttonGetUserInfoState:true,
+			};
+		},
+		methods: {
+			getUserProfile(){
+				if(this.err.exist_model > 0 && this.err.model_stock > 0 && this.buttonGetUserInfoState == true){
+					this.buttonGetUserInfoState == false
+					console.log('处理')
+					var that = this
+					http.post('/userapplets/index/index',{
+						s : 'DeviceAccess.switchModel',
+						machine_id :this.machine_id,
+						goods_id :this.goods_id
+					}).then(result => {
+						console.log(result)
+						uni.showToast({title: result.msg,icon: 'none'})
+						that.buttonGetUserInfoState = false
+					}).catch(err => {
+						that.buttonGetUserInfoState = true
+						uni.showToast({ title: err.msg, icon: 'none' });
+					})
+					// homeservice.userapaletsIndex({
+					// 	s : 'DeviceAccess.switchModel',
+					// 	machine_id :this.machine_id,
+					// 	goods_id :this.goods_id
+					// }).then(result => {
+					// 	console.log(result)
+					// 	uni.showToast({title: '手机识别成功,请继续在屏幕上操作',icon: 'none'})
+					// 	this.buttonGetUserInfoState = false
+					// }).catch(err => {
+					// 	this.buttonGetUserInfoState = true
+					// 	uni.showToast({title: err.msg,icon: 'none'})
+					// });
+				}
+			},
+			// 获取该手机型号对应的商品信息
+			DeviceAccessgetModelGoods(){
+				homeservice.userapaletsIndex({
+					s : 'DeviceAccess.checkModelGoods',
+					machine_id :this.machine_id,
+					brand :this.app.brand, //设备品牌
+					model :this.app.model, //设备型号
+					// brand :'iPhone',
+					// model :'iPhone 6'
+				}).then(result => {
+					console.log(result)
+					this.goods_id = result.goods_id
+					// this.dict_id = result.dict_id
+					// this.modeltext = this.app.model //机型名
+					this.err = result
+				}).catch(err => {
+					this.err = err.data
+					uni.showToast({title: err.msg,icon: 'none'})
+				});
+			},
+			getQueryString(url, name) {
+			  var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
+			  var r = url.substr(1).match(reg)
+			  if (r != null) {
+			    return r[2]
+			  }
+			  return null;
+			}
+		},
+		// 下拉加载
+		onPullDownRefresh() {},
+		// 上拉加载
+		onReachBottom() {},
+		onLoad(options) {
+			//设备信息
+			let app = uni.getSystemInfoSync()
+			app.machine_id = options.machine_id || 0
+			app.s = 'DeviceAccess.create'
+			this.app = app
+			homeservice.DeviceAccesscreate(app).then(result => {
+				// console.log(result)
+			}).catch(err => {
+				// console.log(err)
+			});
+			if(options.machine_id){
+				this.machine_id = options.machine_id
+			}
+			if (options.q) { // 自定义获取二维码的携带的链接信息
+				// console.log(options.q)
+			    let qrUrl = decodeURIComponent(options.q)
+				this.machine_id = this.getQueryString(qrUrl, 'machine_id')
+			}
+			this.DeviceAccessgetModelGoods()
+		},
+		onShow() {}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		width: 100%;
+		background: #131319 !important;
+	}
+	.red{
+		color: red;
+	}
+	.buttonGetUserInfo {
+		width: 30%;
+		background: #F56364;
+		font-size: 28upx;
+		color: #FFFFFF;
+		height: 90upx;
+		line-height: 90upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		position: fixed;
+		bottom: 100upx;
+		left: 0;
+		right: 0;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/mall/lineUp.vue b/pages/mall/lineUp.vue
new file mode 100644
index 0000000..331a916
--- /dev/null
+++ b/pages/mall/lineUp.vue
@@ -0,0 +1,456 @@
+<template>
+	<view class="colletion full-width">
+		<view class="uni-tab-bar full-width">
+			<view class="content full-width" scroll-y>
+				<view v-if="LoupanList.length == 0 && stateindex == true">
+					<view class="noData">
+						<image src="../../static/icon_default_no.png" mode="aspectFill" class="noData_img"></image>
+						<view class="noData_title">
+							啊嘞,当前还没有打印任务呢<br>
+							<view class="noData_text">去定制一个作品吧</view>
+						</view>
+						<view class="noData_but" @click="tomain()">去定制</view>
+					</view>
+				</view>
+				<view v-else v-for="(designer, index) in LoupanList" :key="index"
+					style="background: #282932  !important;margin: 25upx 25upx; border-radius: 20upx;"
+					@click="self_help_payment(designer)">
+
+					<!-- color: #fff; border-bottom: 1upx solid #282A32; -->
+					<view style="color: #fff;  display: flex; align-items: center; justify-content: center;">
+
+						<view v-if="designer.user_id != userId" class="border-image-pesudo-no">
+							<view class="border-image-pesudo-in-no">
+								<!-- <view style="margin:20upx 30upx;width: 141upx; height:132upx; background-size:contain;
+						background-repeat:no-repeat; background-position: center; position: relative;" 
+						:style="{'background-image':' url(' + designer.front_image + ')'}"> -->
+								<!-- <image :src="designer.works_image + '?x-oss-process=image/resize,lfit,w_81'" mode="aspectFit" @click="previewImg(designer,0)"
+							style="width: 71upx; height:68upx; position: absolute;
+							left:0; right:0; top:0; bottom:0; margin:auto;"> -->
+								<image style="width: 100%;height: 100%;" src="../../static/img/icon_line_up_back.png"
+									mode="aspectFit"></image>
+								<image
+									style="width: 141upx; height: 132upx; margin:auto; display: block;position: absolute; z-index: 10;"
+									:src="designer.front_image" mode="aspectFit"></image>
+								<image
+									style="width: 141upx; height: 132upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;"
+									:src="designer.works_image + '?x-oss-process=image/resize,lfit,w_300'"
+									mode="aspectFit">
+								</image>
+							</view>
+						</view>
+
+						<view v-if="designer.user_id == userId" class="border-image-pesudo">
+							<view class="border-image-pesudo-in">
+								<!-- <view style="margin:20upx 30upx;width: 141upx; height:132upx; background-size:contain;
+						background-repeat:no-repeat; background-position: center; position: relative;" 
+						:style="{'background-image':' url(' + designer.front_image + ')'}"> -->
+								<!-- <image :src="designer.works_image + '?x-oss-process=image/resize,lfit,w_81'" mode="aspectFit" @click="previewImg(designer,0)"
+							style="width: 71upx; height:68upx; position: absolute;
+							left:0; right:0; top:0; bottom:0; margin:auto;"> -->
+								<image style="width: 100%;height: 100%;" src="../../static/img/icon_line_up_back.png"
+									mode="aspectFit"></image>
+								<image
+									style="width: 141upx; height: 132upx; margin:auto; display: block;position: absolute; z-index: 10;"
+									:src="designer.front_image" mode="aspectFit"></image>
+								<image
+									style="width: 141upx; height: 132upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;"
+									:src="designer.works_image + '?x-oss-process=image/resize,lfit,w_300'"
+									mode="aspectFit">
+								</image>
+							</view>
+						</view>
+
+
+						<view style="width: calc(100% - 360upx);">
+							<view style="width: 90%;font-size: 28upx;">
+								<text style="font-size: 40upx;font-weight: bold;">{{designer.id || ''}}</text>
+							</view>
+							<view style="font-size: 24upx; color: #FFFFFF; margin-top: 30upx;">
+								{{designer.goods_name || ''}}
+							</view>
+							<!-- <view style="font-size: 24upx; color: #FFFFFF; margin-top: 10upx;">{{designer.goods_specs || ''}}</view> -->
+						</view>
+						<view style="margin-right: 20upx; margin-left: auto; padding-top:75upx">
+							<view v-if="designer.status.value == 1"
+								style="width: 136upx; height: 60upx;background: #7948ea;border-radius:30upx; background: linear-gradient(92deg, #178CE6, #984ACE);opacity: 0.86; ">
+								<view style="text-align: center; font-size: 28upx; color: #FFFFFF; line-height: 60upx;">
+									打印中 </view>
+							</view>
+							<view v-else
+								style="width: 136upx; height: 60upx;background: transparent;border-radius: 30upx;">
+								<view style="text-align: center; font-size: 28upx; color: #8148BB; line-height: 60upx;">
+									排队中 </view>
+							</view>
+						</view>
+						<!-- 订单状态 0:等待生产,1:生产中,2: 生产完成,3:取消生产,4:出料中(弃用),5: 等待取料(弃用),
+							6:待入货(弃用),7:取货完成,8:已发货,9:订单完成 -->
+						<!-- <view v-else style="width: 200upx;">
+							<view v-if="index == 0">
+								<view v-if="designer.status.value == 4" style="text-align: center; font-size: 30upx; color: #F56464;">{{designer.status.text}}</view>
+								<view v-else-if="designer.status.value == 1" style="text-align: center; font-size: 30upx; color: #FF8B00;">{{designer.status.text || ''}}</view>
+								<view v-else style="text-align: center; font-size: 30upx;">{{designer.status.text}}</view>
+							</view>
+							<view v-else>
+								<view style="text-align: center; font-size: 30upx;line-height: 50upx;">排队中</view>
+							</view>
+						</view> -->
+					</view>
+				</view>
+			</view>
+			<!-- 提示 -->
+			<view v-if="sighstate">
+				<view
+					style="position: fixed; z-index:999; width: 100%; height: 100%; background:rgba(0,0,0,0.6); top: 0;"
+					@click.stop="sighstate = false"></view>
+				<view style="position: fixed; z-index: 1000; top: 0; left: 0; bottom: 0; right: 0; margin: auto;
+				width: 558upx; height: 600upx; background: #FFFFFF; border-radius: 10upx;
+				display: flex; align-items: center; justify-content: center;">
+					<view style="position: absolute;
+					top: 0; right: 0;" @click.stop="sighstate = false">
+						<image src="../../static/icon_guanbi.png" mode=""
+							style="width: 26upx; height: 26upx; padding: 12upx 22upx;"></image>
+					</view>
+					<view style="width: 558upx;">
+						<view style="display: flex; align-items: center; justify-content: center;  
+						 width: 100%; height: 360upx;   ">
+
+							<!-- <view
+								style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;flex-direction: column;"> -->
+							<!-- <image src="../../static/icon_paidui.png" mode="aspectFill" 
+								style="width: 154upx; height: 154upx; margin: auto;"></image> -->
+							<image :src="designer.works_image + '?x-oss-process=image/resize,lfit,w_150'"
+								mode="aspectFit" style="width:150upx; "></image>
+							<image :src="designer.back_image + '?x-oss-process=image/resize,lfit,w_150'"
+								mode="aspectFit" style=" width: 150upx; margin-left: -150upx;  "></image>
+
+							<!-- 	</view> -->
+
+						  </view>
+						<view style="text-align: center; font-size: 36upx; margin-top: 5upx;">作品排队中</view>
+						<view style="text-align: center; font-size: 36upx;">如需要打印可与客服确认</view>
+
+						<view v-if="designer.user_id == userId " @click="toOrderDetail(designer)" style="width: 135upx; height: 55upx;background: #E7BC15; 
+					     border-radius: 40upx;
+						 color: #FFFFFF; 
+					     margin:10upx auto; 
+						 text-align: center;
+						 padding:auto;
+						 padding-top: 15upx;">查看详情</view>
+					</view>
+
+					<!-- 查看详情 -->
+					<!-- <view style="width: 100%;" >
+							<view style="width: 136upx; height: 60upx;background: #E7BC15;border-radius: 30upx; color: #FFFFFF; text-align: center; ">查看详情</view>
+						</view> -->
+
+				</view>
+			</view>
+		</view>
+		<!-- 提示完 -->
+	</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	import userService from '@/service/UserService';
+	import Enums from '@/util/Enums';
+	import Env from '@/util/Env.js';
+	export default {
+		computed: {
+
+		},
+		data() {
+			return {
+				LoupanList: [],
+				dataLoadState: {
+					pullDownRefresh: false,
+					reachBottom: false
+				},
+				queryPage: {
+					s: 'Machine.wait', //获取设备打印等待列表
+					machine_id: null,
+					page: 1,
+					per_page: 15,
+					// total: 0
+				},
+				stateindex: false,
+				key: null, //1直营配送站 2 万能通用版 3色彩自助站
+				sighstate: false,
+				statetime: null,
+				animMaind_time: 10000, //动画时间----刷子上下动画时间
+				designer: null,
+				userId: null, //用户信息
+
+			};
+		},
+		methods: {
+
+		
+
+			//调转订单详情
+			toOrderDetail(item) {
+				this.sighstate = false;
+				var url = this.$Env.getBaseURL();
+				var envVersionName = "trial";
+				if (url.indexOf("colorpark") != -1) {
+					envVersionName = "release";
+				}
+				//console.log("envVersionName="+envVersionName)
+				wx.navigateToMiniProgram({
+					appId: this.$Env.getappId(),
+					path: '/pages/mine/self_help_payment_details?orderId=' + item.order_id +
+						'&type=null&machine_id=' + item.machine_id,
+					extraData: {
+						foo: 'bar'
+					},
+					envVersion: envVersionName,
+					success(res) {
+						// 打开成功
+					},
+					fail(res) {
+						console.log("打开小程序失败")
+					}
+				});
+			},
+
+
+			self_help_payment(designer) {
+
+				if (designer.user_id != this.userId) {
+					return;
+				}
+				homeservice.WorksList({
+					machine_id: this.queryPage.machine_id,
+					s: 'machine.detail'
+				}).then(res => {
+					if (this.key == 2) {
+						this.designer = designer
+						if (designer.status.value == 1) {
+							this.clearIntervalTime()
+							uni.navigateTo({
+								url: '../mine/self_help_payment_details?orderId=' + designer
+									.order_id +
+									'&type=' + this.key + '&machine_id=' + this.queryPage
+									.machine_id
+							})
+						} else {
+							if (this.sighstate == true) return;
+							this.sighstate = true
+						}
+					}
+				}).catch(err => {
+					uni.showToast({
+						title: '设备休息中',
+						icon: 'none',
+						duration: 2000
+					});
+				});
+			},
+			tomain() {
+				uni.navigateBack();
+			},
+			previewImg(designer, index) {
+				let img = designer.works_image
+				uni.previewImage({
+					current: index,
+					urls: [img]
+				});
+			},
+			loadGoodsList(direction) {
+				// uni.showLoading({ title: '加载中...' });
+				if (this.dataLoadState.pullDownRefresh || this.dataLoadState.reachBottom) return;
+				this.dataLoadState.pullDownRefresh = direction === Enums.DATA_DIRECTION.UP;
+				this.dataLoadState.reachBottom = direction === Enums.DATA_DIRECTION.DOWN;
+				if (this.dataLoadState.reachBottom) {
+					if (Math.ceil(this.queryPage.total / this.queryPage.per_page) < this.queryPage.page) {
+						return setTimeout(() => {
+							uni.showToast({
+								title: '啊嘞,没有更多数据了!',
+								icon: 'none'
+							});
+						}, 500);
+					}
+				}
+				homeservice.queryList(this.queryPage).then(result => {
+					/*result.forEach((item, index) => {
+						// console.log(index)
+						let obj = index + 1
+						item.lineup = obj < 10 ? "0" + obj : obj
+						// console.log(item.lineup)
+					}) */
+					this.stateindex = true
+					// (index + 1).padStart(2,'0')
+					// 触底更新时,当前列表+查询结果集
+					// let newList = this.LoupanList.concat(result)
+					// this.LoupanList = newList
+					/* let LoupanNewList = [];
+					result.forEach((item, index) => {
+						if (this.userId == item.user_id) {
+							LoupanNewList.push(item)
+						}
+					}) */
+					//this.LoupanList = LoupanNewList
+					this.LoupanList = result
+					// 分页对象处理
+					this.queryPage.total = result.total;
+					this.queryPage.per_page = result.per_page;
+					// 停止当前页面下拉刷新
+					if (this.dataLoadState.pullDownRefresh) uni.stopPullDownRefresh();
+					// 数据加载状态处理 false
+					this.dataLoadState.pullDownRefresh = false;
+					this.dataLoadState.reachBottom = false;
+					// uni.hideLoading();
+				}).catch(err => {
+					// 停止当前页面下拉刷新
+					if (this.dataLoadState.pullDownRefresh) uni.stopPullDownRefresh();
+					// 数据加载状态处理 false
+					this.dataLoadState.pullDownRefresh = false;
+					this.dataLoadState.reachBottom = false;
+				});
+			},
+			// 做滚动加载使用
+			loadMore() {
+				
+			},
+			clearIntervalTime() {
+				clearInterval(this.statetime)
+				this.statetime = null
+			}
+		},
+		// 下拉加载
+		onPullDownRefresh() {
+			this.dataLoadState.pullDownRefresh = false;
+			this.dataLoadState.reachBottom = false;
+			this.queryPage.page = 1;
+			this.queryPage.total = 0;
+			this.LoupanList = []
+			this.loadGoodsList(Enums.DATA_DIRECTION.UP);
+		},
+		// 上拉加载
+		onReachBottom() {
+			console.log('上拉加载')
+			setTimeout(() => {
+				uni.showToast({
+					title: '啊嘞,没有更多数据了!',
+					icon: 'none'
+				});
+			}, 500);
+		},
+		onLoad(options) {
+			this.queryPage.machine_id = options.machine_id;
+			this.key = options.key;
+			this.LoupanList = []
+			this.queryPage.page = 1;
+			this.queryPage.total = 0;
+			var appUser = userService.getCacheAppUser();
+			if (appUser != null) {
+				this.userId = appUser.userInfo.id
+			}
+			//console.log("userInfo=" + this.userInfo.id);
+			this.loadGoodsList(Enums.DATA_DIRECTION.UP);
+			this.statetime = setInterval(function() {
+				this.dataLoadState.pullDownRefresh = false;
+				this.dataLoadState.reachBottom = false;
+				this.queryPage.page = 1;
+				this.queryPage.total = 0;
+				this.loadGoodsList(Enums.DATA_DIRECTION.UP);
+			}.bind(this), this.animMaind_time)
+		},
+		onShow() {
+			//console.log("userId=" + userService.getCacheAppUser().userInfo.id);
+
+		},
+		// 卸载程序
+		onUnload() {
+			this.clearIntervalTime()
+			let pages = getCurrentPages();
+			//console.log(pages[pages.length - 2].route)
+			if (pages[pages.length - 2].route == "pages/mine/order") {
+				uni.reLaunch({
+					url: '../index/start-up?machine_id=' + this.queryPage.machine_id + '&worksid=1'
+				})
+			} else if (pages[pages.length - 2].route == "pages/mine/orderNew") {
+				uni.reLaunch({
+					url: '../index/start-up?machine_id=' + this.queryPage.machine_id + '&worksid=1'
+				})
+			} else if (pages[pages.length - 2].route == "pages/index/index") {
+				uni.reLaunch({
+					url: '../index/start-up?machine_id=' + this.queryPage.machine_id + '&worksid=1'
+				})
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	@import "../index/css/css.css";
+
+	page {
+		background: #131319 !important;
+	}
+
+	.border-image-pesudo {
+		width: 150upx;
+		height: 150upx;
+		background: #131319;
+		margin: 25upx 35upx;
+		position: relative;
+		overflow: hidden;
+
+		//clip-path: inset(0 round 8upx);
+		.border-image-pesudo-in {
+			width: 100%;
+			height: 100%;
+			background: #282932;
+			//background-color: rgba(255,255,255,0.7);
+		}
+	}
+
+
+	.border-image-pesudo-no {
+		width: 150upx;
+		height: 150upx;
+		background: #131319;
+		margin: 25upx 35upx;
+		position: relative;
+		overflow: hidden;
+		opacity: 0.2;
+
+		.border-image-pesudo-in-no {
+			width: 100%;
+			height: 100%;
+			background: #282932;
+			//background-color: rgba(255,255,255,0.7);
+		}
+	}
+
+	/* .border-image-pesudo::before {
+	    content: "";
+	    position: absolute;
+	    width: 140upx;
+	    height: 140upx;
+	    top: 50%;
+	    left: 50%;
+	    transform: translate(-50%, -50%);
+	    border: 10upx solid;
+		
+		
+		background: #131319;
+		border: 5upx solid;
+		
+								
+		border-image: linear-gradient(0deg, #178CE6, #984ACE) 2 2;
+		
+	    
+	} */
+
+	.colletion {
+		.cart-ticket-null {
+			padding-top: 50upx;
+		}
+
+		.content {}
+	}
+</style>
diff --git a/pages/mine/goodsordersize.vue b/pages/mine/goodsordersize.vue
new file mode 100644
index 0000000..a758da1
--- /dev/null
+++ b/pages/mine/goodsordersize.vue
@@ -0,0 +1,77 @@
+<template>
+	<view class="detail full-width">
+		<!-- <view style="width: 484upx; min-height: 577upx;position: relative; margin:40upx auto 40upx;">
+			<image v-if="goods.preview" :src="goods.preview" 
+			style="width: 484upx; height: 577upx; margin:auto; display: block;"
+			mode="widthFix"></image>
+			<image v-if="goods.front_image" :src="goods.front_image"
+			 style="width: 484upx; height: 577upx; margin:auto; display: block; position: relative;z-index: 9;"
+			 mode="aspectFit"></image>
+		</view> -->
+		<uParse :content="goods.detail" v-if="goods.detail" />
+	</view>
+</template>
+
+<script>
+	import uParse from '@/components/uParse/src/wxParse.vue'
+	import homeservice from '@/service/homeservice.js'
+	export default {
+		components: {
+			uParse
+		},
+		computed: {
+
+		},
+		data() {
+			return {
+				goods: {},
+				queryPage:{}
+			};
+		},
+		methods: {
+			loadData() {
+				uni.showLoading({title: '正在加载中...'}) 
+				homeservice.queryList(this.queryPage).then(result => {
+					
+					this.goods = result
+					wx.setNavigationBarTitle({title: this.goods.name })
+					
+					
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({ title: err.msg || err.data, icon: 'none' });
+				});
+			}
+		},
+		onPullDownRefresh() {
+			this.loadData();
+		},
+		onLoad(options) {
+			if(options.surface_id){
+				this.queryPage.s = 'Surface.getDetail'
+				this.queryPage.surface_id = options.surface_id
+				this.loadData();
+			}
+			if(options.goods_id){
+				this.queryPage.s = 'Product.detail'
+				this.queryPage.id = options.goods_id
+				this.loadData();
+			}
+		},
+		onShow() {
+
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background: #131319 !important;
+		color: #fff;
+	}
+	.detail {
+		
+	}
+</style>
diff --git a/pages/mine/myorder.vue b/pages/mine/myorder.vue
new file mode 100644
index 0000000..6dcfbb4
--- /dev/null
+++ b/pages/mine/myorder.vue
@@ -0,0 +1,226 @@
+<template>
+	<view class="full-width content-color full-height" style="position: relative;">
+		<view class="full-width">
+			<!-- 动态数据 -->
+			<view scroll-y @scrolltolower="loadMore()" class="full-width" @touchend="touchEnd" v-if="long" >
+				<view v-for="(designer, index) in LoupanList" :key="index" @click="Withdrawal(designer)"
+				style="width: 100%; background: #131319 !important;">
+					
+					<view style="color: #fff; border-bottom: 1upx solid #282A32; display: flex; align-items: center;">
+						<view style="margin:20upx 30upx;width: 100upx; height: 185upx; ">
+							<view style="width: 100%; height: 100%; position: relative; overflow: hidden;">
+								<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+								<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;"
+								:src="designer.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+								<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+								:src="designer.front_image" mode="aspectFit"></image>
+							</view>
+							<!-- <image :src="designer.works_image + '?x-oss-process=image/resize,lfit,w_81'" 
+							mode="aspectFit" @click="previewImg(designer,0)"
+							style="width: 141upx; height:132upx; position: absolute;
+							left:0; right:0; top:0; bottom:0; margin:auto;"> -->
+							
+						</view>
+						<view style="width: calc(100% - 141upx);">
+							<view style="width: 90%;font-size: 28upx;">
+								<text style="font-size: 30upx;">{{designer.goods_specs || ''}}</text>
+								<text v-if="Number(designer.real_amount) <=  0" style="text-align: right; float: right; font-size: 30upx;">免费</text>
+								<text v-else style="text-align: right; float: right; font-size: 30upx;">¥{{designer.real_amount || ''}}</text>
+							</view>
+							<view style="width: 90%;font-size: 28upx; overflow: hidden;">
+								<text style="font-size: 24upx;font-weight: bold;color:#878787;">{{designer.create_time || ''}}</text>
+								<!-- 订单状态 0:等待生产,1:生产中,2: 生产完成,3:取消生产,4:出料中(弃用),5: 等待取料(弃用),
+								6:待入货(弃用),7:取货完成,8:已发货,9:订单完成 -->
+								<!-- 生产完成:绿色 等待生产:红色 其他状态:橘色 -->
+								<text v-if="designer.status.value == 2" style="text-align: right; float: right; font-size: 24upx; color: #854AC2;">{{designer.status.text || ''}}</text>
+								<text v-else-if="designer.status.value == 0" style="text-align: right; float: right; font-size: 24upx; color: #F56464;">{{designer.status.text || ''}}</text>
+								<text v-else-if="designer.status.value == 3" style="text-align: right; float: right; font-size: 24upx; color: #878787;">{{designer.status.text || ''}}</text>
+								<text v-else style="text-align: right; float: right; font-size: 24upx; color: #FF8B00;">{{designer.status.text || ''}}</text>
+							</view>
+						</view>
+					</view>
+					
+				</view>
+				<!-- 暂无相关信息 -->
+				<view @click="tomain()" class="align-center content-color" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);" 
+				v-if="LoupanList.length == 0 || LoupanList.length == null">
+					<span class="iconfont icon-wushuju" style="font-size: 100upx; text-align: center; color: #B2B2B2;"></span>
+					<image src="../../static/icon_default_no.png" mode="aspectFill" style="width: 513upx;
+					height: 251upx; display: block; margin: 0upx auto 37upx;"></image>
+					<view style="font-size: 30upx; text-align: center; color: #FFFFFF;">啊嘞,你还没下单呢</view>
+					<view style="color: #B2B2B2; text-align: center; font-size: 24upx; margin-top: 35upx;">
+						试着定制下个单吧
+					</view>
+					<view  @click="tomain()" style="width: 230upx; height: 70upx; line-height: 70upx; text-align: center; color: #854AC2;
+					margin:140upx auto 0; border: 1upx solid #854AC2; border-radius: 35upx;">
+						去定制
+					</view>
+				</view>
+			</view>
+			<!-- 动态数据完 -->
+		</view>
+		<!-- 返回顶部 -->
+		<view v-if="totopstatus" class="to-top content-color" @click="totop()">
+			<view class="fa fa-angle-right to-top-icon"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcon from '@/components/uni-icon/uni-icon.vue';
+	import Enums from '@/util/Enums';
+	import homeservice from '@/service/homeservice.js';
+	export default {
+		components: {
+			uniIcon
+		},
+		computed: {},
+		data() {
+			return {
+				long:false,
+				LoupanList: [], //数据
+				// 返回顶部
+				totopstatus: false,
+				// 上拉状态
+				dataLoadState: {
+					pullDownRefresh: false,
+					reachBottom: false
+				},
+				queryPage: {
+					s:'Order.list',
+					page: 1,
+					per_page: 20,
+					total:0
+				},
+			};
+		},
+		methods: {
+			tomain(){
+				uni.navigateTo({ url: '../index/mall' })
+			},
+			Withdrawal(item){
+				uni.navigateTo({ url: '../mine/self_help_payment_details?orderId=' + item.id + '&type=null&machine_id=' + item.machine_id })
+			},
+			// 加载数据
+			loadGoodsList(direction) {
+				if (this.dataLoadState.pullDownRefresh || this.dataLoadState.reachBottom) return;
+				uni.showLoading({title: '正在加载中...'})
+				this.dataLoadState.pullDownRefresh = direction === Enums.DATA_DIRECTION.UP;
+				this.dataLoadState.reachBottom = direction === Enums.DATA_DIRECTION.DOWN;
+				if (this.dataLoadState.reachBottom) {
+					if (Math.ceil(this.queryPage.total / this.queryPage.per_page) < this.queryPage.page) {
+						return setTimeout(() => {
+							uni.showToast({title: '没有更多数据了!', icon: 'none'});
+						}, 500);
+					}
+				}
+				homeservice.queryList(this.queryPage).then(result => {
+					console.log(result)
+					this.long = true
+					let queryList = result.data
+					// 下拉更新时,查询结果集
+					// 触底更新时,当前列表+查询结果集
+					let newList = this.LoupanList.concat(queryList)
+					this.LoupanList = newList
+					// console.log(this.LoupanList)
+					// 分页对象处理
+					this.queryPage.total = result.total;
+					this.queryPage.per_page = result.per_page;
+					// 停止当前页面下拉刷新
+					if (this.dataLoadState.pullDownRefresh) uni.stopPullDownRefresh();
+					// 数据加载状态处理 false
+					this.dataLoadState.pullDownRefresh = false;
+					this.dataLoadState.reachBottom = false;
+					uni.hideLoading();
+				}).catch(err => {
+					// 停止当前页面下拉刷新
+					if (this.dataLoadState.pullDownRefresh) uni.stopPullDownRefresh();
+					// 数据加载状态处理 false
+					this.dataLoadState.pullDownRefresh = false;
+					this.dataLoadState.reachBottom = false;
+					uni.hideLoading();
+				});
+			},
+			// 返回顶部
+			totop() {
+				uni.pageScrollTo({
+					scrollTop: 0,
+					duration: 300
+				});
+			},
+			touchEnd(e) {
+				if (e.mp.changedTouches[0].pageY > 1000) {
+					this.totopstatus = true
+				} else {
+					this.totopstatus = false
+				}
+			},
+			// 做滚动加载使用
+			loadMore() {
+				if (Math.ceil(this.queryPage.total / this.queryPage.per_page) < this.queryPage.page) {
+					return setTimeout(() => {
+						uni.showToast({title: '没有更多数据了!', icon: 'none'});
+					}, 500);
+				}
+				this.queryPage.page = this.queryPage.page + 1;
+				this.loadGoodsList(Enums.DATA_DIRECTION.DOWN);
+			},
+		},
+		// 下拉加载
+		onPullDownRefresh() {
+			this.dataLoadState.pullDownRefresh = false;
+			this.dataLoadState.reachBottom = false;
+			this.queryPage.page = 1;
+			this.queryPage.total = 0;
+			this.LoupanList = []
+			this.loadGoodsList(Enums.DATA_DIRECTION.UP);
+		},
+		// 上拉加载
+		onReachBottom() {
+			console.log('上拉加载')
+			if (this.LoupanList.length < 12) {
+				return setTimeout(() => {
+					uni.showToast({title: '没有更多数据了!', icon: 'none'});
+				}, 500);
+			}
+			this.queryPage.page = this.queryPage.page + 1;
+			this.loadGoodsList(Enums.DATA_DIRECTION.DOWN);
+		},
+		onLoad(options) {
+			// 判断用户有没有登录
+			if (!this.$AppContext.checkLogin()) uni.navigateTo({ url: '../login/login' });
+			else this.loadGoodsList(Enums.DATA_DIRECTION.UP);
+		},
+		onShow() {
+			
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		width: 100%;
+		height: 100%;
+		background: #141319;
+	}
+	
+	// 返回顶部
+	.to-top {
+		position: fixed;
+		bottom: 150upx;
+		right: 30upx;
+		width: 80upx;
+		height: 80upx;
+		border-radius: 50%;
+		text-align: center;
+		line-height: 80upx;
+		// box-shadow: 5upx 5upx 5upx #ebeef5;
+		transform: rotate(-90deg);
+		background: #000;
+		opacity: 0.5;
+		z-index: 999;
+	}
+	.to-top-icon {
+		color: #FFFFFF;
+	}
+</style>
diff --git a/pages/mine/nothingmachineid.vue b/pages/mine/nothingmachineid.vue
new file mode 100644
index 0000000..8500226
--- /dev/null
+++ b/pages/mine/nothingmachineid.vue
@@ -0,0 +1,70 @@
+<template>
+	<view class="full-width full-height" style="padding-top: 90upx;">
+		<view style="width: 220upx; margin:0 auto 40upx;">
+			 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/mine/Pick-up.png" mode="aspectFill"></image>
+		</view>
+		<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+			保存成功
+		</view>	
+			<view style="width: 430upx;
+				height: 90upx;
+				background: rgb(40, 41, 50,0.67);
+				border-radius: 45upx;
+				margin: 119upx auto 0;
+				font-size: 36upx;
+				font-family: Source Han Sans CN;
+				font-weight: 400;
+				line-height: 90upx;
+				text-align: center;
+				color: #FFFFFF;" @click="login()">
+				立即查看
+			</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	export default {
+		components: {},
+		computed: {},
+		data() {
+			return {
+				
+			};
+		},
+		methods: {
+			login() {
+				// develop	开发版
+				// trial	体验版
+				// release	正式版
+				wx.navigateToMiniProgram({
+				  appId: 'wx55b5b6d95c648041',
+				  path: '/pages/index/mine',
+				  extraData: {
+				    foo: 'bar'
+				  },
+				  envVersion: 'trial',
+				  success(res) {
+				    // 打开成功
+				  }
+				})
+			}
+		},
+		onPullDownRefresh() {
+			
+		},
+		onLoad(options) {
+			
+		},
+		onShow() {
+			
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background: #131319 !important;
+		color: #fff;
+	}
+</style>
diff --git a/pages/mine/order.vue b/pages/mine/order.vue
new file mode 100644
index 0000000..7f6200e
--- /dev/null
+++ b/pages/mine/order.vue
@@ -0,0 +1,708 @@
+<template>
+	<view class="full-width full-height">
+		<!-- 礼花 -->
+		<firework ref="firework" v-if="isReady" style="position: fixed;z-index: 9999;"></firework>
+		<scroll-view scroll-y
+			style="height:100%;width: 100%; overflow: hidden; overflow-y: scroll; position: relative;">
+			<view :style="{transform: 'translateX(' + translateX + 'px)'}"
+				style="position: absolute;transition: all 1.5s; height:100%;width: 100%;">
+				<!-- 设计区底图 -->
+				<view style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;overflow: hidden;">
+					<image src="https://img.colorpark.cn/wechat/track/shejiqu_2.png" mode="widthFix"
+						style="width: 100%;"></image>
+				</view>
+				<!-- 付款区底图 -->
+				<view style="position: absolute; top: 0; left: 100%; width: 100%; height: 100%;overflow: hidden;">
+					<image src="https://img.colorpark.cn/wechat/track/fukuanqu_2.png" mode="widthFix"
+						style="width: 100%;"></image>
+				</view>
+			</view>
+			<!-- 3D动画 -->
+			<view class='crate-wrapper' @touchstart.stop="dragStart" @touchmove.stop="dragMove"
+				@touchend.stop="dragEnd">
+				<view class="brush"
+					:style="{transform: 'translateX(' + activebrushX + 'px) scale(' + transformscale + ')'}">
+					<view class='crate' :class="{crateactive:crateactivestate}" :style="{width: data.editorWidth +'px',height: data.editorHeight +'px',
+					transform: 'rotateX(-15deg) rotateY(' + coordinate.numberY +'deg)'}">
+						<view class='side top'>
+							<!-- 上 -->
+							<image src="../../static/img/c.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side bottom' :style="{'-webkit-transform': 'translateY(' + (data.editorHeight - 20) + 'px) rotateX(90deg)',
+						transform: 'translateY(' + (data.editorHeight - 20) + 'px) rotateX(90deg)'}">
+							<!-- 下 -->
+							<image src="../../static/img/c.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side left'>
+							<image src="../../static/img/b.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side right' :style="{'-webkit-transform': 'translateX(' + (data.editorWidth - 20) + 'px) rotateY(90deg)',
+						transform: 'translateX(' + (data.editorWidth - 20) + 'px) rotateY(90deg)'}">
+							<image src="../../static/img/b.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side front'>
+							<!-- 前 -->
+							<image :src="background_surface_image + '?x-oss-process=image/resize,lfit,w_1500'" mode=""
+								style="position: absolute; width: 100%; height: 98%; left: 0; top: 0;"></image>
+							<!-- <view style="position: absolute; width: 100%; height: 98%; left: 0; top: 0; background: #fff;"></view> -->
+							<image :src="( good.icon ? good.icon : good.image )" mode="aspectFit"
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+							<image :src="good.goods.front_image " mode="aspectFit"
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side back'>
+							<!-- 后 -->
+							<image src="../../static/img/a.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+					</view>
+					<view style="margin-top: 50upx; text-align: center;" :style="{opacity:titlestate ? 1:0}">
+						<view style="font-size: 40upx; font-weight: bold;">
+							<text style="color: #FFFFFF;">{{good.goods.name || '**'}}</text>
+						</view>
+						<view style="margin-top: 25upx;">
+							<text style="color: #F56364;">
+								¥<text style="font-size: 46upx;" v-if="good">{{add}}</text>
+							</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		<view style="background: #282932; height: 100upx; position: fixed; width: 100%; bottom: 0; z-index: 999;">
+			<view style="width: 100%; height: 100upx; 
+			background: linear-gradient(-90deg, #178CE6, #984ACE); font-size: 36upx; 
+			font-weight: 400; text-align: center; line-height: 100upx; float: right; color: #FFFFFF;" @click="commitOrder">支付领取
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	import uniPopup from '../index/common/uni-popup/uni-popup.vue'
+	import Enums from '@/util/Enums';
+	import md5 from 'js-md5';
+	import firework from '@/components/ay-firework/firework.vue'; //礼花
+	export default {
+		components: {
+			uniPopup,
+			firework
+		},
+		computed: {
+			add(arg1, arg2) {
+				if (this.good != null && this.coupon != null) {
+					if (this.coupon.discount_amount != undefined) {
+						return (Math.round(this.good.sales_price * 100) + Math.round(this.good.goods.sales_price * 100) -
+							Math.round(this.coupon.discount_amount * 100)) / 100;
+					} else {
+						return (Math.round(this.good.sales_price * 100) + Math.round(this.good.goods.sales_price * 100)) /
+							100;
+					}
+				} else {
+					return ''
+				}
+			},
+			// 相乘
+			multiple(arg1, arg2) {
+				return (Math.round(arg1 * 100) * Math.round(arg2 * 100)) / 10000;
+			},
+		},
+		data() {
+			return {
+				coupon_flag_desc: null,
+				type: 'bottom',
+				tabletext: true, // true设备 false快递
+				good: null, //商品数据
+				equipmentlist: [], //设备列表数据
+				machine_id: null, //设备id
+				machine_item: null, //设备信息
+				goods_id: null, //商品id
+				works_id: null, //作品id
+				sizetext_id: null,
+				sizetext: null, //选中设备的尺码
+				give_sizetext: null, //选中配送的尺码
+				give_dict_id: null, //属性字典id
+				sizestock: null, //尺码库存
+				channel_no: null, //货道
+				dict_id: null, //属性字典id
+				coupon: null, //优惠劵
+				stock: null, //尺码
+				machine_pages: true, //设备进来的状态
+				myadress: {},
+				loading: false,
+				orderIdone: null, //订单号
+				orderIdtwo: null, //订单号
+				resultpayone: null,
+				resultpaytwo: null,
+				listtmplIds: [],
+				sn: null, //前端查询标志
+				activebrushX: -400, //动画进来出去
+				crateactivestate: false, //开始自转
+				titlestate: false,
+				isReady: false, //礼花
+				data: {
+					windowWidth: 0, // 屏幕宽度
+					windowHeight: 0, // 屏幕高度
+					pixelRate: 0, // 屏幕宽度比率
+					editorWidth: 0, // 设计宽度
+					editorHeight: 0, // 设计高度
+					render_cove_width: null,
+					render_cove_height: null,
+					render_left: null,
+					render_top: null,
+				},
+				teststate: false, //开启测试模式 false  true
+				translateX: 0,
+				coordinate: {
+					startX: 0,
+					startY: 0,
+					touchMoveX: 0,
+					touchMoveY: 0,
+					numberY: 0,
+					state: false,
+				},
+				transformscale: 1, //整体缩小
+				key: null,
+				background_surface_image: null, //定制壳手机壳底色
+				machineDetail: null, //设备详情
+				customize_size_id: "",  //自定以产品Id
+			};
+		},
+		methods: {
+			dragStart(e) {
+				if (!this.coordinate.state) return; // 记录点击时的坐标值
+				this.coordinate.startX = e.touches[0].clientX;
+				this.coordinate.startY = e.touches[0].clientY;
+			},
+			dragMove(e) {
+				if (!this.coordinate.state) return;
+				this.coordinate.touchMoveX = e.touches[0].clientX;
+				this.coordinate.touchMoveY = e.touches[0].clientY;
+				if (this.coordinate.touchMoveX > this.coordinate.startX) {
+					this.coordinate.numberY += this.coordinate.touchMoveX - this.coordinate.startX
+				} else {
+					this.coordinate.numberY -= this.coordinate.startX - this.coordinate.touchMoveX
+				}
+				this.coordinate.startX = e.touches[0].clientX;
+				this.coordinate.startY = e.touches[0].clientY;
+			},
+			// 拖动结束事件
+			dragEnd(e) {
+				if (!this.coordinate.state) return;
+			},
+
+		
+			//创建订单
+			self_help() {
+				let data = {
+					s: 'Order.create',
+					type: this.key, //1:配送版,2:单机版,3:自助版
+					//type: 2, //1:配送版,2:单机版,3:自助版
+					//type:3, //新增字段
+					machine_id: this.machine_id, //设备
+					goods_id: this.goods_id, //产品
+					works_id: this.works_id, //作品
+					channel_no: null, //货道
+					dict_id: null, //属性字典id
+					goods_size: this.good.goods.name, //产品尺寸
+					works_num: null, //作品
+					shop_id: null, //商铺
+					sn: null, //前端查询标志
+					coupon_id: null, //优惠券id,支付多个id( 1-2-3)
+					user_address: null, //地址
+					support_pay: this.machine_item.support_pay,
+
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+					surface_color_series_id: this.$base.surfaceData.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: this.$base.surfaceData.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+					customize_size_id:  this.customize_size_id
+				}
+				if (this.coupon.ids != undefined) {
+					data.coupon_id = this.coupon.ids.join("-")
+				}
+				uni.showLoading({
+					title: '正在生成订单...',
+					mask: true
+				})
+				homeservice.WorksList(data).then(result => {
+					this.paymentself_help(result.pay, result.order_id)
+					uni.hideLoading();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+			paymentself_help(params, order_id) {
+				let seft = this
+				uni.requestPayment({
+					provider: 'wxpay',
+					timeStamp: params.timeStamp.toString(),
+					nonceStr: params.nonceStr,
+					package: params.package,
+					signType: 'MD5',
+					paySign: params.sign,
+					success: (res) => {
+						//console.log('success:' + JSON.stringify(res));
+						uni.showToast({
+							title: '支付成功',
+							duration: 3000,
+							icon: 'none'
+						});
+						setTimeout(() => {
+							uni.navigateTo({
+								url: '../mall/lineUp?machine_id=' + seft.machine_id + '&key=' +
+									seft.key
+							})
+						}, 500)
+					},
+					fail: (err = {}) => {
+						console.log('fail00:' + JSON.stringify(err || ''));
+						if (err.errMsg && err.errMsg.indexOf('cancel') === -1 || (!err.errMsg)) uni.showToast({
+							title: '网络异常,请稍后再试',
+							icon: 'none',
+							duration: 3000
+						});
+					}
+				});
+			},
+			commitOrder() {
+				console.log(this.machine_item.support_pay)
+				if (this.key == 2 && this.machine_item.support_pay == 1) {
+					this.self_help()
+				} else {
+					// if(this.teststate){
+					// 	// 滑动出去
+					// 	this.activebrushX = ((this.data.windowWidth - this.data.editorWidth)/2 + this.data.editorWidth)
+					// 	setTimeout(function(){
+					// 		uni.navigateTo({ url: './self_help_payment_details?orderId=161819487100005361&type=null&machine_id=100012' })
+					// 	}.bind(this), 3000)
+					// }
+					let _this = this
+					if ((this.orderIdone != null && this.tabletext) || (this.orderIdtwo != null && !this.tabletext)) {
+						if (this.tabletext) {
+							this.payment(this.resultpayone.pay, this.orderIdone)
+						} else {
+							this.payment(this.resultpaytwo.pay, this.orderIdtwo)
+						}
+					} else {
+						if (this.loading) return;
+						if (!this.machine_id && this.tabletext) {
+							uni.showToast({
+								title: '请选择附近色彩站!',
+								icon: 'none'
+							});
+							return false;
+						}
+						if (_this.listtmplIds.length == 0) {
+							_this.zhifu()
+						} else {
+							uni.requestSubscribeMessage({
+								tmplIds: _this.listtmplIds,
+								success(res) {
+									_this.zhifu()
+								},
+								fail(res) {
+									if (res.errCode === 20004) {
+										wx.showModal({
+											title: "温馨提示",
+											content: "您已拒绝授权,将无法在微信中收到回复通知!",
+											showCancel: false,
+											success: res => {
+												if (res.confirm) {
+													_this.zhifu()
+												}
+											}
+										});
+									}
+									_this.zhifu()
+								}
+							})
+						}
+					}
+				}
+			},
+			zhifu() {
+				let data = {
+					s: 'Order.create',
+					type: this.tabletext ? 3 : 1, //1:配送版,2:单机版,3:自助版
+					machine_id: this.machine_id, //设备
+					goods_id: this.goods_id, //产品
+					channel_no: this.tabletext ? this.channel_no : null, //货道
+					dict_id: this.tabletext ? this.dict_id : this.give_dict_id, //属性字典id
+					goods_size: this.tabletext ? this.sizetext : this.give_sizetext, //产品尺寸
+					works_id: this.works_id, //作品
+					works_num: null, //作品
+					shop_id: this.tabletext ? this.machine_item.shop_id : null, //商铺
+					sn: this.sn, //前端查询标志
+					coupon_id: null, //优惠券id,支付多个id( 1-2-3)
+					user_address: null, // 用户下单地址
+					terminal: this.$base.terminal, // 下单渠道
+					promoter_id: this.$base.promoter_id, // 推广的员的编号
+
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+					surface_color_series_id: this.$base.surfaceData.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: this.$base.surfaceData.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+					customize_size_id:  this.customize_size_id
+				}
+				if (this.coupon.ids != undefined) {
+					data.coupon_id = this.coupon.ids.join("-")
+				}
+				this.loading = true; //防止多次点击支付
+				let seft = this
+				uni.showLoading({
+					title: '正在提交中...'
+				})
+				homeservice.WorksList(data).then(result => {
+					console.log('result', result)
+					if (this.tabletext) {
+						this.resultpayone = result
+						this.orderIdone = result.order_id
+					} else {
+						this.resultpaytwo = result
+						this.orderIdtwo = result.order_id
+					}
+					this.coupon_flag_desc = result.coupon_flag_desc
+					this.payment(result.pay, result.order_id)
+					uni.hideLoading();
+				}).catch(err => {
+					seft.loading = false;
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+			payment(params, order_id) {
+				let seft = this
+				uni.requestPayment({
+					provider: 'wxpay',
+					timeStamp: params.timeStamp.toString(),
+					nonceStr: params.nonceStr,
+					package: params.package,
+					signType: 'MD5',
+					paySign: params.sign,
+					success: (res) => {
+						console.log('success:' + JSON.stringify(res));
+						// 滑动出去
+						this.activebrushX = ((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+							.editorWidth)
+						uni.showToast({
+							title: '支付成功,即将打印',
+							duration: 3000,
+							icon: 'none'
+						});
+						let type = this.tabletext ? 3 : 1 //1:配送版,2:单机版,3:自助版
+						setTimeout(() => {
+							uni.navigateTo({
+								url: './self_help_payment_details?orderId=' + order_id +
+									'&type=' + type + '&machine_id=' + seft.machine_id
+							})
+						}, 3000)
+						setTimeout(() => {
+							seft.loading = false;
+						}, 10000)
+					},
+					fail: (err = {}) => {
+						console.log('fail00:' + JSON.stringify(err || ''));
+						if (err.errMsg && err.errMsg.indexOf('cancel') === -1 || (!err.errMsg)) uni.showToast({
+							title: '网络异常,请稍后再试',
+							icon: 'none',
+							duration: 3000
+						});
+						setTimeout(() => {
+							seft.loading = false;
+						}, 2000)
+					}
+				});
+			},
+			// 获取库存与优惠券信息
+			getMachineStock() {
+				homeservice.queryList({
+					s: 'Machine.getMachineStock',
+					machine_id: this.machine_id,
+					// key: this.tabletext ? 3 : 1
+					key: this.key
+				}).then(result => {
+					this.coupon = result.coupon
+					this.stock = result.stock
+					// machine_id=100012&goods_id=33&goodid=8628&sn=1617263541425371
+					// 读出锁库存储存信息
+					this.sizetext_id = this.$base.lockInventory.id
+					this.sizetext = this.$base.lockInventory.goods_size
+					this.sizestock = this.$base.lockInventory.stock
+					this.channel_no = this.$base.lockInventory.channel_no
+					this.dict_id = this.$base.lockInventory.dict_id
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+			// 设备进来的
+			machine_pageslist(e) {
+				this.machine_pages = false
+				this.machine_item = this.machineDetail
+				this.machine_item.machine_category_text = this.machineDetail.category.title
+				this.key = this.machineDetail.category.key
+				// this.machine_item.category.forEach(item => {
+				// 	if (item.id == this.machine_item.machine_category_id) {
+				// 		this.machine_item.machine_category_text = item.title
+				// 		this.key = item.key
+				// 	}
+				// })
+				this.getMachineStock()
+				// homeservice.WorksList({
+				// 	s: 'machine.detail',
+				// 	machine_id: this.machine_id,
+				// }).then(res => {
+				// 	this.machine_item = res
+				// 	this.machine_item.category.forEach(item=>{
+				// 		if(item.id ==  this.machine_item.machine_category_id){
+				// 			this.machine_item.machine_category_text = item.title
+				// 			this.key = item.key
+				// 		}
+				// 	})
+				// 	this.getMachineStock()
+				// }).catch(err => {
+				// 	uni.showToast({title: err.msg,icon: 'none'})
+				// });
+			},
+			Worksdetail() { // 获取作品详情
+				homeservice.WorksList({
+					s: 'Works.detail',
+					id: this.works_id,
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+				}).then(result => {
+					this.good = result
+					this.data.editorWidth = result.goods.design_width * this.data.pixelRate // 设计宽度
+					this.data.editorHeight = result.goods.design_height * this.data.pixelRate // 设计高度
+					this.data.render_cove_width = result.goods.render_cove_width * (result.goods.design_width /
+						result.goods.render_width) * this.data.pixelRate + 30 // 设计高度
+					this.data.render_cove_height = result.goods.render_cove_height * (result.goods.design_height /
+						result.goods.render_height) * this.data.pixelRate + 30 // 设计高度
+					this.data.render_left = result.goods.render_left * (result.goods.design_width / result.goods
+						.render_width) * this.data.pixelRate // 设计高度
+					this.data.render_top = result.goods.render_top * (result.goods.design_height / result.goods
+						.render_height) * this.data.pixelRate // 设计高度
+					this.data.activebrushX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+						.editorWidth)
+					this.data.printingStartX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+						.editorWidth)
+					this.activebrushX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+						.editorWidth)
+					this.$base.mobilePhoneCaseSize = this.data
+					//背景图移动 1.5s
+					setTimeout(function() {
+						this.translateX = -this.data.windowWidth
+					}.bind(this), 1000)
+					// 手机壳进去页面 1.5s
+					setTimeout(function() {
+						this.activebrushX = 0
+					}.bind(this), 2500)
+					// 震动 1s
+					setTimeout(function() {
+						this.isReady = true;
+						wx.vibrateLong()
+						this.titlestate = true
+					}.bind(this), 4000)
+					// 开始自转 1s
+					setTimeout(function() {
+						this.crateactivestate = true
+					}.bind(this), 4500)
+					// 开启手动旋转 10s
+					setTimeout(function() {
+						this.coordinate.state = true
+					}.bind(this), 14500)
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+		},
+		// 下拉加载
+		onPullDownRefresh() {},
+		// 上拉加载
+		onReachBottom() {},
+		onLoad(options) {
+			var that = this;
+			//获取屏幕宽高
+			wx.getSystemInfo({
+				success: function(res) {
+					let pixelRate = res.windowWidth / 750;
+					that.data.windowWidth = res.windowWidth // 屏幕宽度
+					that.data.windowHeight = res.windowHeight // 屏幕高度
+					that.data.pixelRate = pixelRate // 屏幕宽度比率
+				}
+			})
+			//console.log(options)
+			// machine_id=100013&goods_id=37&goodid=9843
+			if (options.sn) {
+				this.sn = options.sn
+			}
+			if (options.goods_id != 'null') {
+				this.goods_id = options.goods_id
+				homeservice.queryList({
+					s: 'Product.detail',
+					id: this.goods_id
+				}).then(result => {
+					this.background_surface_image = result.surface_pic
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			}
+			if (options.machine_id != 'null') { //设备进来的
+				this.machine_id = options.machine_id
+				//this.machine_pageslist() // 默认有设备进来的
+			}
+			if (options.customize_size_id) { //设备进来的
+				this.customize_size_id = options.customize_size_id
+			}
+			
+			if (options.machineDetail != 'null') { //设备进来的
+			   this.machineDetail = JSON.parse(decodeURIComponent(options.machineDetail));
+				this.machine_pageslist() // 默认有设备进来的
+			}
+
+			if (options.goodid != 'null') {
+				this.works_id = options.goodid
+				this.Worksdetail() // 获取作品
+			}
+		},
+		onShow() {},
+		onUnload() {}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background: #131319 !important;
+	}
+
+	// 3D动画 
+	.crate-wrapper {
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		// background-color: #232323;
+	}
+
+	.crate {
+		// width: 200px;
+		// height: 370px;
+		position: relative;
+		-webkit-transform-style: preserve-3d;
+		transform-style: preserve-3d;
+		-webkit-transform: rotateX(-15deg);
+		transform: rotateX(-15deg);
+	}
+
+	.crateactive {
+		-webkit-animation: crate-spin 10s linear 1;
+		/* linear	动画从头到尾的速度是相同的。 */
+		animation: crate-spin 10s linear 1;
+		/* infinite	规定动画应该无限次播放。 */
+	}
+
+	.brush {
+		transition: all 1.5s;
+		transform: translateX(-400px);
+	}
+
+	.crate .side {
+		width: 100%;
+		height: 100%;
+		position: absolute;
+		-webkit-transform-style: preserve-3d;
+		transform-style: preserve-3d;
+		/* background-color: #d07f2c; */
+		/* outline: 1px solid #a66523; */
+	}
+
+	/* 上 */
+	.crate .side.top {
+		width: 100%;
+		height: 40px;
+		-webkit-transform: translateY(calc(-40px/2)) rotateX(90deg);
+		transform: translateY(calc(-40px/2)) rotateX(90deg);
+	}
+
+	/* 下 */
+	.crate .side.bottom {
+		width: 100%;
+		height: 40px;
+		// -webkit-transform: translateY(calc(720px/2)) rotateX(90deg);
+		// transform: translateY(calc(720px/2)) rotateX(90deg);
+	}
+
+	// 左
+	.crate .side.left {
+		width: 40px;
+		height: 100%;
+		-webkit-transform: translateX(calc(-40px/2)) rotateY(-90deg);
+		transform: translateX(calc(-40px/2)) rotateY(-90deg);
+	}
+
+	// 右
+	.crate .side.right {
+		width: 40px;
+		height: 100%;
+		// -webkit-transform: translateX(calc(100%/2)) rotateY(90deg);
+		// transform: translateX(calc(100%/2)) rotateY(90deg);
+	}
+
+	/* 前 */
+	.crate .side.front {
+		-webkit-transform: translateZ(calc(30px/2));
+		transform: translateZ(calc(30px/2));
+	}
+
+	/* 后 */
+	.crate .side.back {
+		-webkit-transform: translateZ(calc(-40px/2)) rotateY(180deg);
+		transform: translateZ(calc(-40px/2)) rotateY(180deg);
+	}
+
+	// @-webkit-keyframes crate-spin {
+	// 	from {
+	// 		-webkit-transform: rotateX(-15deg) rotateY(0deg);
+	// 		transform: rotateX(-15deg) rotateY(0deg);
+	// 	}
+
+	// 	to {
+	// 		-webkit-transform: rotateX(-15deg) rotateY(-360deg);
+	// 		transform: rotateX(-15deg) rotateY(-360deg);
+	// 	}
+	// }
+
+	@keyframes crate-spin {
+		from {
+			-webkit-transform: rotateX(-15deg) rotateY(0deg);
+			transform: rotateX(-15deg) rotateY(0deg);
+		}
+
+		to {
+			-webkit-transform: rotateX(-15deg) rotateY(-360deg);
+			transform: rotateX(-15deg) rotateY(-360deg);
+		}
+	}
+</style>
diff --git a/pages/mine/orderNew.vue b/pages/mine/orderNew.vue
new file mode 100644
index 0000000..32903c5
--- /dev/null
+++ b/pages/mine/orderNew.vue
@@ -0,0 +1,799 @@
+<template>
+	<view class="full-width full-height">
+
+		<!-- 礼花 -->
+		<firework ref="firework" v-if="isReady" style="position: fixed;z-index: 9999;"></firework>
+
+		<scroll-view scroll-y
+			style="height:100%;width: 100%; overflow: hidden; overflow-y: scroll; position: relative; ">
+			<view :style="{transform: 'translateX(' + translateX + 'px)'}"
+				style="position: absolute;transition: all 1.5s; height:100%;width: 100%;">
+				<!-- 设计区底图 -->
+				<view style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;overflow: hidden;">
+					<image src="https://img.colorpark.cn/wechat/track/shejiqu_2.png" mode="widthFix"
+						style="width: 100%;"></image>
+				</view>
+				<!-- 付款区底图 -->
+				<view style="position: absolute; top: 0; left: 100%; width: 100%; height: 100%;overflow: hidden;">
+					<image src="https://img.colorpark.cn/wechat/track/fukuanqu_2.png" mode="widthFix"
+						style="width: 100%;"></image>
+				</view>
+			</view>
+
+			<!-- 3D动画 -->
+			<view class='crate-wrapper' @touchstart.stop="dragStart" @touchmove.stop="dragMove"
+				@touchend.stop="dragEnd">
+				<view class="brush"
+					:style="{transform: 'translateX(' + activebrushX + 'px) scale(' + transformscale + ')'}">
+					<view class='crate' :class="{crateactive:crateactivestate}" :style="{width: data.editorWidth +'px',height: data.editorHeight +'px',
+					transform: 'rotateX(-15deg) rotateY(' + coordinate.numberY +'deg)'}">
+						<view class='side top'>
+							<!-- 上 -->
+							<image src="../../static/img/c.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side bottom' :style="{'-webkit-transform': 'translateY(' + (data.editorHeight - 20) + 'px) rotateX(90deg)',
+						transform: 'translateY(' + (data.editorHeight - 20) + 'px) rotateX(90deg)'}">
+							<!-- 下 -->
+							<image src="../../static/img/c.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side left'>
+							<image src="../../static/img/b.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side right' :style="{'-webkit-transform': 'translateX(' + (data.editorWidth - 20) + 'px) rotateY(90deg)',
+						transform: 'translateX(' + (data.editorWidth - 20) + 'px) rotateY(90deg)'}">
+							<image src="../../static/img/b.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side front'>
+							<!-- 前 -->
+							<image :src="background_surface_image + '?x-oss-process=image/resize,lfit,w_1500'" mode=""
+								style="position: absolute; width: 100%; height: 98%; left: 0; top: 40;"></image>
+							<image :src="( good.icon ? good.icon : good.image )" mode="aspectFit"
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+							<image :src="good.goods.front_image " mode="aspectFit"
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+						<view class='side back'>
+							<!-- 后 -->
+							<image src="../../static/img/a.png" mode=""
+								style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;"></image>
+						</view>
+					</view>
+					<view style="margin-top: 50upx; text-align: center;" :style="{opacity:titlestate ? 1:0}">
+						<view v-if="support_pay == 1" style="margin-top: 25upx;">
+							<text style="color: #F56364;">
+								¥<text style="font-size: 46upx;" v-if="good">{{add}}</text>
+							</text>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<view style="display: flex; flex-direction: row; position: absolute; top: 10upx; width: 100%;">
+				<view style=" width:150upx;height: 95upx;  background: #7948EA;
+						              margin-top: 10upx;color: #FFFFFF; border-radius: 10upx; font-size: 30upx; text-align: center;  position: absolute; right: 20upx; padding-top: 15upx;  "
+					@click="wxaddress()">
+					<view> 选择 </view>
+					<view> 地址 </view>
+				</view>
+				<view v-if="addresslist != null " @click="wxaddress()">
+					<view
+						style=" border-radius: 20upx; position: absolute; left: 40upx;  margin-right: 160upx; display: flex; align-items: center;  padding-top: 20upx; "
+						v-if="addresslist.receivor">
+						<view style="margin: 0 32upx;">
+							<view style="display: flex; align-items: center; margin-bottom: 10upx;">
+								<view style="font-size: 34upx;color: #FFFFFF;">{{addresslist.receivor || ''}}</view>
+								<view style="font-size: 34upxs;color: #FFFFFF;  margin-left: 27upx;">
+									{{addresslist.phone || ''}}
+								</view>
+							</view>
+							<view style="width: 100%;font-size: 24upx; color: #FFFFFF; margin-left: auto;">
+								{{addresslist.province || ''}}{{addresslist.city|| ''}}{{addresslist.county|| ''}}{{addresslist.detail|| ''}}
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		
+
+		<view style="background: #282932; height: 100upx; position: fixed; width: 100%; bottom: 0; z-index: 999;">
+			<view v-if="support_pay == 1" style="width: 100%; height: 100upx;
+			    background: linear-gradient(-90deg, #178CE6, #984ACE); font-size: 36upx; 
+			   font-weight: 400; text-align: center; line-height: 100upx; float: right; color: #FFFFFF;" @click="commitOrder">
+				支付领取
+			</view>
+
+			<view v-if="support_pay == 0" style="width: 100%; height: 100upx;
+			  background: linear-gradient(-90deg, #178CE6, #984ACE); font-size: 36upx; 
+			  font-weight: 400; text-align: center; line-height: 100upx; float: right; color: #FFFFFF;" @click="commitOrder">
+				免费领取
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	import addressService from '@/service//AddressService'
+	import uniPopup from '../index/common/uni-popup/uni-popup.vue'
+	import Enums from '@/util/Enums';
+	import md5 from 'js-md5';
+	import firework from '@/components/ay-firework/firework.vue'; //礼花
+
+	export default {
+		components: {
+			uniPopup,
+			firework,
+		},
+		computed: {
+			// 相加
+			add(arg1, arg2) {
+				if (this.good != null && this.coupon != null) {
+					if (this.coupon.discount_amount != undefined) {
+						return (Math.round(this.good.sales_price * 100) + Math.round(this.good.goods.sales_price * 100) -
+							Math.round(this.coupon.discount_amount * 100)) / 100;
+					} else {
+						return (Math.round(this.good.sales_price * 100) + Math.round(this.good.goods.sales_price * 100)) /
+							100;
+					}
+				} else {
+					return ''
+				}
+			},
+			// 相乘
+			multiple(arg1, arg2) {
+				return (Math.round(arg1 * 100) * Math.round(arg2 * 100)) / 10000;
+			},
+		},
+		data() {
+			return {
+				coupon_flag_desc: null,
+				type: 'bottom',
+				tabletext: true, // true设备 false快递
+				good: null, //商品数据
+				equipmentlist: [], //设备列表数据
+				machine_id: null, //设备id
+				machine_item: null, //设备信息
+				goods_id: null, //商品id
+				works_id: null, //作品id
+				sizetext_id: null,
+				sizetext: null, //选中设备的尺码
+				give_sizetext: null, //选中配送的尺码
+				give_dict_id: null, //属性字典id
+				sizestock: null, //尺码库存
+				channel_no: null, //货道
+				dict_id: null, //属性字典id
+				coupon: null, //优惠劵
+				stock: null, //尺码
+				machine_pages: true, //设备进来的状态
+				myadress: {},
+				loading: false,
+
+				orderIdone: null, //订单号
+				orderIdtwo: null, //订单号
+				resultpayone: null,
+				resultpaytwo: null,
+				listtmplIds: [],
+				sn: null, //前端查询标志
+				activebrushX: -400, //动画进来出去
+				crateactivestate: false, //开始自转
+				titlestate: false,
+				isReady: false, //礼花
+
+				data: {
+					windowWidth: 0, // 屏幕宽度
+					windowHeight: 0, // 屏幕高度
+					pixelRate: 0, // 屏幕宽度比率
+					editorWidth: 0, // 设计宽度
+					editorHeight: 0, // 设计高度
+					render_cove_width: null,
+					render_cove_height: null,
+					render_left: null,
+					render_top: null,
+				},
+				teststate: false, //开启测试模式 false  true
+				translateX: 0,
+				coordinate: {
+					startX: 0,
+					startY: 0,
+					touchMoveX: 0,
+					touchMoveY: 0,
+					numberY: 0,
+					state: false,
+				},
+				transformscale: 0.8, //整体缩小
+				key: null,
+				background_surface_image: null, //定制壳手机壳底色
+				addresslist: null, //地址
+				support_pay: 1 ,//0 不支付 1 支付
+				machineDetail:null,//设备详情
+				customize_size_id: "",  //自定以产品Id
+
+			};
+		},
+		methods: {
+			dragStart(e) {
+				if (!this.coordinate.state) return; // 记录点击时的坐标值
+				this.coordinate.startX = e.touches[0].clientX;
+				this.coordinate.startY = e.touches[0].clientY;
+			},
+			dragMove(e) {
+				if (!this.coordinate.state) return;
+				this.coordinate.touchMoveX = e.touches[0].clientX;
+				this.coordinate.touchMoveY = e.touches[0].clientY;
+				if (this.coordinate.touchMoveX > this.coordinate.startX) {
+					this.coordinate.numberY += this.coordinate.touchMoveX - this.coordinate.startX
+				} else {
+					this.coordinate.numberY -= this.coordinate.startX - this.coordinate.touchMoveX
+				}
+				this.coordinate.startX = e.touches[0].clientX;
+				this.coordinate.startY = e.touches[0].clientY;
+			},
+			// 拖动结束事件
+			dragEnd(e) {
+				if (!this.coordinate.state) return;
+			},
+
+			//创建订单
+			self_help() {
+				let data = {
+					s: 'Order.create',
+					type: 1,
+					/* this.key, */ //1:配送版,2:单机版,3:自助版
+					//type: 2, //1:配送版,2:单机版,3:自助版
+					//type:3, //新增字段
+					machine_id: this.machine_id, //设备
+					goods_id: this.goods_id, //产品
+					works_id: this.works_id, //作品
+					channel_no: null, //货道
+					dict_id: 0, //属性字典id
+					goods_size: this.good.goods.name, //产品尺寸
+					works_num: null, //作品
+					shop_id: null, //商铺
+					sn: null, //前端查询标志
+					coupon_id: null, //优惠券id,支付多个id( 1-2-3)
+					user_address: null, //地址
+					support_pay: this.machine_item.support_pay,
+					delivery: 1, //新增配送字段
+
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+					surface_color_series_id: this.$base.surfaceData.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: this.$base.surfaceData.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+					customize_size_id:  this.customize_size_id
+				}
+				if (this.coupon.ids != undefined) {
+					data.coupon_id = this.coupon.ids.join("-")
+				}
+
+				if (this.addresslist) {
+					data.user_address = {
+						receivor: this.addresslist.receivor,
+						phone: this.addresslist.phone,
+						address: this.addresslist.province + this.addresslist.city + this.addresslist.county + this
+							.addresslist.detail
+					}
+				}
+				uni.showLoading({
+					title: '正在生成订单...',
+					mask: true
+				})
+				homeservice.WorksList(data).then(result => {
+					this.paymentself_help(result.pay, result.order_id)
+					uni.hideLoading();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+			paymentself_help(params, order_id) {
+				let seft = this
+				uni.requestPayment({
+					provider: 'wxpay',
+					timeStamp: params.timeStamp.toString(),
+					nonceStr: params.nonceStr,
+					package: params.package,
+					signType: 'MD5',
+					paySign: params.sign,
+					success: (res) => {
+						//console.log('success:' + JSON.stringify(res));
+						uni.showToast({
+							title: '支付成功',
+							duration: 3000,
+							icon: 'none'
+						});
+						setTimeout(() => {
+							uni.navigateTo({
+								url: '../mall/lineUp?machine_id=' + seft.machine_id + '&key=' +
+									seft.key
+							})
+						}, 500)
+					},
+					fail: (err = {}) => {
+						console.log('fail00:' + JSON.stringify(err || ''));
+						if (err.errMsg && err.errMsg.indexOf('cancel') === -1 || (!err.errMsg)) uni.showToast({
+							title: '网络异常,请稍后再试',
+							icon: 'none',
+							duration: 3000
+						});
+					}
+				});
+			},
+			commitOrder() {
+				if (!this.addresslist) {
+					uni.showToast({
+						title: '请选择地址!',
+						icon: 'none'
+					});
+					return false;
+				}
+				//console.log(this.machine_item.support_pay)
+				if (this.key == 2 && this.machine_item.support_pay == 1) {
+					this.self_help()
+				} else {
+					//if(this.teststate){
+					// 	// 滑动出去
+					// 	this.activebrushX = ((this.data.windowWidth - this.data.editorWidth)/2 + this.data.editorWidth)
+					// 	setTimeout(function(){
+					// 		uni.navigateTo({ url: './self_help_payment_details?orderId=161819487100005361&type=null&machine_id=100012' })
+					// 	}.bind(this), 3000)
+					// }
+					let _this = this
+					if ((this.orderIdone != null && this.tabletext) || (this.orderIdtwo != null && !this.tabletext)) {
+						if (this.tabletext) {
+							this.payment(this.resultpayone.pay, this.orderIdone)
+						} else {
+							this.payment(this.resultpaytwo.pay, this.orderIdtwo)
+						}
+					} else {
+						if (this.loading) return;
+						if (!this.machine_id && this.tabletext) {
+							uni.showToast({
+								title: '请选择附近色彩站!',
+								icon: 'none'
+							});
+							return false;
+						}
+						if (_this.listtmplIds.length == 0) {
+							_this.zhifu()
+						} else {
+							uni.requestSubscribeMessage({
+								tmplIds: _this.listtmplIds,
+								success(res) {
+									_this.zhifu()
+								},
+								fail(res) {
+									if (res.errCode === 20004) {
+										wx.showModal({
+											title: "温馨提示",
+											content: "您已拒绝授权,将无法在微信中收到回复通知!",
+											showCancel: false,
+											success: res => {
+												if (res.confirm) {
+													_this.zhifu()
+												}
+											}
+										});
+									}
+									_this.zhifu()
+								}
+							})
+						}
+					}
+				}
+			},
+			zhifu() {
+				let data = {
+					s: 'Order.create',
+					type: this.key, //1:配送版,2:单机版,3:自助版
+					machine_id: this.machine_id, //设备
+					goods_id: this.goods_id, //产品
+					channel_no: this.tabletext ? this.channel_no : null, //货道
+					dict_id: this.tabletext ? this.dict_id : this.give_dict_id, //属性字典id
+					goods_size: this.tabletext ? this.sizetext : this.give_sizetext, //产品尺寸
+					works_id: this.works_id, //作品
+					works_num: null, //作品
+					delivery: 1, //新增配送字段
+					shop_id: this.tabletext ? this.machine_item.shop_id : null, //商铺
+					sn: this.sn, //前端查询标志
+					coupon_id: null, //优惠券id,支付多个id( 1-2-3)
+					user_address: null, // 用户下单地址
+					terminal: this.$base.terminal, // 下单渠道
+					promoter_id: this.$base.promoter_id, // 推广的员的编号
+
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+					surface_color_series_id: this.$base.surfaceData.surface_color_series_id, //选择的色系编号,没有的话就不传或者为0
+					surface_color_id: this.$base.surfaceData.surface_color_id, //选择的颜色编号,没有的话就不传或者为0
+					customize_size_id:  this.customize_size_id
+				}
+				if (this.coupon.ids != undefined) {
+					data.coupon_id = this.coupon.ids.join("-")
+				}
+
+				if (this.addresslist) {
+					data.user_address = {
+						receivor: this.addresslist.receivor,
+						phone: this.addresslist.phone,
+						address: this.addresslist.province + this.addresslist.city + this.addresslist.county + this.addresslist.detail
+					}
+				}
+				this.loading = true; //防止多次点击支付
+				let seft = this
+				uni.showLoading({
+					title: '正在提交中...'
+				})
+				homeservice.WorksList(data).then(result => {					
+					uni.navigateTo({
+						url: '../mall/lineUp?machine_id=' + this.machine_id + '&key=' + this.key
+					})					
+					uni.hideLoading();
+				}).catch(err => {
+					seft.loading = false;
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+			payment(params, order_id) {
+				let seft = this
+				uni.requestPayment({
+					provider: 'wxpay',
+					timeStamp: params.timeStamp.toString(),
+					nonceStr: params.nonceStr,
+					package: params.package,
+					signType: 'MD5',
+					paySign: params.sign,
+					success: (res) => {
+						//滑动出去
+						this.activebrushX = ((this.data.windowWidth - this.data.editorWidth) / 2 + this.data.editorWidth)
+						uni.showToast({
+							title: '支付成功,即将打印',
+							duration: 3000,
+							icon: 'none'
+						});
+						let type = this.tabletext ? 3 : 1 //1:配送版,2:单机版,3:自助版
+						setTimeout(() => {
+							uni.navigateTo({
+								url: './self_help_payment_details?orderId=' + order_id +
+									'&type=' + type + '&machine_id=' + seft.machine_id
+							})
+						}, 3000)
+						setTimeout(() => {
+							seft.loading = false;
+						}, 10000)
+					},
+					fail: (err = {}) => {
+						if (err.errMsg && err.errMsg.indexOf('cancel') === -1 || (!err.errMsg)) uni.showToast({
+							title: '网络异常,请稍后再试',
+							icon: 'none',
+							duration: 3000
+						});
+						setTimeout(() => {
+							seft.loading = false;
+						}, 2000)
+					}
+				});
+			},
+			// 获取库存与优惠券信息
+			getMachineStock() {
+				homeservice.queryList({
+					s: 'Machine.getMachineStock',
+					machine_id: this.machine_id,
+					key: this.key
+				}).then(result => {
+					this.coupon = result.coupon
+					this.stock = result.stock
+					//读出锁库存储存信息
+					this.sizetext_id = this.$base.lockInventory.id
+					this.sizetext = this.$base.lockInventory.goods_size
+					this.sizestock = this.$base.lockInventory.stock
+					this.channel_no = this.$base.lockInventory.channel_no
+					this.dict_id = this.$base.lockInventory.dict_id
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			},
+			// 设备进来的
+			machine_pageslist(e) {
+				this.machine_pages = false
+				this.machine_item = this.machineDetail
+				this.machine_item.machine_category_text = this.machineDetail.category.title
+				this.key = this.machineDetail.category.key
+				this.getMachineStock()
+			},
+			Worksdetail() { // 获取作品详情
+				homeservice.WorksList({
+					s: 'Works.detail',
+					id: this.works_id,
+					surface_type: this.$base.surfaceData.surface_type, //材质类型 0:默认 1:自带壳 2:定制壳
+					surface_id: this.$base.surfaceData.surface_id, //材质对应的编号,没有的话就为0或者不传
+				}).then(result => {
+					this.good = result
+
+					this.data.editorWidth = result.goods.design_width * this.data.pixelRate // 设计宽度
+					this.data.editorHeight = result.goods.design_height * this.data.pixelRate // 设计高度
+					this.data.render_cove_width = result.goods.render_cove_width * (result.goods.design_width /
+                        result.goods.render_width) * this.data.pixelRate + 30 // 设计高度
+					this.data.render_cove_height = result.goods.render_cove_height * (result.goods.design_height /
+						result.goods.render_height) * this.data.pixelRate + 30 // 设计高度
+					this.data.render_left = result.goods.render_left * (result.goods.design_width / result.goods
+						.render_width) * this.data.pixelRate // 设计高度
+					this.data.render_top = result.goods.render_top * (result.goods.design_height / result.goods
+						.render_height) * this.data.pixelRate // 设计高度
+					this.data.activebrushX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+						.editorWidth)
+					this.data.printingStartX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+						.editorWidth)
+					this.activebrushX = -((this.data.windowWidth - this.data.editorWidth) / 2 + this.data
+						.editorWidth)
+					this.$base.mobilePhoneCaseSize = this.data
+					//背景图移动 1.5s
+					setTimeout(function() {
+						this.translateX = -this.data.windowWidth
+					}.bind(this), 1000)
+					// 手机壳进去页面 1.5s
+					setTimeout(function() {
+						this.activebrushX = 0
+					}.bind(this), 2500)
+					// 震动 1s
+					setTimeout(function() {
+						this.isReady = true;
+						wx.vibrateLong()
+						this.titlestate = true
+					}.bind(this), 4000)
+					// 开始自转 1s
+					setTimeout(function() {
+						this.crateactivestate = true
+					}.bind(this), 4500)
+					// 开启手动旋转 10s
+					setTimeout(function() {
+						this.coordinate.state = true
+					}.bind(this), 14500)
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			},
+
+			//读取地址
+			addressUserres() {
+				addressService.queryAddressList().then(result => {
+					if (result.length > 0) {
+						for (var i = 0; i < result.length; i++) {
+							if (result[i].is_default.value == 1) {
+								this.$base.address = result[i]
+								this.addresslist = result[i]
+								break // 跳出循环
+							}
+						}
+					}
+				}).catch(err => {})
+			},
+
+			//获取微信地址 
+			wxaddress() {
+				var that = this;
+				wx.chooseAddress({
+					success: function(res) {
+						var address = {
+							"receivor": res.userName,
+							"phone": res.telNumber,
+							"province": res.provinceName,
+							"city": res.cityName,
+							"county": res.countyName,
+							"detail": res.detailInfo,
+						};
+						that.addresslist = address;
+					},
+					fail: () => {
+						//this.openConfirm() // 如果获取地址权限失败,弹出确认弹窗,让用户选择是否要打开设置,手动去开权限
+					}
+				})
+				//console.log("areaList=" + that.areaList)
+			},
+
+		},
+		// 下拉加载
+		onPullDownRefresh() {},
+		// 上拉加载
+		onReachBottom() {},
+		onLoad(options) {
+			var that = this;
+			//获取屏幕宽高
+			wx.getSystemInfo({
+				success: function(res) {
+					let pixelRate = res.windowWidth / 750;
+					that.data.windowWidth = res.windowWidth // 屏幕宽度
+					that.data.windowHeight = res.windowHeight // 屏幕高度
+					that.data.pixelRate = pixelRate // 屏幕宽度比率
+				}
+			})
+
+			if (options.sn) {
+				this.sn = options.sn
+			}
+			if (options.goods_id != 'null') {
+				this.goods_id = options.goods_id
+				homeservice.queryList({
+					s: 'Product.detail',
+					id: this.goods_id
+				}).then(result => {
+					this.background_surface_image = result.surface_pic
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg,
+						icon: 'none'
+					});
+				});
+			}
+
+			if (options.machine_id != 'null') { //设备进来的
+				this.machine_id = options.machine_id
+			}
+			
+			if (options.machineDetail != 'null') { //设备进来的
+				 this.machineDetail = JSON.parse(decodeURIComponent(options.machineDetail));
+				this.machine_pageslist() // 默认有设备进来的
+			}
+
+			if (options.goodid != 'null') {
+				this.works_id = options.goodid
+				this.Worksdetail() // 获取作品
+			}
+
+			if (options.support_pay != 'null') {
+				this.support_pay = options.support_pay
+				//this.works_id = options.goodid
+				//this.Worksdetail() // 获取作品
+			}
+			
+			if (options.customize_size_id) { //设备进来的
+				this.customize_size_id = options.customize_size_id
+			}
+			
+			
+			if(options.titleName){
+				wx.setNavigationBarTitle({
+					title: options.titleName
+				})
+			}
+	
+		},
+
+		onShow() {},
+		onUnload() {}
+	};
+</script>
+
+<style lang="scss">
+	
+	page {
+		background: #131319 !important;
+	}
+
+	//3D动画 
+	.crate-wrapper {
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		// background-color: #232323;
+	}
+
+	.crate {
+		// width: 200px;
+		// height: 370px;
+		position: relative;
+		-webkit-transform-style: preserve-3d;
+		transform-style: preserve-3d;
+		-webkit-transform: rotateX(-15deg);
+		transform: rotateX(-15deg);
+	}
+
+	.crateactive {
+		-webkit-animation: crate-spin 10s linear 1;
+		/* linear	动画从头到尾的速度是相同的。 */
+		animation: crate-spin 10s linear 1;
+		/* infinite	规定动画应该无限次播放。 */
+	}
+
+	.brush {
+		transition: all 1.5s;
+		transform: translateX(-400px);
+	}
+
+	.crate .side {
+		width: 100%;
+		height: 100%;
+		position: absolute;
+		-webkit-transform-style: preserve-3d;
+		transform-style: preserve-3d;
+		/* background-color: #d07f2c; */
+		/* outline: 1px solid #a66523; */
+	}
+
+	/* 上 */
+	.crate .side.top {
+		width: 100%;
+		height: 40px;
+		-webkit-transform: translateY(calc(-40px/2)) rotateX(90deg);
+		transform: translateY(calc(-40px/2)) rotateX(90deg);
+	}
+
+	/* 下 */
+	.crate .side.bottom {
+		width: 100%;
+		height: 40px;
+		// -webkit-transform: translateY(calc(720px/2)) rotateX(90deg);
+		// transform: translateY(calc(720px/2)) rotateX(90deg);
+	}
+
+	// 左
+	.crate .side.left {
+		width: 40px;
+		height: 100%;
+		-webkit-transform: translateX(calc(-40px/2)) rotateY(-90deg);
+		transform: translateX(calc(-40px/2)) rotateY(-90deg);
+	}
+
+	// 右
+	.crate .side.right {
+		width: 40px;
+		height: 100%;
+		// -webkit-transform: translateX(calc(100%/2)) rotateY(90deg);
+		// transform: translateX(calc(100%/2)) rotateY(90deg);
+	}
+
+	/* 前 */
+	.crate .side.front {
+		-webkit-transform: translateZ(calc(30px/2));
+		transform: translateZ(calc(30px/2));
+	}
+
+	/* 后 */
+	.crate .side.back {
+		-webkit-transform: translateZ(calc(-40px/2)) rotateY(180deg);
+		transform: translateZ(calc(-40px/2)) rotateY(180deg);
+	}
+
+	// @-webkit-keyframes crate-spin {
+	// 	from {
+	// 		-webkit-transform: rotateX(-15deg) rotateY(0deg);
+	// 		transform: rotateX(-15deg) rotateY(0deg);
+	// 	}
+
+	// 	to {
+	// 		-webkit-transform: rotateX(-15deg) rotateY(-360deg);
+	// 		transform: rotateX(-15deg) rotateY(-360deg);
+	// 	}
+	// }
+
+	@keyframes crate-spin {
+		from {
+			-webkit-transform: rotateX(-15deg) rotateY(0deg);
+			transform: rotateX(-15deg) rotateY(0deg);
+		}
+
+		to {
+			-webkit-transform: rotateX(-15deg) rotateY(-360deg);
+			transform: rotateX(-15deg) rotateY(-360deg);
+		}
+	}
+</style>
diff --git a/pages/mine/ordersize.vue b/pages/mine/ordersize.vue
new file mode 100644
index 0000000..3c2eb01
--- /dev/null
+++ b/pages/mine/ordersize.vue
@@ -0,0 +1,71 @@
+<template>
+	<view class="full-width">
+		<view style="width: 484upx; height: 577upx;position: relative; margin:40upx auto 40upx;">
+			<image :src="goods.goods.front_image" 
+			style="width: 484upx; height: 577upx; margin:auto; display: block; position: relative;z-index: 9;"
+			mode="aspectFit"></image>
+			<image style="width: 484upx; height: 577upx; position: absolute;top: 0; left: 0; right: 0;" 
+			:src="( goods.icon ? goods.icon:goods.image ) + '?x-oss-process=image/resize,lfit,w_484'"
+			 mode="aspectFit" class="full-width full-height"></image>
+		</view>
+		<uParse :content="goods.goods.detail" v-if="goods.goods.detail" />
+	</view>
+</template>
+
+<script>
+	import uParse from '@/components/uParse/src/wxParse.vue'
+	import homeservice from '@/service/homeservice.js'
+	export default {
+		components: {
+			uParse
+		},
+		computed: {
+
+		},
+		data() {
+			return {
+				goods: {},
+				queryPage:{
+					s: 'Works.detail',
+					id:null
+				}
+			};
+		},
+		methods: {
+			loadData() {
+				uni.showLoading({title: '正在加载中...'}) 
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.goods = result
+					this.goods.category.forEach( item=>{
+						if(item.id ==  this.goods.works_category_id){
+							this.goods.works_category_text = item.title
+						}
+					})
+					wx.setNavigationBarTitle({title: this.goods.name })
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({ title: err.msg || err.data, icon: 'none' });
+				});
+			}
+		},
+		onPullDownRefresh() {
+			this.loadData();
+		},
+		onLoad(options) {
+			this.queryPage.id = options.id
+			this.loadData();
+		},
+		onShow() {
+
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background: #131319 !important;
+		color: #fff;
+	}
+</style>
diff --git a/pages/mine/self_help_payment_details.vue b/pages/mine/self_help_payment_details.vue
new file mode 100644
index 0000000..d1009f3
--- /dev/null
+++ b/pages/mine/self_help_payment_details.vue
@@ -0,0 +1,1297 @@
+<template>
+	<view class="full-width full-height" :style="{overflow: isReady ? 'hidden' : 'scroll' }">
+		<!-- 音乐 -->
+		<!-- https://img.colorpark.cn/wechat/stitch.m4a -->
+		<!-- https://img.colorpark.cn/wechat/ring.m4a -->
+		<!-- https://img.colorpark.cn/wechat/ring2.m4a -->
+		<audio src="https://img.colorpark.cn/wechat/stitch.m4a"
+		:action="stitchaction" controls loop style="opacity: 0; position: absolute;"></audio>
+		<audio src="https://img.colorpark.cn/wechat/ring2.m4a" 
+		:action="ringaction" controls loop style="opacity: 0; position: absolute;"></audio>
+		<!-- 礼花 -->
+		<firework ref="firework" v-if="isReady" style="position: fixed;z-index: 9999;"></firework>
+		<!-- 继续定制 -->
+		<view @click="tomall" style="position: fixed; right: 0; bottom: 100upx; display: flex;align-items: center;justify-content: center; width: 100upx; height: 88upx; background: linear-gradient(92deg, #178CE6, #984ACE); border-radius: 44upx 0px 0px 44upx; z-index: 999;">
+			<view style="font-size: 24upx; font-weight: 800; color: #FFFFFF;">
+				<view>继续</view><view>定制</view>
+			</view>
+		</view>
+		<view style="height:100%;width: 100%; overflow: hidden;">
+			<!-- goods.status.value 订单状态(0:等待生产,1:生产中,2: 生产完成,3:取消生产,4:出料中(弃用),5: 等待取料(弃用), 6:待入货(弃用),7:取货完成,8:已发货,9:订单完成)  "-->
+				<view :animation="BoxTwoAnimation" 
+				style="width: 100%; height: 100%;" 
+				v-if="(orderOrderStatusData.status == 0 || orderOrderStatusData.status == 1 || orderOrderStatusData.status == 10 || orderOrderStatusData.status == 2) < 2 && type != 1 && LoadState">
+					<!-- 排队中-付款区底图 -->
+				    <view v-if="orderOrderStatusData.status == 0" style="position: absolute; top: 0; right: 200%; width: 100%; height: 100%;overflow: hidden;">
+				    	<image src="https://img.colorpark.cn/wechat/track/fukuanqu_2.png" mode="widthFix" style="width: 100%;"></image>
+				    </view>
+					<!-- 排队中 -->
+					<view v-if="orderOrderStatusData.status == 0" style="position: absolute; width: 100%; height: 100%; overflow: hidden; right: 100%;">
+						<view style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;overflow: hidden;">
+							<image src="https://img.colorpark.cn/wechat/track/paiduiqu_2.png" mode="widthFix" style="width: 100%;"></image>
+						</view>
+						<view style="position: relative; width: 100%; height: 100%;overflow: hidden;">
+							<view class='crate-wrapper'>
+								<view style="display: flex;position: relative;">
+									<view style="position: relative;transition: all 3s; z-index: 2;"
+									:style="{width: data.editorWidth +'px',height: data.editorHeight +'px',
+									transform: 'translateX(' + data.activebrushX + 'px)'}">
+										<image :src="goods.goods.surface_pic + '?x-oss-process=image/resize,lfit,w_1000'" mode=""
+										style="position: absolute; width: 98%; height: 98%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; z-index: 1;"></image>
+										<!-- <view style="position: absolute; width: 98%; height: 98%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; background: #fff; z-index: 1;"></view> -->
+										<image :src="goods.works_image" mode=""
+										style="position: absolute; width: 100%; height: 100%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; z-index: 2;"></image>
+										<image :src="goods.goods.front_image" mode=""
+											style="position: absolute; width: 100%; height: 100%; left: 0; top: 0; right: 0; margin: auto;z-index: 3; overflow: hidden;"></image>
+									</view>
+									<image v-for="(item,index) in rankinglist" :key="index" v-if="index < 3"
+									style="transition: all 1s;"
+									:style="{height: data.editorHeight +'px',width:item.w +'px',
+									transform: 'translateX(' +  item.x + 'px)'}"
+									src="../../static/img/d.png" mode=""></image>
+									<!-- 刷子 -->
+									<!-- <view :style="{width: data.render_cove_width +'px',height: data.render_cove_height +'px'}"
+									 style="position: absolute; left: 0; top: 0; right: 0; margin: auto; bottom: 0;z-index: 3;">
+										<view :style="{width: leftx +'px',height: data.render_cove_height +'px'}"
+										style="position: absolute; left: 0; top: 0;background: #fff;">
+										</view>
+									</view> -->
+								</view>
+							</view>
+						</view>
+					</view>
+					<!-- 打印中-付款区底图 -->
+					<view v-if="orderOrderStatusData.status == 1" style="position: absolute; top: 0; right: 100%; width: 100%; height: 100%;overflow: hidden;">
+						<image src="https://img.colorpark.cn/wechat/track/fukuanqu_2.png" mode="widthFix" style="width: 100%;"></image>
+					</view>
+					<!-- 生产中打印 1-->
+					<view style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; overflow: hidden;">
+						<!-- 背景图 -->
+						<view style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;overflow: hidden;">
+							<view style="position: relative; width: 100%;">
+								<image src="https://img.colorpark.cn/wechat/track/dayinqu_2.png" mode="widthFix" style="width: 100%;"></image>
+							</view>
+							<view style="position: relative; width: 100%; margin-top: -13px;">
+								<image src="https://img.colorpark.cn/wechat/track/shuxiang_2.png" mode="widthFix" style="width: 100%;"></image>
+							</view>
+						</view>
+						<view style="position: relative;width: 100%; height: 100%;overflow: hidden;" :animation="printingEnd">
+							<view class='crate-wrapper'>
+								<view class="brush" 
+								:style="{width: data.editorWidth +'px',height: data.editorHeight +'px',
+									transform: 'translateX(' + data.printingStartX + 'px)'}">
+									<view :style="{width: data.editorWidth +'px',height: data.editorHeight +'px'}" 
+									style="position: relative;overflow: hidden;">
+										<!-- 底图 -->
+										<!-- <view style="position: absolute; width: 98%; height: 98%; left: 0; top: 0; right: 0; 
+										margin: auto; bottom: 0; background: #fff; z-index: 1;"></view> -->
+										<image :src="goods.goods.surface_pic + '?x-oss-process=image/resize,lfit,w_1000'" mode=""
+										style="position: absolute; width: 98%; height: 98%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; z-index: 1;"></image>
+										<!-- 作品图 -->
+										<image v-if="initstate" :src="goods.works_image" mode="" 
+										:style="{'z-index': data.render_cove_width ? 2:0}"
+										style="position: absolute; width: 100%; height: 100%; left: 0; top: 0; right: 0; margin: auto; bottom: 0;"></image>
+										<!-- 刷子 -->
+										<view :style="{width: data.render_cove_width +'px',height: data.render_cove_height +'px'}"
+										 style="position: absolute; left: 0; top: 0; right: 0; margin: auto; bottom: 0;z-index: 3;">
+											<view :style="{width: leftx +'px',height: data.render_cove_height +'px',background: goods.goods.design_color}"
+											style="position: absolute; left: 0; top: 0;">
+											</view>
+										</view>
+										<!-- 手机壳 -->
+										<image :src="goods.goods.front_image" mode=""
+											style="position: absolute; width: 100%; height: 100%; left: 0; top: 0; 
+											right: 0; margin: auto;z-index: 4; overflow: hidden;"></image>
+									</view>
+									<!-- 刷子范围 -->
+									<view :style="{width: data.render_cove_width +'px',height: data.render_cove_height +'px'}"
+									 style="position: absolute; left: 0; top: 0; right: 0; margin: auto; bottom: 0;z-index: 5;">
+										<view class="item-text" :animation="animMaind" :class="{printer:printer}"
+										:style="{left: leftx +'px',opacity: printer ? 1 : 0}" 
+										style="width:40px; height:100px; position:absolute; top: -50px;">
+											<image src="../../static/img/shua.png" mode="" style="width:40px; height:100px;"></image>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					<!-- 取货状态 10,2-->
+					<view style="position: relative; width: 100%; height: 100%; overflow: hidden;">
+						<!-- 底图 -->
+						<view style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;overflow: hidden;">
+							<view style="position: relative; width: 100%;">
+								<image src="https://img.colorpark.cn/wechat/track/shuxiang_2.png" mode="widthFix" style="width: 100%;"></image>
+							</view>
+							<view style="position: relative; width: 100%; margin-top: -13px;">
+								<image src="https://img.colorpark.cn/wechat/track/shuxiang_2.png" mode="widthFix" style="width: 100%;"></image>
+							</view>
+						</view>
+						<view class='crate-wrapper'>
+							<view class="twobrush" :animation="PickUpStart"
+							:style="{width: data.editorWidth +'px',height: data.editorHeight +'px',
+							transform: 'translateY(' + -(data.editorHeight + (data.windowHeight - data.editorHeight)/2) + 'px)'}">
+								<!-- 底图 -->
+								<image :src="goods.goods.surface_pic + '?x-oss-process=image/resize,lfit,w_1000'" mode=""
+								style="position: absolute; width: 98%; height: 98%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; z-index: 1;"></image>
+								<!-- <view style="position: absolute; width: 98%; height: 98%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; background: #fff; z-index: 1;"></view> -->
+								<image :src="goods.works_image" mode="" 
+								style="position: absolute; width: 100%; 
+								height: 100%; left: 0; top: 0; right: 0; margin: auto; bottom: 0; z-index: 2;"></image>
+								<image :src="goods.goods.front_image" mode=""
+									style="position: absolute; width: 100%; height: 100%; left: 0; top: 0; 
+									right: 0; margin: auto;z-index: 4; overflow: hidden;"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+			    <!-- 暂时缺货、订单已取消 -->
+				<view style="width: 100%; height: 100%; position: absolute; top: 0; z-index: 2;background: #131319 !important;" 
+				v-if="(orderOrderStatusData.status == 3 || orderOrderStatusData.status == -3) && type != 1">
+					<view style="padding-bottom: 32px">
+						<view style="width: 220upx; margin:90upx auto 40upx;">
+							 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/icon_close.png" mode="aspectFill"></image>
+						</view>
+						<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+							暂时缺货、订单已取消
+						</view>
+						<view style="margin-top: 378upx; display: flex;align-items: center; justify-content: center;">
+							<view style="width: 187upx; position: relative; border-radius: 10upx;" @click="previewImg(goods,0)">
+								<view style="width: 128upx; height: 236upx;margin:auto; display: block; position: relative; overflow: hidden;">
+									<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+									<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+									:src="goods.goods.front_image" mode="aspectFit"></image>
+									 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+									 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+								</view>
+							</view>
+							<view style="margin-left: 19upx; margin-top: 5upx; ">
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+									<text> 订单编号: </text>
+									<text style="color: #888888;"> {{goods.id}} </text>
+									<text @click="tosetClipboardData(goods.id)" style="margin-left: 5upx;font-size: 22upx;">复制</text>
+								</view>
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+									<text> 产品尺寸: </text>
+									<text style="color: #888888;" v-if="type == 2"> {{goods.goods.name || ''}} </text>
+									<text style="color: #888888;" v-if="type != 2"> 
+										{{goods.order_goods.goods_name || ''}}
+										<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+									</text>
+								</view>
+								<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 支付金额: </text>
+									<text style="color: #888888;"> ¥{{goods.real_amount}} </text>
+								</view>
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 下单时间: </text>
+									<text style="color: #888888;"> {{goods.create_time}} </text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+		       <!-- 设备故障状态 -->
+				<view style="width: 100%; height: 100%; position: absolute; top: 0; z-index: 2;background: #131319 !important;"
+				v-if="orderOrderStatusData.status == -2 && type != 1">
+					<view class="start" style="padding-bottom: 100upx; padding-top: 200upx;">
+						<image src="../../static/icon_guaqi.png" mode="aspectFill" class="start_img"></image>
+						<view class="start_text">{{msg || ''}}</view>
+						<view>
+							<view class="start_text">联系客服</view>
+							<view class="start_text" style="display: flex; justify-content: center; align-items: center;">
+								<image src="../../static/phone.png" mode="" style="width: 32upx; height: 32upx; margin-right: 5upx;"></image>
+								{{phone || '18938664545'}}
+							</view>
+						</view>
+					</view>
+					<image src="../../static/logo.jpg" mode="aspectFill" style="width: 664upx; height: 757upx; opacity: 0.03; position: absolute; left: 0; bottom: 0; z-index: -1;"></image>
+				</view>
+	           <!-- 取货完成状态 -->
+				<view v-if="orderOrderStatusData.status == 7 && type != 1">
+					<view style="padding-bottom: 32px">
+						<view style="width: 220upx; margin:90upx auto 40upx;">
+							 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/mine/Pick-up.png" mode="aspectFill"></image>
+						</view>
+						<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+							打印完成
+						</view>
+						<view style="height: 378upx; text-align: center;">
+							<text v-if="type == 2" style="font-size: 36upx; line-height: 378upx;font-weight: bold;">
+								{{goods.order_queue.id || ''}}
+							</text>
+						</view>
+						<view style="display: flex;align-items: center; justify-content: center;">
+							<view style="width: 187upx; position: relative; border-radius: 10upx;"  @click="previewImg(goods,0)">
+								<view style="width: 128upx; height: 236upx;margin:auto; display: block; position: relative; overflow: hidden;">
+									<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+									<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+									:src="goods.goods.front_image" mode="aspectFit"></image>
+									 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+									 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+								</view>
+							</view>
+							<view style="margin-left: 19upx; margin-top: 5upx; ">
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+									<text> 订单编号: </text>
+									<text style="color: #888888;"> {{goods.id}} </text>
+									<text @click="tosetClipboardData(goods.id)" style="margin-left: 5upx;font-size: 22upx;">复制</text>
+								</view>
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+									<text> 产品尺寸: </text>
+									<text style="color: #888888;" v-if="type == 2"> {{goods.goods.name || ''}} </text>
+									<text style="color: #888888;"v-if="type != 2"> 
+										{{goods.order_goods.goods_name || ''}}
+										<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+									</text>
+								</view>
+								<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 支付金额: </text>
+									<text style="color: #888888;"> ¥{{goods.real_amount}} </text>
+								</view>
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 下单时间: </text>
+									<text style="color: #888888;"> {{goods.create_time}} </text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+<!-- -----------快递发货----------- -->
+		<!-- 生产中 -->
+				<view style="position: relative;" v-if="goods.status.value <= 8 && type == 1">
+					<view style="width: 300upx; min-height: 300upx; margin:90upx auto 66upx; position: relative;
+					border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+						<!-- 手机壳 -->
+						<view style="width: 206upx; height: 224upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+							<image style="width: 206upx; height: 224upx; margin:auto; display: block;position: relative; z-index: 10;"
+							:src="goods.goods.front_image" mode="aspectFit"></image>
+							 <image style="width: 206upx; height: 224upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+							 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+						</view> 
+					</view>
+					<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+						<text v-if="goods.is_pay.value == 0">支付失败</text>
+						<text v-if="goods.is_pay.value == 1">
+							<!-- <text v-if="goods.status.value == 0">等待生产</text> -->
+							<text v-if="goods.status.value < 8 && goods.status.value >= 0">生产中</text>
+							<text v-if="goods.status.value == 8">已发货</text>
+						</text>
+					</view>
+					<view style="font-size: 24upx; font-weight: 400; color: #CCCCCC; margin-top: 20upx; text-align: center;">
+						<text v-if="goods.is_pay.value == 0">作品支付失败</text>
+						<text v-if="goods.is_pay.value == 1">
+							<!-- <text v-if="goods.status.value == 0">作品正在等待生产</text> -->
+							<text v-if="goods.status.value < 8 && goods.status.value >= 0">色彩正在加急冲印,请留意最新的状态通知</text>
+						</text>
+						<text v-if="goods.status.value == 8">色彩正在配送路上,请留意最新的配送状态</text>
+						<view v-if="goods.status.value == 8">{{goods.order_express.express_name || ''}}</view>
+						<view v-if="goods.status.value == 8">快递单号: {{goods.order_express.express_no || ''}}</view>
+					</view>
+					<view style="margin-top: 104upx; margin-left: 20%; width: 60%;">
+						<view style=" font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+							<text> 订单编号: </text> <text style="color: #888888;"> {{goods.id || ''}} </text>
+							<text @click="tosetClipboardData(goods.id)" style="margin-left: 5upx;font-size: 22upx;">复制</text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 10upx;">
+							<text > 产品尺寸: </text>
+							<text style="color: #888888;"> 
+								{{goods.order_goods.goods_name || ''}}
+								<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+							</text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 支付金额: </text> <text style="color: #888888;"> ¥{{goods.real_amount || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 下单时间: </text> <text style="color: #888888;"> {{goods.create_time || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 收件信息: </text> 
+							<text style="color: #888888;">{{goods.order_express.receivor || ''}} {{goods.order_express.phone || ''}} {{goods.order_express.address || ''}}</text>
+						</view>
+					</view>
+				</view>
+		<!-- 收货成功 -->
+				<view v-if="goods.status.value == 9 && type == 1">
+					<view style="width: 220upx; margin:90upx auto 40upx;">
+						 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/mine/Pick-up.png" mode="aspectFill"></image>
+					</view>
+					<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+						收货成功
+					</view>
+					<view style="margin-top: 104upx; margin-left: 25%; width: 50%;">
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 快递公司: </text> <text style="color: #888888;"> {{goods.order_express.express_name || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 快递单号: </text> <text style="color: #888888;"> {{goods.order_express.express_no || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 收件信息: </text> 
+							<text style="color: #888888;">{{goods.order_express.receivor || ''}} {{goods.order_express.phone || ''}} {{goods.order_express.address || ''}}</text>
+						</view>
+					</view>
+					<view style="margin-top: 104upx; display: flex; align-items: center; justify-content: center;">
+						<view style="width: 187upx; position: relative; border-radius: 10upx;" 
+						:style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+							<!-- 手机壳 -->
+							<view style="width: 128upx; height: 141upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+								<image style="width: 128upx; height: 141upx; margin:auto; display: block;position: relative; z-index: 10;"
+								:src="goods.goods.front_image" mode="aspectFit"></image>
+								 <image style="width: 128upx; height: 141upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+								 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+							</view>
+						</view>
+						<view style="margin-left: 19upx; margin-top: 5upx;">
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+								<text> 订单编号: </text>
+								<text style="color: #888888;"> {{goods.id || ''}} </text>
+								<text @click="tosetClipboardData(goods.id)" style="margin-left: 5upx;font-size: 22upx;">复制</text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+								<text> 产品尺寸: </text>
+								<text style="color: #888888;"> 
+									{{goods.order_goods.goods_name || ''}}
+									<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+								</text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+								<text> 支付金额: </text>
+								<text style="color: #888888;"> ¥{{goods.real_amount || ''}} </text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+								<text> 下单时间: </text>
+								<text style="color: #888888;"> {{goods.create_time || ''}} </text>
+							</view>
+						</view>
+					</view>
+				</view>
+		</view>
+		<view v-if="rankinglist.length > 0 && type != 2" style="position: fixed; bottom: 30upx;
+		margin: auto; left: 0; right: 0;
+		 text-align: center;color: #FFFFFF;font-size: 34upx; font-weight: 400;">
+			当前还有{{rankinglist.length || 0}}个手机壳正在打印
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	import firework from '@/components/ay-firework/firework.vue';//礼花
+	export default {
+		components: {firework},
+		computed: {},
+		data() {
+			return {
+				goods: {},
+				queryPage: {
+					s: 'Order.detail',
+					id: null
+				},
+				machine_id:null,//设备id
+				type:null ,//1:配送版,2:单机版,3:自助版
+				
+				lineUpState: false,//排队状态----横向进入滑动动画
+				leaveUpState: false,//排队状态----横向离开滑动动画
+				
+				printingStart: false,//打印状态----横向进来滑动动画 Printing start
+				printingEnd:{}, ///打印状态----纵向离开动画 Printing end
+				initstate: false,//打印状态----显示刷子
+				PickUpStart:{}, //取货状态-----手机壳从上面动画出来
+				PickUpTopBottom:null, //定时器----取货上下浮动
+				statetime:null,//定时器----打印机动画
+				orderOrderStatusTime:null,//定时器---查询订单状态
+				OrderOrderRankingTime:null,//定时器---排队定时器
+				leftx:0,//x轴-----刷子打印
+				topy:-20,//y-----刷子打印
+				animMaind:{}, //动画----刷子上下动画
+				animMaind_time:800, //动画时间----刷子上下动画时间
+				isReady: false,//礼花开关
+				BoxTwoAnimation:{}, //排队-打印-取货流程图架构
+				oldRankinglist:[],//上次排队队列
+				rankinglist:[],//排队队列
+				teststate:false,//开启测试模式 false  true
+				orderOrderStatusData:null,//订单状态
+				ringaction: { //打印机音乐状态
+					method: 'pause' //method: 'pause'method: 'play'
+				},
+				stitchaction: { //履带音乐状态
+					method: 'pause' //method: 'pause'method: 'play'
+				},
+				printer:false,//打印机状态
+				
+				data: {
+					windowWidth: 0, // 屏幕宽度
+					windowHeight: 0, // 屏幕高度
+					pixelRate: 0, // 屏幕宽度比率
+					editorWidth: 0, // 设计宽度
+					editorHeight: 0, // 设计高度
+					render_cove_width:null,
+					render_cove_height:null,
+					activebrushX:-500,//排队盒子动画坐标
+					printingStartX:-500,//生产中盒子动画坐标
+				},
+				
+				tomallstate:true,//防止返回触动页面销毁事件
+				LoadState:false,//加载完成
+				orderCurrentOrder:null,
+				orderCurrentOrderTime:null,
+				background_surface_image:null,//定制壳手机壳底色
+			};
+		},
+		onReady() {
+			
+		},
+		methods: {
+			tomall(){
+				this.tomallstate = false
+				wx.navigateBack({delta: 3})
+			},
+			init() {
+				this.printer = true
+				this.isReady = false
+				this.leftx = this.data.render_cove_width
+				// this.topy = -20
+				setTimeout(function(){
+					this.updata()
+				}.bind(this),2000)
+			},
+			updata(){
+				setTimeout(function(){
+					this.ringaction.method = 'play' //开启音乐
+					console.log('5开启音乐')
+				}.bind(this),this.animMaind_time)
+				// 无限循环动画
+				var animation = wx.createAnimation({
+					duration: this.animMaind_time,// 动画执行时间
+					timingFunction: 'linear',// 动画执行效果
+				})
+				var state = true // 控制上下滑动setTimeout setInterval
+				this.statetime = setInterval(function(){
+					if(state == true){
+						animation.translate(0,(this.data.render_cove_height)).step();//向下移动
+					}else{
+						animation.translate(0,0).step();//向上移动
+					}
+					state = !state
+					// 减慢打印时间
+					if(this.leftx <= 10){
+						if(this.orderOrderStatusData.status == 10  || this.orderOrderStatusData.status == 2){
+							this.leftx -= 2
+						}else{
+							this.leftx -= 0.1
+						}
+					}else{
+						this.leftx -= 1
+					}
+					this.setData({
+					  animMaind: animation.export(),
+					  leftx:this.leftx
+					})
+					// 打印完成----清除定时器
+					if(this.leftx <= 0){
+						this.ringaction.method = 'pause' //暂停音乐
+						console.log('5暂停音乐')
+						clearInterval(this.statetime)
+						this.statetime = null
+						this.isReady = true;
+						this.printer = false
+						uni.showToast({title: '打印完成,即将出货',icon: 'none',duration: 2000});
+						setTimeout(function(){
+							this.boxinit({
+								duration:3000,// 动画执行时间
+								axisX:0,// x轴移动
+								axisY:this.data.windowHeight,// y轴移动
+								settimeout:3500,// 定时器时间
+							}) // 触发打印完成--手机壳下移消失
+						}.bind(this),2000)
+					}
+				}.bind(this),this.animMaind_time)
+			},
+			// 打印完成--手机壳下移消失
+			boxinit(data){
+				var animation = wx.createAnimation({
+					duration: data.duration,// 动画执行时间
+					timingFunction: 'linear',// 动画执行效果
+				})
+				animation.translate(data.axisX, data.axisY).step();
+				this.setData({
+					printingEnd: animation.export(),
+				})
+				setTimeout(function(){
+					this.Box_Two_Animation({
+						duration:2000,// 动画执行时间
+						axisX:0,// x轴移动
+						axisY:-this.data.windowHeight,// y轴移动
+						settimeout:2500,// 定时器时间
+						settimeoutState:true,//开启下一步
+					})
+				}.bind(this),data.settimeout)
+			},
+			// 取货页面----底部向上滑动动画
+			Box_Two_Animation(data){
+				var animation = wx.createAnimation({
+					duration: data.duration,// 动画执行时间
+					timingFunction: 'linear',// 动画执行效果
+				})
+				animation.translate(data.axisX, data.axisY).step();
+				this.setData({
+					BoxTwoAnimation: animation.export(),
+				})
+				if(!data.settimeoutState) return;
+				wx.setNavigationBarTitle({title: '取货区' })
+				setTimeout(function(){
+					let boxinitY = (this.data.windowHeight - ((this.data.windowHeight - this.data.editorHeight)/2)) - ( this.data.editorHeight / 3 * 1)
+					this.Two_Brush_Animation({
+						duration:5000,// 动画执行时间
+						axisX:0,// x轴移动
+						axisY:boxinitY,// y轴移动
+						settimeout:5000,// 定时器时间
+					})
+				}.bind(this),data.settimeout)
+			},
+			// 取货手机壳动画
+			Two_Brush_Animation(data){
+				let animation = wx.createAnimation({
+					duration: data.duration,// 动画执行时间
+					timingFunction: 'linear',// 动画执行效果
+				})
+				animation.translate(data.axisX, data.axisY).step();
+				this.setData({
+					PickUpStart: animation.export(),
+				})
+				// 上下浮动
+				clearInterval(this.PickUpTopBottom)
+				this.PickUpTopBottom = null
+				setTimeout(function(){
+					uni.showToast({title: '已出货,请在出货口取货吧',icon: 'none',duration: 2000});
+					var state = true
+					let animation = wx.createAnimation({
+						duration: 2000,// 动画执行时间
+						timingFunction: 'linear',// 动画执行效果
+					})
+					this.PickUpTopBottom = setInterval(function(){
+						if(state == true){
+							animation.translate(data.axisX,(data.axisY + 40)).step();
+						}else{
+							animation.translate(data.axisX,data.axisY).step();
+						}
+						state = !state
+						this.setData({
+						  PickUpStart: animation.export(),
+						})
+					}.bind(this),2000)
+				}.bind(this),data.settimeout)
+			},
+			loadData() {
+				uni.showLoading({title: '正在加载中...'})
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.goods = result
+					if(this.$base.mobilePhoneCaseSize){
+						this.data = this.$base.mobilePhoneCaseSize
+					}else{
+						this.background_surface_image = result.goods.surface_pic
+						result.goods.design_width = 200 / this.data.pixelRate
+						result.goods.design_height = 370 / this.data.pixelRate
+						this.data.editorWidth = result.goods.design_width * this.data.pixelRate // 设计宽度
+						this.data.editorHeight = result.goods.design_height * this.data.pixelRate // 设计高度
+						this.data.render_cove_width = result.goods.render_cove_width * (result.goods.design_width / result.goods.render_width) * this.data.pixelRate + 30 // 设计高度
+						this.data.render_cove_height = result.goods.render_cove_height * (result.goods.design_height / result.goods.render_height) * this.data.pixelRate + 30 // 设计高度
+						this.data.render_left = result.goods.render_left * (result.goods.design_width / result.goods.render_width)  * this.data.pixelRate // 设计高度
+						this.data.render_top = result.goods.render_top * (result.goods.design_height / result.goods.render_height) * this.data.pixelRate // 设计高度
+						this.data.activebrushX = -((this.data.windowWidth - this.data.editorWidth)/2 + this.data.editorWidth + 50)
+						this.data.printingStartX = -((this.data.windowWidth - this.data.editorWidth)/2 + this.data.editorWidth + 50)
+						this.$base.mobilePhoneCaseSize = this.data
+					}
+					this.leftx = this.data.render_cove_width
+					// status.value 订单状态 0:等待生产,1:生产中,2: 生产完成,3:取消生产,4:出料中(弃用),5: 等待取料(弃用), 6:待入货(弃用),7:取货完成,8:已发货,9:订单完成 -->
+					// type.value 1直营配送站 2 万能通用版 3色彩自助站
+					if(this.teststate){
+						result.status.value = 1 //1:生产中
+						result.type.value = 2 //2单机版
+					}
+					this.type = result.type.value
+					// 单机版查询当前设备打印订单
+					if(this.type == 2){
+						this.anb() //查询排队列表
+						// clearInterval(this.orderCurrentOrderTime)
+						// this.orderCurrentOrderTime = setInterval(function(){
+						// 	this.OrdercurrentOrder() //单机版查询设备打印订单
+						// 	this.anbtwo() //记录排队人数
+						// }.bind(this),10000)
+						// setTimeout(function(){
+						// 	this.OrdercurrentOrder() //单机版查询设备打印订单
+						// 	// this.anbtwo() //记录排队人数
+						// }.bind(this),10000)
+						this.leaveto(3)
+					}else{
+						this.OrderOrderStatusInit()
+					}
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			anb(){
+				homeservice.WorksList({
+					s:'Order.orderStatus',
+					order_id:this.queryPage.id
+				}).then(result => {
+					this.orderOrderStatusData = result
+					this.orderOrderStatusData.status = 0
+					// wx.setNavigationBarTitle({title: '排队区' })
+					// this.anbone()
+				}).catch(err => {
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			anbone(){
+				homeservice.WorksList({
+					s:'Order.orderRanking',
+					order_id:this.queryPage.id,
+					machine_id:this.machine_id
+				}).then(result => {
+					this.oldRankinglist = []// 第一次进来记录排队人数
+					for(var i =0;i<result.ranking;i++){
+						this.oldRankinglist.push({
+							w:30,x:0
+						})
+					}
+					this.rankinglist = this.oldRankinglist
+					this.Box_Two_Animation({
+						duration:0,// 动画执行时间
+						axisX:this.data.windowWidth + this.data.windowWidth,// x轴移动
+						axisY:0,// y轴移动
+						settimeout:0,// 定时器时间
+						settimeoutState:false,//开启下一步
+					})
+					this.LoadState = true
+					setTimeout(function(){
+						this.Box_Two_Animation({
+							duration:3000,// 动画执行时间
+							axisX:this.data.windowWidth,// x轴移动
+							axisY:0,// y轴移动
+							settimeout:0,// 定时器时间
+							settimeoutState:false,//开启下一步
+						})
+					}.bind(this),1000)
+					//排队状态----盒子横向进入滑动动画时间3s
+					setTimeout(function(){
+						this.lineUpState = true
+						this.data.activebrushX = 0
+					}.bind(this),4500)
+				}).catch(err => {
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			// anbtwo(){
+			// 	homeservice.WorksList({
+			// 		s:'Order.orderRanking',
+			// 		order_id:this.queryPage.id,
+			// 		machine_id:this.machine_id
+			// 	}).then(result => {
+			// 		this.oldRankinglist = []// 第一次进来记录排队人数
+			// 		for(var i =0;i<result.ranking;i++){
+			// 			this.oldRankinglist.push({
+			// 				w:30,x:0
+			// 			})
+			// 		}
+			// 		this.rankinglist = this.oldRankinglist
+			// 	}).catch(err => {
+			// 		uni.showToast({title: err.msg || err.data,icon: 'none'});
+			// 	});
+			// },
+			OrdercurrentOrder(){
+				console.log('单机版查询设备打印订单')
+				homeservice.WorksList({
+					s:'Order.currentOrder',
+					machine_id:this.machine_id
+				}).then(result => {
+					this.orderCurrentOrder = result.order_id
+					if(this.teststate){
+						this.orderCurrentOrder = this.queryPage.id // 测试
+					}
+					// if(this.orderCurrentOrder == this.queryPage.id){
+					// 	console.log('清除定时器---')
+					// 	clearInterval(this.orderCurrentOrderTime)
+					// 	this.leaveto(0)
+					// }
+					console.log('清除定时器---')
+					clearInterval(this.orderCurrentOrderTime)
+					// this.leaveto(3)
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			OrderOrderStatusInit(e){
+				homeservice.WorksList({
+					s:'Order.orderStatus',
+					order_id:this.queryPage.id
+				}).then(result => {
+					//result.status -1:订单不存在 0:待打印 1:打印中 10:打印完成 2:生产完成 3:取消生产
+					if(this.teststate || e == 2){
+						result.status = 0 // 测试
+					}
+					this.orderOrderStatusData = result
+					if(result.status == 0){ //0:待打印排队中
+						wx.setNavigationBarTitle({title: '排队区' })
+						this.OrderOrderRankingInit(4)
+						if(this.teststate){
+							// setTimeout(function(){
+							// 	this.OrderOrderRankingInit(1)
+							// }.bind(this),5000)
+							// setTimeout(function(){
+							// 	this.OrderOrderRankingInit(-1)
+							// }.bind(this),10000)
+						}
+						if(this.type != 2){
+							if(!this.teststate && e != 2){// 排队定时器  测试需要关闭
+								clearInterval(this.OrderOrderRankingTime)
+								this.OrderOrderRankingTime = setInterval(function(){
+									this.OrderOrderRankingInit()
+								}.bind(this),10000)
+							}
+						}
+					}else if(result.status == 1){// 1:打印中
+						wx.setNavigationBarTitle({title: '打印区' })
+						// 打开排队页面
+						this.Box_Two_Animation({
+							duration:0,// 动画执行时间
+							axisX:this.data.windowWidth,// x轴移动
+							axisY:0,// y轴移动
+							settimeout:0,// 定时器时间
+							settimeoutState:false,//开启下一步
+						})
+						this.LoadState = true
+						setTimeout(function(){
+							this.Box_Two_Animation({
+								duration:3000,// 动画执行时间
+								axisX:0,// x轴移动
+								axisY:0,// y轴移动
+								settimeout:0,// 定时器时间
+								settimeoutState:false,//开启下一步
+							})
+						}.bind(this),1000)
+						// 打印状态滑动进来
+						setTimeout(function(){
+							this.printingStart = true //打印状态----横向进来滑动动画 3s
+							this.data.printingStartX = 0
+						}.bind(this),4500)
+						setTimeout(function(){
+							this.initstate = true  //打印状态----显示刷子
+							this.init()
+						}.bind(this),7500)
+						if(!this.teststate){
+							// 定时器查询订单状态
+							clearInterval(this.orderOrderStatusTime)
+							this.orderOrderStatusTime = setInterval(function(){
+								this.orderOrderStatusGet()
+							}.bind(this),10000)
+						}else{
+							// 定时器查询订单状态
+							clearInterval(this.orderOrderStatusTime)
+							this.orderOrderStatusTime = setInterval(function(){
+								this.orderOrderStatusGet()
+							}.bind(this),30000)
+						}
+					}else if(result.status == 2 || result.status == 10){ //2:生产完成 10:打印完成
+						this.LoadState = true
+						wx.setNavigationBarTitle({title: '取货区' })
+						this.Box_Two_Animation({
+							duration:2000,// 动画执行时间
+							axisX:0,// x轴移动
+							axisY:-this.data.windowHeight,// y轴移动
+							settimeout:2500,// 定时器时间
+							settimeoutState:true,//开启下一步
+						})
+					}else if(result.status == 3 || result.status == -3){
+						wx.setNavigationBarTitle({title: '取消生产' })
+					}else if(result.status == -2){
+						wx.setNavigationBarTitle({title: '设备故障' })
+					}else if(result.status == 7){
+						wx.setNavigationBarTitle({title: '取货完成' })
+					}
+				}).catch(err => {
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			// -1:订单不存在 0:待打印 1:打印中 10:打印完成 2:生产完成 3:取消生产
+			// 打印状态滑动进来
+			orderOrderStatusGet(){
+				homeservice.WorksList({
+					s:'Order.orderStatus',
+					order_id:this.queryPage.id
+				}).then(result => {
+					if(this.teststate){
+						result.status = 2
+					}
+					this.orderOrderStatusData = result
+					if(result.status == 10 || result.status == 2){
+						clearInterval(this.statetime)
+						this.statetime = null
+						clearInterval(this.orderOrderStatusTime)
+						this.orderOrderStatusTime = null
+						let animMaind_time = (5 / this.leftx) * 1000
+						// 导出动画
+						this.setData({
+							animMaind_time: animMaind_time || 200,
+						})
+						this.updata()
+					}else if(result.status == 3 || result.status == -3){
+						this.ringaction.method = 'pause' //暂停音乐
+						console.log('5暂停音乐')
+						wx.setNavigationBarTitle({title: '取消生产' })
+						clearInterval(this.statetime)
+						this.statetime = null
+						clearInterval(this.orderOrderStatusTime)
+						this.orderOrderStatusTime = null
+					}else if(result.status == -2){
+						this.ringaction.method = 'pause' //暂停音乐
+						console.log('5暂停音乐')
+						wx.setNavigationBarTitle({title: '设备故障' })
+						clearInterval(this.statetime)
+						this.statetime = null
+						clearInterval(this.orderOrderStatusTime)
+						this.orderOrderStatusTime = null
+					}else if(result.status == 7){
+						this.ringaction.method = 'pause' //暂停音乐
+						console.log('5暂停音乐')
+						wx.setNavigationBarTitle({title: '取货完成' })
+						clearInterval(this.statetime)
+						this.statetime = null
+						clearInterval(this.orderOrderStatusTime)
+						this.orderOrderStatusTime = null
+					}
+				}).catch(err => {
+					console.log(err)
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			// 查询排队
+			// 如果订单不存单,或者订单已经打印完成,那么返回的排名是-1
+			// 如果订单当前正在打印。返回的排名是0
+			// 如果前面有一个订单就返回1,前面有两个订单就返回2
+			OrderOrderRankingInit(state){
+				homeservice.WorksList({
+					s:'Order.orderRanking',
+					order_id:this.queryPage.id,
+					machine_id:this.machine_id
+				}).then(result => {
+					if(this.teststate){
+						result.ranking = state //例子
+					}
+					if(result.ranking >= 0){
+						if(this.oldRankinglist.length > 0){
+							if(this.rankinglist.length > result.ranking){
+								// 排队消失列表效果
+								this.rankinglist[(this.rankinglist.length - 1)].x = 200
+								setTimeout(function(){
+									this.rankinglist[(this.rankinglist.length - 1)].w = 0
+								}.bind(this),1000)
+								setTimeout(function(){
+									this.rankinglist.pop()
+									if(this.rankinglist.length == 0){
+										this.leaveto(0)
+									}
+								}.bind(this),2500)
+							}
+						}else{
+							this.oldRankinglist = []// 第一次进来记录排队人数
+							for(var i =0;i<result.ranking;i++){
+								this.oldRankinglist.push({
+									w:30,x:0
+								})
+							}
+							this.rankinglist = this.oldRankinglist
+							// 当排队人数等于0就开始打印
+							if(this.rankinglist.length == 0){
+								this.leaveto(1)
+							}else{
+								// 快速切换--排队状态设计区底图
+								this.Box_Two_Animation({
+									duration:0,// 动画执行时间
+									axisX:this.data.windowWidth + this.data.windowWidth,// x轴移动
+									axisY:0,// y轴移动
+									settimeout:0,// 定时器时间
+									settimeoutState:false,//开启下一步
+								})
+								this.LoadState = true
+								setTimeout(function(){
+									this.Box_Two_Animation({
+										duration:3000,// 动画执行时间
+										axisX:this.data.windowWidth,// x轴移动
+										axisY:0,// y轴移动
+										settimeout:0,// 定时器时间
+										settimeoutState:false,//开启下一步
+									})
+								}.bind(this),1000)
+								//排队状态----盒子横向进入滑动动画时间3s
+								setTimeout(function(){
+									this.lineUpState = true
+									this.data.activebrushX = 0
+								}.bind(this),4500)
+							}
+						}
+					}else{
+						this.leaveto(1)
+					}
+				}).catch(err => {
+					uni.showToast({title: err.msg || err.data,icon: 'none'});
+				});
+			},
+			leaveto(e){ //e== 1无排队切换打印 0有排队切换打印
+				clearInterval(this.OrderOrderRankingTime)
+				this.OrderOrderRankingTime = null
+				let time = 3500 //时间
+				if(e == 1){  //无排队切换打印
+					// 快速切换--设计区底图
+					this.Box_Two_Animation({
+						duration:0,// 动画执行时间
+						axisX:this.data.windowWidth,// x轴移动
+						axisY:0,// y轴移动
+						settimeout:0,// 定时器时间
+						settimeoutState:false,//开启下一步
+					})
+					this.LoadState = true
+					setTimeout(function(){
+						this.Box_Two_Animation({
+							duration:3000,// 动画执行时间
+							axisX:0,// x轴移动
+							axisY:0,// y轴移动
+							settimeout:0,// 定时器时间
+							settimeoutState:false,//开启下一步
+						})
+					}.bind(this),1000)
+					time = 4500 //无时间
+					wx.setNavigationBarTitle({title: '打印区' })
+				}else if(e == 0){ //有排队切换打印
+					this.LoadState = true
+					this.leaveUpState = true //排队状态----横向离开滑动动画 时间3s
+					this.data.activebrushX = (this.data.windowWidth - this.data.editorWidth)/2 + this.data.editorWidth + 50 //排队状态----横向离开滑动动画 3s
+					setTimeout(function(){ // 排队页面滑出---打印页面进入
+						this.Box_Two_Animation({
+							duration:3000,// 动画执行时间
+							axisX:0,// x轴移动
+							axisY:0,// y轴移动
+							settimeout:0,// 定时器时间
+							settimeoutState:false,//开启下一步
+						})
+					}.bind(this),time)
+					wx.setNavigationBarTitle({title: '打印区' })
+				}else if(e == 3){
+					// 快速切换--设计区底图
+					this.Box_Two_Animation({
+						duration:0,// 动画执行时间
+						axisX:this.data.windowWidth,// x轴移动
+						axisY:0,// y轴移动
+						settimeout:0,// 定时器时间
+						settimeoutState:false,//开启下一步
+					})
+					this.LoadState = true
+					setTimeout(function(){
+						this.Box_Two_Animation({
+							duration:3000,// 动画执行时间
+							axisX:0,// x轴移动
+							axisY:0,// y轴移动
+							settimeout:0,// 定时器时间
+							settimeoutState:false,//开启下一步
+						})
+					}.bind(this),1000)
+					time = 500 //无时间
+					wx.setNavigationBarTitle({title: '打印区' })
+				}
+				
+				setTimeout(function(){
+					this.printingStart = true //打印状态----横向进来滑动动画
+					this.data.printingStartX = 0
+				}.bind(this),(time + 3500))
+				// 刷子开始打印手机壳
+				setTimeout(function(){
+					this.initstate = true
+					this.init()
+				}.bind(this),(time + 6500))
+				// 开启定时器查询打印状态
+				if(this.teststate){
+					clearInterval(this.orderOrderStatusTime)
+					this.orderOrderStatusTime = setInterval(function(){
+						this.orderOrderStatusGet()
+					}.bind(this),15000)
+				}else{
+					clearInterval(this.orderOrderStatusTime)
+					this.orderOrderStatusTime = setInterval(function(){
+						this.orderOrderStatusGet()
+					}.bind(this),10000)
+				}
+			},
+			clearIntervalTime(){// 清除定时器
+				clearInterval(this.statetime)
+				this.statetime = null
+				clearInterval(this.orderOrderStatusTime)
+				this.orderOrderStatusTime = null
+				clearInterval(this.OrderOrderRankingTime)
+				this.OrderOrderRankingTime = null
+			},
+			setData(obj) {
+				let that = this;
+				let keys = [];
+				let val, data;
+				Object.keys(obj).forEach(function(key) {
+					keys = key.split('.');
+					val = obj[key];
+					data = that.$data;
+					keys.forEach(function(key2, index) {
+						if (index + 1 == keys.length) {
+							that.$set(data, key2, val);
+						} else {
+							if (!data[key2]) {
+								that.$set(data, key2, {});
+							}
+						}
+						data = data[key2];
+					})
+				});
+			},
+			tosetClipboardData(id){ // 复制成功
+				uni.setClipboardData({
+				    data: id,
+				    success: function () {
+				        uni.showToast({
+				        	title: '复制成功',
+				        	icon:'none',
+				        	duration: 2000
+				        });
+				    }
+				});
+			},
+			callPhone (phone) { //拨打电话
+				uni.makePhoneCall({
+					phoneNumber: this.phone || '18938664545'
+				})
+			},
+			previewImg(goods, index) {//预览图片
+				let img = goods.works_image
+				uni.previewImage({
+					current: index,
+					urls: [img]
+				});
+			},
+			
+			getDetail() {
+				homeservice.WorksList({
+					machine_id: this.machine_id,
+					s: 'machine.newDetail'
+				}).then(res => {
+					if (res) {
+			            this.phone = res.phone;
+					}
+					//uni.stopPullDownRefresh();
+					//uni.hideLoading();
+				}).catch(err => {
+					this.msg = err.msg
+					uni.stopPullDownRefresh();
+					uni.hideLoading();
+					this.myheadtext = '歇一歇' //头部标题栏
+				});
+			},
+			
+		},
+		
+		
+		
+		
+		onLoad(options) {
+			console.log(options)
+			// orderId=161819487100005361&type=null&machine_id=100012
+			// orderId=161819487100005361&type=2&machine_id=100022
+			// 例子 2021/12/17
+			// orderId=163964142100008177&type=3&machine_id=100012
+			this.clearIntervalTime()
+			this.queryPage.id = options.orderId
+			this.type = options.type
+			this.machine_id = options.machine_id
+			if(this.$base.mobilePhoneCaseSize){
+				this.data = this.$base.mobilePhoneCaseSize
+				this.leftx = this.data.render_cove_width
+			}else{
+				var that = this;
+				wx.getSystemInfo({//获取屏幕宽高
+					success: function(res) {
+						let pixelRate = res.windowWidth / 750;
+						that.data.windowWidth = res.windowWidth // 屏幕宽度
+						that.data.windowHeight = res.windowHeight // 屏幕高度
+						that.data.pixelRate = pixelRate // 屏幕宽度比率
+					}
+				})
+			}
+			this.getDetail();
+			this.loadData();
+		},
+		onshow(){
+			this.data.activebrushX = '-500'//排队盒子动画坐标
+			this.printingStart = false
+			this.data.printingStartX = '-500'//生产中盒子动画坐标
+		},
+		onUnload() { 
+			this.clearIntervalTime()
+			let pages = getCurrentPages();
+			// console.log(pages)
+			if(this.tomallstate){
+				if(pages[pages.length - 2].route == "pages/mine/order"){
+					wx.navigateBack({delta: 3})
+				}else if(pages[pages.length - 2].route == "pages/index/index"){
+					wx.navigateBack({delta: 2})
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background: #131319 !important;
+		color: #fff;
+	}
+
+	.stepsmain {
+		margin: 0upx 30upx 87upx;
+		padding: 20upx 20upx;
+		background: #282932;
+		border-radius: 10upx;
+	}
+
+	.steps {
+		position: relative;
+		counter-reset: step;
+		/*创建步骤数字计数器*/
+		overflow: hidden;
+	}
+
+	/*步骤描述*/
+	.steps .li {
+		list-style-type: none;
+		font-size: 12px;
+		text-align: center;
+		width: calc(100% / 6);
+		position: relative;
+		float: left;
+
+		.steps_img {
+			position: relative;
+			z-index: 9;
+			border: 1upx solid #FFFFFF;
+			background: #282932;
+			width: 56upx;
+			height: 56upx;
+			border-radius: 50%;
+			margin: auto;
+
+			.steps_image {
+				width: 27upx;
+				height: 27upx;
+				margin: 15upx auto;
+			}
+		}
+
+		.steps_text {
+			text-align: center;
+			font-size: 24upx;
+			font-weight: 400;
+			color: #888888;
+			margin-top: 15upx;
+		}
+	}
+
+	.steps .li.active .steps_img{
+		background: #864BC3;
+		border: 1upx solid #864BC3;
+	}
+	.steps .li.red .steps_img{
+		background: #864BC3;
+		border: 1upx solid #864BC3;
+	}
+
+	/*连接线*/
+	.steps .li~.li:after {
+		content: '';
+		width: 100%;
+		height: 1px;
+		background-color: #fff;
+		position: absolute;
+		left: -50%;
+		top: 15px;
+		z-index: 1;
+		/*放置在数字后面*/
+	}
+	.steps .li.red ~ .li.red:after {
+	  background-color: #864BC3;
+	}
+	.steps .li.red ~ .li.active:after {
+	  background-color: #864BC3;
+	}
+	.steps .li.red ~ .li.wait:after {
+	  background-color: #864BC3;
+	}
+	.steps .li.active ~ .li.wait:after {
+	  background-color: #864BC3;
+	}
+	.steps .li.wait ~ .li.wait:after {
+	  background-color: #B6B6B6;
+	}
+	
+	// 3D动画
+	.crate-wrapper {
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	
+	.brush{
+		position: relative;
+		transition: all 3s;
+		transform: translateX(-400px);
+	}
+	
+	
+	.twobrush{
+		position: relative;
+		transition: all 3s;
+	}
+	
+	.item-text{
+		transition: all 2s;
+		transform: translateX(400px);
+	}
+	.printer{
+		transform: translateX(0px);
+	}
+	
+	// 错误提示信息
+	.start {
+		.start_img {
+			width: 260upx;
+			height: 260upx;
+			display: block;
+			margin: 0upx auto 102upx;
+		}
+		.start_title {
+			font-size: 30upx;
+			text-align: center;
+			color: #FFFFFF;
+		}
+		.start_text {
+			width: 70%;
+			text-align: center;
+			font-size: 28upx;
+			font-family: Source Han Sans CN;
+			font-weight: 400;
+			color: #FFFFFF;
+			margin: 22upx auto 0;
+			line-height: 28upx;
+		}
+	}
+</style>
diff --git a/pages/mine/self_help_payment_details_new.vue b/pages/mine/self_help_payment_details_new.vue
new file mode 100644
index 0000000..608561a
--- /dev/null
+++ b/pages/mine/self_help_payment_details_new.vue
@@ -0,0 +1,865 @@
+<template>
+	<view class="full-width full-height">
+		<view style="min-height: 100%;">
+			<view style="padding-bottom: 60upx; padding-top: 40upx;">
+				<!-- 自助版:定制、支付、生产中、取货 //1:配送版,2:单机版,3:自助版-->
+				<view class="stepsmain" v-if="type == 3 && goods.status.value != 7 && goods.status.value != 3">
+					<view class="steps">
+						<!-- <view class="li red" style="width: calc(100% / 4);">
+							<view class="steps_img">
+								<image style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">定制</view>
+						</view> -->
+						<view class="li red" style="width: calc(100% / 3);">
+							<view class="steps_img">
+								<!-- 成功 是否支付 0:未付款 1:已付款,2:取消,3:过期-->
+								<image v-if="goods.is_pay.value == 1" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+								<!-- 失败 -->
+								<image v-if="goods.is_pay.value == 0" class="steps_image" src="../../static/mine/icon_guanbi.png"  mode=""></image>
+							</view>
+							<view class="steps_text">支付</view>
+						</view>
+						<!-- 支付成功 -->
+						<view v-if="goods.is_pay.value == 1" class="li" style="width: calc(100% / 3);" :class="[goods.status.value > 1 ? 'red':'active']">
+							<view class="steps_img">
+								<image v-if="goods.status.value <= 1" class="steps_image" src="../../static/mine/icon_three.png"  mode=""></image>
+								<image v-if="goods.status.value > 1" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">打印</view>
+						</view>
+						<!-- 支付失败 -->
+						<view v-if="goods.is_pay.value == 0" class="li wait" style="width: calc(100% / 3);">
+							<view class="steps_img">
+								<image class="steps_image" src="../../static/mine/icon_three.png"  mode=""></image>
+							</view>
+							<view class="steps_text">打印</view>
+						</view>
+						<view class="li" style="width: calc(100% / 3);" :class="[goods.status.value > 1 ? 'active':'wait' ]">
+							<view class="steps_img">
+								<view style="text-align: center; line-height: 56upx; font-size: 22upx; font-weight: 500; color: #FFFFFF;">取</view>
+							</view>
+							<view class="steps_text">取货</view>
+						</view>
+					</view>
+				</view>
+				<!-- 配送版:定制、支付、待生产、生产中、发货、收货-->
+				<view class="stepsmain" v-if="type == 1">
+					<view class="steps">
+						<!-- <view class="li red" style="width: calc(100% / 5);">
+							<view class="steps_img">
+								<image style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">定制</view>
+						</view> -->
+						<view class="li red" style="width: calc(100% / 4);">
+							<view class="steps_img">
+								<!-- 成功 是否支付 0:未付款 1:已付款,2:取消,3:过期-->
+								<image v-if="goods.is_pay.value == 1" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+								<!-- 失败 -->
+								<image v-if="goods.is_pay.value == 0" class="steps_image" src="../../static/mine/icon_guanbi.png"  mode=""></image>
+								<!-- 正常 -->
+								<!-- <image class="steps_image" src="../../static/mine/icon_one.png" mode=""></image> -->
+							</view>
+							<view class="steps_text">支付</view>
+						</view>
+						<!-- <view v-if="goods.is_pay.value == 1" class="li" :class="[goods.status.value > 0 ? 'red':'',goods.status.value == 0 ? 'active': '',goods.status.value < 0 ? 'wait': '']">
+							<view class="steps_img">
+								<image v-if="goods.status.value <= 0" class="steps_image" src="../../static/mine/icon_two.png"  mode=""></image>
+								<image v-if="goods.status.value > 0" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">待生产</view>
+						</view>
+						<view v-if="goods.is_pay.value == 0" class="li wait">
+							<view class="steps_img">
+								<image class="steps_image" src="../../static/mine/icon_two.png"  mode=""></image>
+							</view>
+							<view class="steps_text">待生产</view>
+						</view> -->
+						<view class="li" style="width: calc(100% / 4);" :class="[goods.status.value > 1 ? 'red':'',goods.status.value == 1 ? 'active': '',goods.status.value < 1 ? 'wait': '']">
+							<view class="steps_img">
+								<image v-if="goods.status.value <= 1" class="steps_image" src="../../static/mine/icon_three.png"  mode=""></image>
+								<image v-if="goods.status.value > 1" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">打印</view>
+						</view>
+						<view class="li" style="width: calc(100% / 4);" :class="[goods.status.value > 8 ? 'red':'',goods.status.value == 8 ? 'active': '',goods.status.value < 8 ? 'wait': '']">
+							<view class="steps_img" >
+								<image v-if="goods.status.value <= 8" class="steps_image" src="../../static/mine/icon_four.png"  mode=""></image>
+								<image v-if="goods.status.value > 8" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">发货</view>
+						</view>
+						<view class="li" style="width: calc(100% / 4);" :class="[goods.status.value > 9 ? 'red':'',goods.status.value == 9 ? 'active': '',goods.status.value < 9 ? 'wait': '']">
+							<view class="steps_img" >
+								<image class="steps_image" src="../../static/mine/icon_five.png"  mode=""></image>
+							</view>
+							<view class="steps_text">收货</view>
+						</view>
+					</view>
+				</view>
+				<!-- 单机版:定制、生产中、取货 -->
+				<view class="stepsmain" v-if="type == 2 && goods.status.value != 7 && goods.status.value != 3">
+					<view class="steps">
+						<!-- <view class="li red" style="width: calc(100% / 3);">
+							<view class="steps_img">
+								<image style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">定制</view>
+						</view> -->
+						<view class="li" style="width: calc(100% / 2);" :class="[goods.status.value > 1 ? 'red':'active']">
+							<view class="steps_img">
+								<image v-if="goods.status.value <= 1" class="steps_image" src="../../static/mine/icon_three.png"  mode=""></image>
+								<image v-if="goods.status.value > 1" style="width: 31upx; height: 22upx;margin:17upx auto;" src="../../static/mine/icon_confirm.png"  mode=""></image>
+							</view>
+							<view class="steps_text">打印</view>
+						</view>
+						<view class="li" style="width: calc(100% / 2);" :class="[goods.status.value > 1 ? 'active':'wait' ]">
+							<view class="steps_img">
+								<view style="text-align: center; line-height: 56upx; font-size: 22upx; font-weight: 500; color: #FFFFFF;">取</view>
+							</view>
+							<view class="steps_text">取货</view>
+						</view>
+					</view>
+				</view>
+<!-- --------------------------------------------------------------------------------------------------------------------------------------------------- -->
+				<!-- 必须先支付  goods.is_pay.value == 0未支付 1支付-->
+				<!--   goods.status.value 订单状态 0:等待生产,1:生产中,2: 生产完成,3:取消生产,4:出料中(弃用),5: 等待取料(弃用),
+				6:待入货(弃用),7:取货完成,8:已发货,9:订单完成 -->
+				<!-- 生产中 -->
+				<view style="position: relative;" v-if="goods.status.value <= 1 && type != 1">
+					<!-- 衣服 -->
+					<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" 
+					style="width: 300upx; min-height: 300upx; padding: 38upx 0; margin:0 auto 66upx; border-radius: 10upx;" @click="previewImg(goods,0)">
+						<!-- <image style="width: 206upx; padding: 38upx 0; height: 224upx; margin:auto; display: block;position: relative;" :src="goods.goods.front_image" mode="widthFix"></image>
+						<image style="width: 110upx; height: 255upx; position: absolute; top: 150upx; margin: auto;left: 0;right: 0;" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix"></image> -->
+						<view v-if="editory" style="position: relative; margin: auto;" :style="{width: bgWidth +'px',height: bgHeight +'px'}">
+							<view :style="{background: goods.goods.design_color}" style="width: 95%; height: 95%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+							<!-- 背景图 -->
+							<image :src="goods.goods.front_image" :style="{width: bgWidth +'px',height: bgHeight +'px'}" 
+							style="position: absolute; z-index: 1; top: 0;left: 0; right: 0; top: 0; margin: auto;"
+							mode="widthFix"></image>
+							<view :style="{width: editorWidth +'px',height: editorHeight +'px',top: editory +'px'}"
+							style="position: absolute;left: 0; right: 0; top: 0; margin: auto;" >
+								<image :style="{width: editorWidth +'px',height: editorHeight +'px'}"
+								:src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'"
+								 mode="widthFix" class="full-width full-height"></image>
+							</view>
+						</view>
+					</view>
+					<!-- 手机壳 -->
+					<!-- <view v-if="goods.used_applets == '4'" style="width: 300upx; min-height: 300upx; margin:90upx auto 66upx; position: relative; border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+						<view style="width: 206upx; height: 224upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+							<image style="width: 206upx; height: 224upx; margin:auto; display: block;position: relative; z-index: 10;"
+							:src="goods.goods.front_image" mode="aspectFit"></image>
+							 <image style="width: 206upx; height: 224upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+							 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+						</view>
+					</view> -->
+					<view v-if="goods.used_applets == '4'" style="width: 300upx; min-height: 300upx; margin:90upx auto 66upx; position: relative; border-radius: 10upx;">
+						<view style="width: 189upx; height:350upx; margin:auto; display: block; position: relative; overflow: hidden;">
+							<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+							<image style="width: 100%; height: 100%; margin:auto; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+							:src="goods.goods.front_image" mode="aspectFit"></image>
+							 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+							 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+						</view>
+					</view>
+					<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+						<text v-if="goods.is_pay.value == 0">支付失败</text>
+						<text v-if="goods.is_pay.value == 1">
+							<text v-if="goods.wait.ranking == 0">生产中</text>
+							<text v-if="goods.wait.ranking > 0">排队中</text>
+						</text>
+					</view>
+					<view style="font-size: 24upx; font-weight: 400; color: #CCCCCC; margin-top: 20upx; text-align: center;">
+						<text v-if="goods.is_pay.value == 0">作品支付失败</text>
+						<text v-if="goods.is_pay.value == 1">
+							<text v-if="goods.wait.ranking == 0">作品正在加急生产,请留意最新的状态通知</text>
+							<text v-if="goods.wait.ranking > 0">还有{{goods.wait.ranking}}件作品正在打印中,请销等</text>
+						</text>
+					</view>
+					<view style="height: 172upx; text-align: center;">
+						<text v-if="type == 2" style="font-size: 36upx; line-height: 172upx;font-weight: bold;">
+							{{goods.order_queue.id || ''}}
+						</text>
+					</view>
+					<view style="margin-left: 216upx;">
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+							<text> 订单编号: </text> <text style="color: #888888;"> {{goods.id || ''}} </text>
+						</view>
+						<!-- <view v-if="type != 1" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 24upx;">
+							<text> 设备编号: </text> <text style="color: #888888;"> {{goods.machine_id || ''}} </text>
+						</view> -->
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 24upx;">
+							<text> 产品信息: </text>
+							<text style="color: #888888;">
+								{{goods.order_goods.goods_name || ''}}
+								<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+							</text>
+							<!-- <text style="color: #888888;" v-if="type == 2"> {{goods.goods.name || ''}} </text>
+							<text style="color: #888888;"v-if="type != 2"> 
+								{{goods.order_goods.goods_name || ''}}
+								<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+							</text> -->
+						</view>
+						<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 24upx;">
+							<text> 支付金额: </text> <text style="color: #888888;"> ¥{{goods.real_amount || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 24upx;">
+							<text> 下单时间: </text> <text style="color: #888888;"> {{goods.create_time || ''}} </text>
+						</view>
+					</view>
+				</view>
+<!-------------- 取货 ---------------------->
+				<view v-if="goods.status.value == 2 && type != 1">
+					<!-- 衣服 -->
+					<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" 
+					style="width: 300upx; min-height: 300upx; padding: 38upx 0; margin:0 auto 66upx; border-radius: 10upx;" @click="previewImg(goods,0)">
+						<view v-if="editory" style="position: relative; margin: auto;" :style="{width: bgWidth +'px',height: bgHeight +'px'}">
+							<view :style="{background: goods.goods.design_color}" style="width: 95%; height: 95%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+							<!-- 背景图 -->
+							<image :src="goods.goods.front_image" :style="{width: bgWidth +'px',height: bgHeight +'px'}" 
+							style="position: absolute;z-index: 1; top: 0;left: 0; right: 0; top: 0; margin: auto;" mode="widthFix"></image>
+							<view :style="{width: editorWidth +'px',height: editorHeight +'px',top: editory +'px'}" style="position: absolute;left: 0; right: 0; top: 0; margin: auto;" >
+								<image :style="{width: editorWidth +'px',height: editorHeight +'px'}" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix" class="full-width full-height"></image>
+							</view>
+						</view>
+					</view>
+					<!-- 手机壳 -->
+					<view v-if="goods.used_applets == '4'" style="width: 300upx; min-height: 300upx; margin:90upx auto 66upx; position: relative; border-radius: 10upx;">
+						<view style="width: 189upx; height:350upx; margin:auto; display: block; position: relative; overflow: hidden;">
+							<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+							<image style="width: 100%; height: 100%; margin:auto; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+							:src="goods.goods.front_image" mode="aspectFit"></image>
+							 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+							 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+						</view>
+					</view>
+					<!-- <view style="width: 337upx; margin:90upx auto 65upx;">
+						 <image style="width: 337upx; height: 309upx;" src="../../static/mine/qy.png" mode="aspectFill"></image>
+					</view> -->
+					<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+						打印完成
+					</view>
+					<view style="font-size: 24upx; font-weight: 400; color: #CCCCCC; margin-top: 20upx; text-align: center;">
+						<text v-if="goods.used_applets == '3' || goods.used_applets == '2'" >取货后,揭开包装盒底部,有更多惊喜哦</text>
+						<text v-if="goods.used_applets == '4'" >色彩已冲印完成,请及时取走</text>
+					</view>
+					<view style="height: 162upx; text-align: center;">
+						<text v-if="type == 2" style="font-size: 36upx; line-height: 162upx;font-weight: bold;">
+							{{goods.order_queue.id || ''}}
+						</text>
+					</view>
+					<view style="margin-left: 216upx;">
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+							<text> 订单编号: </text> <text style="color: #888888;"> {{goods.id || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 24upx;">
+							<text> 产品信息: </text>
+							<text style="color: #888888;">
+								{{goods.order_goods.goods_name || ''}}
+								<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+							</text>
+						</view>
+						<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 24upx;">
+							<text> 支付金额: </text> <text style="color: #888888;"> ¥{{goods.real_amount || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 24upx;">
+							<text> 下单时间: </text> <text style="color: #888888;"> {{goods.create_time || ''}} </text>
+						</view>
+					</view>
+					<!-- <view style="display: flex; align-items: center; justify-content: center;">
+						<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" 
+						style="width: 187upx; min-height: 187upx; border-radius: 10upx; padding: 23upx 0;" 
+						:style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+							<view v-if="editory" style="position: relative; margin: auto;" :style="{width: bgWidth +'px',height: bgHeight +'px'}">
+								<image :src="goods.goods.front_image" :style="{width: bgWidth +'px',height: bgHeight +'px'}" 
+								style="position: absolute; top: 0;left: 0; right: 0; top: 0; margin: auto;"
+								mode="widthFix"></image>
+								<view :style="{width: editorWidth +'px',height: editorHeight +'px',top: editory +'px'}"
+								style="position: absolute;left: 0; right: 0; top: 0; margin: auto;" >
+									<image :style="{width: editorWidth +'px',height: editorHeight +'px'}"
+									:src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'"
+									 mode="widthFix" class="full-width full-height"></image>
+								</view>
+							</view>
+						</view>
+						<view v-if="goods.used_applets == '4'" style="width: 187upx; min-height: 187upx; position: relative; border-radius: 10upx;"  @click="previewImg(goods,0)">
+							<view style="width: 128upx; height: 236upx;margin:auto; display: block; position: relative; overflow: hidden;">
+								<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+								<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+								:src="goods.goods.front_image" mode="aspectFit"></image>
+								 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+								 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+							</view>
+						</view>
+						<view style="margin-left: 19upx;">
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+								<text> 订单编号: </text>
+								<text style="color: #888888;"> {{goods.id}} </text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+								<text> 产品信息: </text>
+								<text style="color: #888888;">
+									{{goods.order_goods.goods_name || ''}}
+									<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+								</text>
+							</view>
+							<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+								<text> 支付金额: </text>
+								<text style="color: #888888;"> ¥{{goods.real_amount}} </text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+								<text> 下单时间: </text>
+								<text style="color: #888888;"> {{goods.create_time}} </text>
+							</view>
+						</view>
+					</view> -->
+				</view>
+<!-------------- 取货完成 -->
+				<view v-if="goods.status.value == 7 && type != 1">
+					<view style="padding-bottom: 32px">
+						<view style="width: 220upx; margin:90upx auto 40upx;">
+							 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/mine/Pick-up.png" mode="aspectFill"></image>
+						</view>
+						<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+							打印完成
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #CCCCCC; margin-top: 20upx; text-align: center;">
+							<text v-if="goods.used_applets == '3' || goods.used_applets == '2'" >取货后,揭开包装盒底部,有更多惊喜哦</text>
+							<text v-if="goods.used_applets == '4'" >色彩已冲印完成,请及时取走</text>
+						</view>
+						<view style="height: 334upx; text-align: center;">
+							<text v-if="type == 2" style="font-size: 36upx; line-height: 162upx;font-weight: bold;">
+								{{goods.order_queue.id || ''}}
+							</text>
+						</view>
+						<view style="display: flex;align-items: center; justify-content: center;">
+							<!-- 衣服 -->
+							<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" 
+							style="width: 187upx; min-height: 187upx; border-radius: 10upx; padding: 23upx 0;" @click="previewImg(goods,0)">
+								<!-- <image style="width: 128upx; padding: 23upx 0; height: 141upx; margin:auto; display: block;position: relative;" :src="goods.goods.front_image" mode="widthFix"></image>
+								<image style="width: 47upx; height: 63upx; position: absolute; top: 61upx; left: 70upx;" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix"></image> -->
+								<view v-if="editory" style="position: relative; margin: auto;" :style="{width: bgWidth +'px',height: bgHeight +'px'}">
+									<view :style="{background: goods.goods.design_color}" style="width: 95%; height: 95%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+									<image :src="goods.goods.front_image" :style="{width: bgWidth +'px',height: bgHeight +'px'}" 
+									style="position: absolute;z-index: 1; top: 0;left: 0; right: 0; top: 0; margin: auto;" mode="widthFix"></image>
+									<view :style="{width: editorWidth +'px',height: editorHeight +'px',top: editory +'px'}" style="position: absolute;left: 0; right: 0; top: 0; margin: auto;" >
+										<image :style="{width: editorWidth +'px',height: editorHeight +'px'}" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix" class="full-width full-height"></image>
+									</view>
+								</view>
+							</view>
+							<!-- 手机壳  :style="{background: goods.goods.design_color }"-->
+							<view v-if="goods.used_applets == '4'" style="width: 187upx; position: relative; border-radius: 10upx;" @click="previewImg(goods,0)">
+								<!-- <view style="width: 128upx; height: 141upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+									<image style="width: 128upx; height: 141upx; margin:auto; display: block;position: relative; z-index: 10;"
+									:src="goods.goods.front_image" mode="aspectFit"></image>
+									<image style="width: 128upx; height: 141upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+									:src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+								</view> -->
+								<view style="width: 128upx; height: 236upx;margin:auto; display: block; position: relative; overflow: hidden;">
+									<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+									<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+									:src="goods.goods.front_image" mode="aspectFit"></image>
+									 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+									 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+								</view>
+							</view>
+							<view style="margin-left: 19upx; margin-top: 5upx; ">
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+									<text> 订单编号: </text>
+									<text style="color: #888888;"> {{goods.id}} </text>
+								</view>
+								<!-- <view v-if="type != 1" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 设备编号: </text> <text style="color: #888888;"> {{goods.machine_id || ''}} </text>
+								</view> -->
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+									<text> 产品信息: </text>
+									<text style="color: #888888;">
+										{{goods.order_goods.goods_name || ''}}
+										<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+									</text>
+									<!-- <text style="color: #888888;" v-if="type == 2"> {{goods.goods.name || ''}} </text>
+									<text style="color: #888888;"v-if="type != 2">
+										{{goods.order_goods.goods_name || ''}}
+										<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+									</text> -->
+								</view>
+								<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 支付金额: </text>
+									<text style="color: #888888;"> ¥{{goods.real_amount}} </text>
+								</view>
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 下单时间: </text>
+									<text style="color: #888888;"> {{goods.create_time}} </text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+<!-------------- 订单已取消 -->
+				<view v-if="goods.status.value == 3 && type != 1">
+					<view style="padding-bottom: 32px">
+						<view style="width: 220upx; margin:90upx auto 40upx;">
+							 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/icon_close.png" mode="aspectFill"></image>
+						</view>
+						<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+							暂时缺货、订单已取消
+						</view>
+						<view style="margin-top: 378upx; display: flex;align-items: center; justify-content: center;">
+							<!-- 衣服 -->
+							<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" 
+							style="width: 187upx; min-height: 187upx; border-radius: 10upx; padding: 23upx 0;" @click="previewImg(goods,0)">
+								<!-- <image style="width: 128upx; padding: 23upx 0; height: 141upx; margin:auto; display: block;position: relative;" :src="goods.goods.front_image" mode="widthFix"></image>
+								<image style="width: 47upx; height: 63upx; position: absolute; top: 61upx; left: 70upx;" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix"></image> -->
+								<view v-if="editory" style="position: relative; margin: auto;" :style="{width: bgWidth +'px',height: bgHeight +'px'}">
+									<view :style="{background: goods.goods.design_color}" style="width: 95%; height: 95%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+									<image :src="goods.goods.front_image" :style="{width: bgWidth +'px',height: bgHeight +'px'}" 
+									style="position: absolute;z-index: 1; top: 0;left: 0; right: 0; top: 0; margin: auto;"
+									mode="widthFix"></image>
+									<view :style="{width: editorWidth +'px',height: editorHeight +'px',top: editory +'px'}"
+									style="position: absolute;left: 0; right: 0; top: 0; margin: auto;" >
+										<image :style="{width: editorWidth +'px',height: editorHeight +'px'}"
+										:src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'"
+										 mode="widthFix" class="full-width full-height"></image>
+									</view>
+								</view>
+							</view>
+							<!-- 手机壳  :style="{background: goods.goods.design_color }"-->
+							<view v-if="goods.used_applets == '4'" style="width: 187upx; position: relative; border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+								<!-- <view style="width: 128upx; height: 141upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+									<image style="width: 128upx; height: 141upx; margin:auto; display: block;position: relative; z-index: 10;"
+									:src="goods.goods.front_image" mode="aspectFit"></image>
+									<image style="width: 128upx; height: 141upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+									:src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+								</view> -->
+								<view style="width: 128upx; height: 236upx;margin:auto; display: block; position: relative; overflow: hidden;">
+									<view style="width: 95%; height: 95%; background: #FFFFFF; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 0;"></view>
+									<image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index: 10;"
+									:src="goods.goods.front_image" mode="aspectFit"></image>
+									 <image style="width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+									 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="aspectFit"></image>
+								</view>
+							</view>
+							<view style="margin-left: 19upx; margin-top: 5upx; ">
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+									<text> 订单编号: </text>
+									<text style="color: #888888;"> {{goods.id}} </text>
+								</view>
+								<!-- <view v-if="type != 1" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 设备编号: </text> <text style="color: #888888;"> {{goods.machine_id || ''}} </text>
+								</view> -->
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+									<text> 产品信息: </text>
+									<text style="color: #888888;">
+										{{goods.order_goods.goods_name || ''}}
+										<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+									</text>
+									<!-- <text style="color: #888888;" v-if="type == 2"> {{goods.goods.name || ''}} </text>
+									<text style="color: #888888;"v-if="type != 2">
+										{{goods.order_goods.goods_name || ''}}
+										<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+									</text> -->
+								</view>
+								<view v-if="type != 2" style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 支付金额: </text>
+									<text style="color: #888888;"> ¥{{goods.real_amount}} </text>
+								</view>
+								<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+									<text> 下单时间: </text>
+									<text style="color: #888888;"> {{goods.create_time}} </text>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				
+<!-- --------------------------快递发货------------------- -->
+				<!-- 生产中 -->
+				<view style="position: relative;" v-if="goods.status.value <= 8 && type == 1">
+					<!-- 衣服 -->
+					<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" style="width: 300upx; min-height: 300upx; margin:90upx auto 66upx; position: relative;
+					border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+						<image style="width: 206upx; padding: 38upx 0; height: 224upx; margin:auto; display: block;position: relative;" :src="goods.goods.front_image" mode="widthFix"></image>
+						<!-- <image style="width: 75upx; height: 101upx; position: absolute; top: 98upx; left: 113upx;" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix"></image> -->
+						<image style="width: 75upx; height: 101upx; position: absolute; top: 150upx; margin: auto;left: 0;right: 0;" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix"></image>
+					</view>
+					<!-- 手机壳 -->
+					<view v-if="goods.used_applets == '4'" style="width: 300upx; min-height: 300upx; margin:90upx auto 66upx; position: relative; border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+						<view style="width: 206upx; height: 224upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+							<image style="width: 206upx; height: 224upx; margin:auto; display: block;position: relative; z-index: 10;"
+							:src="goods.goods.front_image" mode="aspectFit"></image>
+							 <image style="width: 206upx; height: 224upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+							 :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+						</view>
+					</view>
+					<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+						<text v-if="goods.is_pay.value == 0">支付失败</text>
+						<text v-if="goods.is_pay.value == 1">
+							<!-- <text v-if="goods.status.value == 0">等待生产</text> -->
+							<text v-if="goods.status.value < 8 && goods.status.value >= 0">生产中</text>
+							<text v-if="goods.status.value == 8">已发货</text>
+						</text>
+					</view>
+					<view style="font-size: 24upx; font-weight: 400; color: #CCCCCC; margin-top: 20upx; text-align: center;">
+						<text v-if="goods.is_pay.value == 0">作品支付失败</text>
+						<text v-if="goods.is_pay.value == 1">
+							<!-- <text v-if="goods.status.value == 0">作品正在等待生产</text> -->
+							<text v-if="goods.status.value < 8 && goods.status.value >= 0">色彩正在加急冲印,请留意最新的状态通知</text>
+						</text>
+						<text v-if="goods.status.value == 8">色彩正在配送路上,请留意最新的配送状态</text>
+						<view v-if="goods.status.value == 8">{{goods.order_express.express_name || ''}}</view>
+						<view v-if="goods.status.value == 8">快递单号: {{goods.order_express.express_no || ''}}</view>
+					</view>
+					<view style="margin-top: 104upx; margin-left: 20%; width: 60%;">
+						<view style=" font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+							<text> 订单编号: </text> <text style="color: #888888;"> {{goods.id || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 10upx;">
+							<text > 产品信息: </text>
+							<text style="color: #888888;">
+								{{goods.order_goods.goods_name || ''}}
+								<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+							</text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 支付金额: </text> <text style="color: #888888;"> ¥{{goods.real_amount || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 下单时间: </text> <text style="color: #888888;"> {{goods.create_time || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 收件信息: </text> 
+							<text style="color: #888888;">{{goods.order_express.receivor || ''}} {{goods.order_express.phone || ''}} {{goods.order_express.address || ''}}</text>
+						</view>
+					</view>
+				</view>
+				<!-- 收货成功 -->
+				<view v-if="goods.status.value == 9 && type == 1">
+					<view style="width: 220upx; margin:90upx auto 40upx;">
+						 <image style="width: 220upx; height: 220upx; border-radius: 50%;" src="../../static/mine/Pick-up.png" mode="aspectFill"></image>
+					</view>
+					<view style="font-size: 36upx; font-weight: 400; color: #FFFFFF; text-align: center;">
+						收货成功
+					</view>
+					<view style="margin-top: 104upx; margin-left: 25%; width: 50%;">
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 快递公司: </text> <text style="color: #888888;"> {{goods.order_express.express_name || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 快递单号: </text> <text style="color: #888888;"> {{goods.order_express.express_no || ''}} </text>
+						</view>
+						<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 10upx;">
+							<text> 收件信息: </text> 
+							<text style="color: #888888;">{{goods.order_express.receivor || ''}} {{goods.order_express.phone || ''}} {{goods.order_express.address || ''}}</text>
+						</view>
+					</view>
+					<view style="margin-top: 104upx; display: flex; align-items: center; justify-content: center;">
+						<!-- 衣服 -->
+						<view v-if="goods.used_applets == '3' || goods.used_applets == '2'" style="width: 187upx; position: relative; border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+							<image style="width: 128upx; padding: 23upx 0; height: 141upx; margin:auto; display: block;position: relative;" :src="goods.goods.front_image" mode="widthFix"></image>
+							<image style="width: 47upx; height: 63upx; position: absolute; top: 61upx; left: 70upx;" :src="goods.works_image + '?x-oss-process=image/resize,lfit,w_132'" mode="widthFix"></image>
+						</view>
+						<!-- 手机壳 -->
+						<view v-if="goods.used_applets == '4'" style="width: 187upx; position: relative; border-radius: 10upx;" :style="{background: goods.goods.design_color }" @click="previewImg(goods,0)">
+							<view style="width: 128upx; height: 141upx;padding: 38upx 0; margin:auto; display: block; position: relative; overflow: hidden;">
+								<image style="width: 128upx; height: 141upx; margin:auto; display: block;position: relative; z-index: 10;"
+								:src="goods.goods.front_image" mode="aspectFit"></image>
+								<image style="width: 128upx; height: 141upx; position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; z-index:8;" 
+								:src="goods.works_image + '?x-oss-process=image/resize,lfit,w_300'" mode="widthFix"></image>
+							</view>
+						</view>
+						<view style="margin-left: 19upx; margin-top: 5upx;">
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;">
+								<text> 订单编号: </text>
+								<text style="color: #888888;"> {{goods.id || ''}} </text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF; margin-top: 15upx;">
+								<text> 产品信息: </text>
+								<text style="color: #888888;">
+									{{goods.order_goods.goods_name || ''}}
+									<text v-if="goods.used_applets != '4'">{{goods.order_goods.goods_specs || ''}} </text>
+								</text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+								<text> 支付金额: </text>
+								<text style="color: #888888;"> ¥{{goods.real_amount || ''}} </text>
+							</view>
+							<view style="font-size: 24upx; font-weight: 400; color: #FFFFFF;margin-top: 15upx;">
+								<text> 下单时间: </text>
+								<text style="color: #888888;"> {{goods.create_time || ''}} </text>
+							</view>
+						</view>
+					</view>
+				</view>
+				<!-- <view style="font-size: 24upx; font-weight: 400; color: #CCCCCC; text-align: center;">
+					<view v-if="goods.status.value == 3 && type != 1" @click="callPhone()">客服电话:0755-28307302</view>
+				</view> -->
+			</view>
+		</view>
+		<view style="margin-top: -50upx;text-align: center;color: #888888;font-size: 24upx; font-weight: 400;">
+			下拉可获取打印最新状态
+		</view>
+	</view>
+</template>
+
+<script>
+	import homeservice from '@/service/homeservice.js'
+	export default {
+		components: {},
+		computed: {},
+		data() {
+			return {
+				goods: {},
+				queryPage: {
+					s: 'Order.detail',
+					id: null
+				},
+				machine_id:null,
+				type:null ,//1:配送版,2:单机版,3:自助版
+				pixelRate:null,//屏幕宽度比率
+				bgHeight:null,
+				bgWidth:null,
+				editory:null,
+				editorWidth:null,
+				editorHeight:null,
+				zoomratio:null,
+			};
+		},
+		methods: {
+			callPhone (phone) {
+				uni.makePhoneCall({
+					phoneNumber: '0755-28307302'
+				})
+			},
+			previewImg(goods, index) {
+				let img = goods.works_image
+				uni.previewImage({
+					current: index,
+					urls: [img]
+				});
+			},
+			loadData() {
+				uni.showLoading({
+					title: '正在加载中...'
+				})
+				homeservice.WorksList(this.queryPage).then(result => {
+					this.goods = result
+					// <!-- result.status.value 订单状态 0:等待生产,1:生产中,2: 生产完成,3:取消生产,4:出料中(弃用),5: 等待取料(弃用),
+					// 6:待入货(弃用),7:取货完成,8:已发货,9:订单完成 -->
+					//result.type.value 1直营配送站 2 万能通用版 3色彩自助站
+					// result.status.value = 7
+					// result.type.value = 3
+					this.type = result.type.value
+					if(result.status.value == 0){
+						if(result.type.value == 1){
+							// wx.setNavigationBarTitle({title: '等待生产' })
+							wx.setNavigationBarTitle({title: '打印中' })
+						}
+						// 缩放比率
+						this.zoomratio = 103 / this.bgWidth
+						this.bgWidth = 103
+					}else if(result.status.value == 1){
+						wx.setNavigationBarTitle({title: '打印中' })
+						// 缩放比率
+						this.zoomratio = 103 / this.bgWidth
+						this.bgWidth = 103
+					}else if(result.status.value == 2){
+						wx.setNavigationBarTitle({title: '打印完成' })
+						if(result.type.value == 1){
+							wx.setNavigationBarTitle({title: '等待发货' })
+						}
+						// 缩放比率
+						this.zoomratio = 103 / this.bgWidth
+						this.bgWidth = 103
+					}else if(result.status.value == 3){
+						wx.setNavigationBarTitle({title: '订单取消' })
+						if(result.type.value == 1){
+							wx.setNavigationBarTitle({title: '等待发货' })
+						}
+						// 缩放比率
+						this.zoomratio = 64 / this.bgWidth
+						this.bgWidth = 64
+					}else if(result.status.value == 7){
+						wx.setNavigationBarTitle({title: '打印完成' })
+						if(result.type.value == 1){
+							wx.setNavigationBarTitle({title: '等待发货' })
+						}
+						// 缩放比率
+						this.zoomratio = 64 / this.bgWidth
+						this.bgWidth = 64
+					}else if(result.status.value == 8){
+						wx.setNavigationBarTitle({title: '已发货' })
+					}else if(result.status.value == 9){
+						wx.setNavigationBarTitle({title: '收货成功' })
+					}
+					// 读取背景图
+					uni.getImageInfo({
+						src: this.goods.goods.front_image,
+						success: (front_image) => {
+							this.bgHeight = front_image.height * (this.bgWidth / front_image.width) // 画布高度
+							this.editory = this.goods.goods.center_scale *  (this.bgWidth / front_image.width) //设计图位置
+							console.log(this.editory)
+						}
+					})
+					this.editorWidth = this.goods.goods.design_width * this.pixelRate * this.zoomratio
+					this.editorHeight = this.goods.goods.design_height * this.pixelRate * this.zoomratio
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({
+						title: err.msg || err.data,
+						icon: 'none'
+					});
+				});
+			}
+		},
+		onPullDownRefresh() {
+			this.editory = null
+			// 获取屏幕宽高
+			var that = this
+			wx.getSystemInfo({
+				success: function(res) {
+					that.pixelRate = res.windowWidth / 750 // 屏幕宽度比率
+					that.bgWidth = res.windowWidth // 画布宽度
+					that.bgHeight = res.windowHeight // 画布高度 高度比率
+					that.loadData();
+				},
+			})
+		},
+		onLoad(options) {
+			console.log(options)
+			// orderId=161104445900004798&type=null&machine_id=100028
+			this.queryPage.id = options.orderId
+			this.type = options.type
+			this.machine_id = options.machine_id
+			// 获取屏幕宽高
+			var that = this
+			wx.getSystemInfo({
+				success: function(res) {
+					that.pixelRate = res.windowWidth / 750 // 屏幕宽度比率
+					that.bgWidth = res.windowWidth // 画布宽度
+					that.bgHeight = res.windowHeight // 画布高度 高度比率
+					that.loadData();
+				},
+			})
+		},
+		onShow() {
+			
+		},
+		onUnload() {
+			// 色彩公园
+			let pages = getCurrentPages();
+			if(pages[pages.length - 2].route == "pages/mine/order"){
+				// uni.switchTab({ url: '../index/mall'})
+				wx.navigateBack({
+				  delta: 4
+				})
+			}else if(pages[pages.length - 2].route == "pages/index/mall"){
+				uni.switchTab({ url: '../index/mall'})
+			}else if(pages[pages.length - 2].route == "pages/index/index"){
+				uni.navigateTo({url: '../mall/machineDetail?machine_id=' + this.machine_id});
+			}else if(pages[pages.length - 2].route == "pages/mine/myorder"){
+				uni.navigateTo({url: 'pages/mine/myorder'});
+			}else{
+				uni.switchTab({ url: '../index/mine'})
+			}
+			
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		background: #131319 !important;
+		color: #fff;
+	}
+
+	.stepsmain {
+		margin: 0upx 30upx 87upx;
+		padding: 20upx 20upx;
+		background: #282932;
+		border-radius: 10upx;
+	}
+
+	.steps {
+		position: relative;
+		counter-reset: step;
+		/*创建步骤数字计数器*/
+		overflow: hidden;
+	}
+
+	/*步骤描述*/
+	.steps .li {
+		list-style-type: none;
+		font-size: 12px;
+		text-align: center;
+		width: calc(100% / 6);
+		position: relative;
+		float: left;
+
+		.steps_img {
+			position: relative;
+			z-index: 9;
+			border: 1upx solid #FFFFFF;
+			background: #282932;
+			width: 56upx;
+			height: 56upx;
+			border-radius: 50%;
+			margin: auto;
+
+			.steps_image {
+				width: 27upx;
+				height: 27upx;
+				margin: 15upx auto;
+			}
+		}
+
+		.steps_text {
+			text-align: center;
+			font-size: 24upx;
+			font-weight: 400;
+			color: #888888;
+			margin-top: 15upx;
+		}
+	}
+
+	.steps .li.active .steps_img{
+		background: #5CE6B5;
+		border: 1upx solid #5CE6B5;
+	}
+	.steps .li.red .steps_img{
+		background: #F56464;
+		border: 1upx solid #F56464;
+	}
+
+	/*连接线*/
+	.steps .li~.li:after {
+		content: '';
+		width: 100%;
+		height: 1px;
+		background-color: #fff;
+		position: absolute;
+		left: -50%;
+		top: 15px;
+		z-index: 1;
+		/*放置在数字后面*/
+	}
+	.steps .li.red ~ .li.red:after {
+	  background-color: #F56464;
+	}
+	.steps .li.red ~ .li.active:after {
+	  background-color: #F56464;
+	}
+	.steps .li.red ~ .li.wait:after {
+	  background-color: #F56464;
+	}
+	.steps .li.active ~ .li.wait:after {
+	  background-color: #5CE6B5;
+	}
+	.steps .li.wait ~ .li.wait:after {
+	  background-color: #B6B6B6;
+	}
+</style>
diff --git a/pages/sunburst/index.vue b/pages/sunburst/index.vue
new file mode 100644
index 0000000..993bc23
--- /dev/null
+++ b/pages/sunburst/index.vue
@@ -0,0 +1,137 @@
+<template>
+	<view class="qiun-columns">
+		<!-- <view class="qiun-bg-white qiun-title-bar qiun-common-mt">
+			<view class="qiun-title-dot-light">饼状图</view>
+		</view> -->
+		<view class="qiun-charts">
+			<canvas canvas-id="canvasPie" id="canvasPie" class="charts" @touchstart="touchPie"></canvas>
+		</view>
+	</view>
+</template>
+<script>
+	
+	import uCharts from '@/js_sdk/u-charts/u-charts.js';
+	var _self;
+	var canvaPie = null;
+	export default {
+		data() {
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				serverData: '',
+			}
+		},
+		onLoad() {
+			_self = this;
+			this.cWidth = uni.upx2px(750);
+			this.cHeight = uni.upx2px(500);
+			this.getServerData();
+		},
+		methods: {
+			getServerData() {
+				let Pie = {
+					series: [
+						{"name": "黄色","data": 50,color: "#ffa974"}, 
+						{"name": "白色","data": 30,color: "#8543e0"}, 
+						{"name": "粉色","data": 20,color: "#90ed7d"}, 
+						{"name": "黑色","data": 18,color: "#ffa974"}, 
+						{"name": "蓝色","data": 8,color: "#2fc25b"},
+					]
+				};
+				_self.showPie("canvasPie", Pie);
+			},
+			showPie(canvasId, chartData) {
+				canvaPie = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'pie',
+					fontSize: 11,
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					legend:false,//图例设置,是否显示图表下方各类别的标识
+					dataLabel: false,//是否在图表中显示数据标签内容值
+					dataPointShape: false,//是否在图表中显示数据点图形标识
+					extra: {
+						pie: {
+							lableWidth: 15
+						}
+					},
+				});
+			},
+			touchPie(e) {
+				canvaPie.showToolTip(e, {
+					format: function(item) {
+						//console.log(item)
+						return item.name + ':' + item.data
+					}
+				});
+				
+			},
+		}
+	}
+</script>
+<style>
+	page {
+		background: #F2F2F2;
+		width: 750upx;
+		overflow-x: hidden;
+	}
+
+	.qiun-padding {
+		padding: 2%;
+		width: 96%;
+	}
+
+	.qiun-wrap {
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.qiun-rows {
+		display: flex;
+		flex-direction: row !important;
+	}
+
+	.qiun-columns {
+		display: flex;
+		flex-direction: column !important;
+	}
+
+	.qiun-common-mt {
+		margin-top: 10upx;
+	}
+
+	.qiun-bg-white {
+		background: #FFFFFF;
+	}
+
+	.qiun-title-bar {
+		width: 96%;
+		padding: 10upx 2%;
+		flex-wrap: nowrap;
+	}
+
+	.qiun-title-dot-light {
+		border-left: 10upx solid #0ea391;
+		padding-left: 10upx;
+		font-size: 32upx;
+		color: #000000
+	}
+
+	.qiun-charts {
+		width: 750upx;
+		height: 500upx;
+		background-color: #FFFFFF;
+	}
+
+	.charts {
+		width: 750upx;
+		height: 500upx;
+		background-color: #FFFFFF;
+	}
+</style>
diff --git a/project.config.json b/project.config.json
new file mode 100644
index 0000000..8f8233d
--- /dev/null
+++ b/project.config.json
@@ -0,0 +1,28 @@
+{
+  "appid": "wxdca8810ccd426633",
+  "compileType": "miniprogram",
+  "libVersion": "3.1.5",
+  "packOptions": {
+    "ignore": [],
+    "include": []
+  },
+  "setting": {
+    "coverView": true,
+    "es6": true,
+    "postcss": true,
+    "minified": true,
+    "enhance": true,
+    "showShadowRootInWxmlPanel": true,
+    "packNpmRelationList": [],
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    }
+  },
+  "condition": {},
+  "editorSetting": {
+    "tabIndent": "insertSpaces",
+    "tabSize": 2
+  }
+}
\ No newline at end of file
diff --git a/project.private.config.json b/project.private.config.json
new file mode 100644
index 0000000..808eba4
--- /dev/null
+++ b/project.private.config.json
@@ -0,0 +1,8 @@
+{
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+  "projectname": "wechat_phone",
+  "setting": {
+    "compileHotReLoad": true,
+    "urlCheck": false
+  }
+}
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..ea786ff
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1 @@
+readme
\ No newline at end of file
diff --git a/service/AddressService.js b/service/AddressService.js
new file mode 100644
index 0000000..f37d824
--- /dev/null
+++ b/service/AddressService.js
@@ -0,0 +1,60 @@
+import {
+	_queryAddressList,
+	_queryAddress,
+	_deleteAddress,
+	_updateAddress,
+	_saveAddress
+} from '../api/AddressApi'
+import {
+	_queryPage,
+	_queryList,
+	_query,
+	_save,
+	_delete,
+	_update,
+	_getters,
+	_dispatch
+} from './BaseService'
+
+const service = {
+	/**
+	 * queryAddressList			查询商品内容
+	 */
+	queryAddressList: (address = {}) => _queryList({
+		api: _queryAddressList,
+		params: address,
+		callBack: (data = {}) => {}
+	}),
+	queryAddress: (address = {}) => _query({
+		api: _queryAddress,
+		params: address,
+		callBack: (data = {}) => {}
+	}),
+	deleteAddress: (address = {}) => _delete({
+		api: _deleteAddress,
+		params: address,
+		callBack: (data = {}) => {}
+	}),
+	updaetAddress: (address = {}) => _update({
+		api: _updateAddress,
+		params: address,
+		callBack: (data = {}) => {}
+	}),
+	savAddress: (address = {}) => _save({
+		api: _saveAddress,
+		params: address,
+		callBack: (data = {}) => {}
+	}),
+	buildAddress: (params = {}) => {
+		return {
+			receivor: params.receivor, // 收货人名称
+			phone: params.phone, // 手机号
+			province: params.province, // 省份/直辖市
+			city: params.city, // 城市
+			county: params.county, // 区
+			detail: params.detail,// 详细地址(街道)
+			is_default: params.is_default, // 是否为默认
+		}
+	}
+}
+export default service
\ No newline at end of file
diff --git a/service/BaseService.js b/service/BaseService.js
new file mode 100644
index 0000000..01fd695
--- /dev/null
+++ b/service/BaseService.js
@@ -0,0 +1,132 @@
+import $n from '../util/nothing'
+import $store from '../store'
+import Enums from '../util/Enums'
+
+/**
+ * vuex Store 的 action 调用
+ * @param {*} action 调用的action名
+ * @param {*} params 参数
+ */
+export function _dispatch (action, params) {
+  return $store.dispatch(action, params)
+}
+/**
+ * vuex Store 的 getters 引用
+ * @param {*} getters Store中引用的getters属性名
+ * @param {*} defaultValue 默认值(结果为空时)
+ */
+export  function  _getters (getters, defaultValue = null) {
+  return $n._ifNull($store.getters[getters], defaultValue)
+}
+/**
+ * 基于Promise调用API
+ * @param {*}
+ */
+export function _callAPI ({callFun = Function, callParams = [], callBack, resultType = Enums.DataType.JSON} = {}) {
+  return new Promise((resolve, reject) => {
+    callFun(...callParams).then(({ code, count, data, per_page, msg}) => {
+      if (code === 0) {
+        data = $n._caseValue(
+          resultType,
+          Enums.DataType.JSON, $n._ifNull(data, {}),
+          Enums.DataType.ARRAY, $n._ifNull(data, []),
+          Enums.DataType.DATE, $n._isNotNull(data) ? new Date(data) : null,
+          Enums.DataType.STRING, $n._ifNull(data, null),
+          Enums.DataType.NUMBER, Number($n._ifNull(data, 0)),
+          data
+        )
+        if (callBack) callBack(data)
+        resolve(data)
+      } else throw {code:code,data:data,msg:msg} || '执行 [' + callFun.name + '] 发生未知错误.'
+    }).catch(err => reject(err))
+  })
+}
+
+/**
+ * 基于Promise调用API
+ * @param {*}
+ */
+// export function _callAPIone ({callFun = Function, callParams = [], callBack, resultType = Enums.DataType.JSON} = {}) {
+//   return new Promise((resolve, reject) => {
+//     callFun(...callParams).then(({ code, count, data, per_page, msg,total}) => {
+//       if (code === 0) {
+//         data = $n._caseValue(
+//           resultType,
+//           Enums.DataType.JSON, $n._ifNull(data, {}),
+//           Enums.DataType.ARRAY, $n._ifNull(data, []),
+//           Enums.DataType.DATE, $n._isNotNull(data) ? new Date(data) : null,
+//           Enums.DataType.STRING, $n._ifNull(data, null),
+//           Enums.DataType.NUMBER, Number($n._ifNull(data, 0)),
+// 		  code,
+//           data,
+// 		  count,
+// 		  per_page,
+// 		  msg,
+// 		  total
+//         )
+//         if (callBack) callBack({code:code,count:count,data:data,per_page:per_page,msg:msg,total:total})
+//         resolve({code:code,count:count,data:data,per_page:per_page,msg:msg,total:total})
+//       } else throw {code:code,data:data,msg:msg} || '执行 [' + callFun.name + '] 发生未知错误.'
+//     }).catch(err => reject(err))
+//   })
+// }
+
+/**
+ * 查询
+ * @param {*}
+ */
+export function _query ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
+  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
+}
+
+
+/**
+ * 修改
+ * @param {*}
+ */
+export function _update ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
+  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
+}
+/**
+ * 保存
+ * @param {*}
+ */
+export function _save ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
+  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
+}
+/**
+ * 删除
+ * @param {*}
+ */
+export function _delete ({api, params, callBack, resultType = Enums.DataType.JSON} = {}) {
+  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
+}
+/**
+ * 调用动作
+ * @param {*}
+ */
+export function _callAction ({api, params, callBack, resultType = Enums.DataType.JSON, action = null} = {}) {
+  console.warn('############# Action: ', action)
+  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
+}
+/**
+ * 列表查询
+ * @param {*}
+ */
+export function _queryList ({api, params, callBack, resultType = Enums.DataType.ARRAY} = {}) {
+  return _callAPI({callFun: api, callParams: [params], callBack, resultType})
+}
+/**
+ * 分页查询
+ * @param {*}
+ */
+export function _queryPage ({api, params, page, callBack, resultType = Enums.DataType.JSON} = {}) {
+  return _callAPI({callFun: api, callParams: [params, page], callBack, resultType})
+}
+/**
+ * 流式分页查询
+ * @param {*}
+ */
+export function _queryFlowPage ({api, params, page, callBack, resultType = Enums.DataType.JSON} = {}) {
+  return _callAPI({callFun: api, callParams: [params, page], callBack, resultType})
+}
diff --git a/service/UserService.js b/service/UserService.js
new file mode 100644
index 0000000..1715a73
--- /dev/null
+++ b/service/UserService.js
@@ -0,0 +1,74 @@
+import {
+	_login,
+	// _queryUser,
+	_refreshToken
+} from '../api/UserApi'
+import {
+	_query,
+	_getters,
+	_dispatch
+} from './BaseService'
+import Cache from '@/cache'
+
+const service = {
+	/**
+	 * 解析为本地使用格式
+	 * @param goods
+	 */
+	parseL: (goods = {}) => {
+	  return goods;
+	},
+	cacheAppUser: (appUser) => Cache.setSync(Cache.$Keys.app.APP_USER, appUser),				// 缓存app信息
+	cacheWxInfo: (wxInfo) => Cache.setSync(Cache.$Keys.app.WX_INFO, wxInfo),					// 缓存微信信息
+	cacheUserInfo: (userInfo) => Cache.setSync(Cache.$Keys.app.USER_INFO, userInfo),			// 缓存用户信息
+	getCacheAppUser: () => Cache.getSync(Cache.$Keys.app.APP_USER),								// 获取缓存中的app信息
+	getCacheWxInfo: () => Cache.getSync(Cache.$Keys.app.wxInfo),								// 获取缓存中的微信信息
+	getCacheUserInfo: () => Cache.getSync(Cache.$Keys.app.USER_INFO),							// 获取缓存中的用户信息
+	setAppUser: (appUser = {}) => _dispatch('setAppUser', {
+		openid: appUser.openId,
+		token: appUser.token,
+		tokenHead: appUser.tokenHead,
+		userid: appUser.memberId,
+		currentTime: new Date().getTime()
+	}),																							// 保存aap信息到store中
+	setToken: (token = null) => _dispatch('setToken', token),									// 设置新Token到store中
+	setUserInfo: (user = {}) => _dispatch('setUserInfo', user),									// 保存用户信息到store中
+	setWxInfo: (wxInfo = {}) => _dispatch('setWxInfo', wxInfo), 								// 保存微信信息到store中
+	getAppUser: () => _getters('appUser', {}), 													// 获取store中的app信息
+	getWxInfo: () => _getters('wxInfo', {}), 													// 获取store中的微信信息
+	getUserInfo: () => _getters('userInfo', {}),												// 获取store中的用户信息
+	/**
+	 * login			登录
+	 * queryUser		查询用户信息
+	 * refreshToken		刷新用户Token
+	 */
+	login: (user = {}) => _query({api: _login, params: user, callBack: (data = {}) => {
+		service.setAppUser(data);
+		service.cacheAppUser(service.getAppUser());
+		service.setUserInfo(data);
+		service.cacheUserInfo(service.getUserInfo());
+	}}),
+	// queryUser: (id = null) => _query({api: _queryUser, params: id, callBack: (data = {}) => {
+	// 	service.setUserInfo(data);
+	// 	service.cacheUserInfo(service.getUserInfo());
+	// }}),
+	// refreshToken: (oldToken = null) => _query({api: _refreshToken, params: oldToken, callBack: (data = {}) => {
+	// 	service.setToken(service.getAppUser().tokenHead + data);
+	// 	service.cacheAppUser(service.getAppUser());
+	// }}),
+}
+
+export default service
+
+// 接口解读
+/**
+ * 	登录接口
+ * url:'/userphoneapplets/index'
+ * query:{s: 'Init.init',code: ,nickname: ,gender:,portrait: ,encryptedData:,iv:,promoter_id:machine_id:}
+ */
+
+
+
+
+
+
diff --git a/service/homeservice.js b/service/homeservice.js
new file mode 100644
index 0000000..30dbdc1
--- /dev/null
+++ b/service/homeservice.js
@@ -0,0 +1,165 @@
+import {
+	route,
+	T_route,
+	route_timeout,
+	usertshirtsapplets,
+	userapalets_Index,
+	route_CreateOrder
+} from '../api/homeApi.js'
+import {
+	_query,
+	_queryPage,
+	_queryList,
+	_getters,
+	_dispatch
+} from './BaseService'
+const service = {
+	setGoodsCateList: (goodsCateList = []) => _dispatch('setGoodsCateList', goodsCateList),			// 保存分类信息到store中
+	getGoodsCateList: () => _getters('goodsCateList', []),											// 获取store中的分类信息
+	setCate: (cate = {}) => _dispatch('setCate', cate),												// 作品绘制成功
+	getCate: () => _getters('cate', {}),
+	setSnapshot: (snapshot = {}) => _dispatch('setSnapshot', snapshot),	 //diy操作步骤图						
+	getSnapshot: () => _getters('snapshot', []),
+	setStock: (stock = []) => _dispatch('setStock', stock),	 //diy操作步骤图
+	getStock: () => _getters('stock', []),
+	// Ad.list 获取广告
+	// Account.newOrder 个人最新消费记录
+	// Machine.shopList  获取附件店铺
+	// User.recommendUser 推荐设计师
+	// Works.category 作品分类
+	// Material.category 贴图分类
+	queryList: (user = {}) => _queryList({api: route, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 作品 Works.list// 我的作品 Works.mylist// 作品详情 Works.detail 作品分类 Works.category
+	WorksList: (user = {}) => _queryList({api: route, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 创建作品
+	Workssave: (user = {}) => _queryList({api: route_timeout, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 拿到的信息提交到这个接口
+	DeviceAccesscreate: (user = {}) => _queryList({api: T_route, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 获取该手机型号对应的商品信息 ​/userapplets​/index​/index#DeviceAccess.getModelGoods
+	DeviceAccessgetModelGoods: (user = {}) => _queryList({api: T_route, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 获取该手机型号对应的商品信息 
+	userapaletsIndex: (user = {}) => _queryList({api: userapalets_Index, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 刷图案游戏接口:
+	// 接口1-获取图案游戏作品列表:
+	// s=Works.gameWorksList
+	gameWorksList: (user = {}) => _queryList({api: usertshirtsapplets, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 接口1-单个图案游戏的数据:
+	// s=Works.gameWorks
+	gameWorks: (user = {}) => _queryList({api: usertshirtsapplets, params: user, callBack: (data = {}) => {
+		
+	}}),
+	
+	// 获取设备是否开启支付、是否开放材质的接口
+	// /userphoneapplets/index
+	// s=Machine.getBaseSetting
+	// machine_id=100022
+	machineGetBaseSetting: (user = {}) => _queryList({api: route, params: user, callBack: (data = {}) => {
+		
+	}}),
+	// 获取手机壳
+	// /userphoneapplets/index
+	// s=Surface.getAllByCategory
+	// category=0   // 0:定制壳 1:自带壳
+	userphoneappletsIndex: (user = {}) => _queryList({api: route, params: user, callBack: (data = {}) => {
+		
+	}}),
+	
+	// 创建订单
+	CreateOrder: (user = {}) => _queryList({api: route_CreateOrder, params: user, callBack: (data = {}) => {
+		
+	}}),
+	
+	
+	// 4)获取色彩的接口
+	// /userphoneapplets/index
+	// s=Surface.getAllColorSeries
+	
+	
+	// 5)根据设备编号和商品编号获取材质列表
+	// /userphoneapplets/index
+	// s=Surface.getColorBySeries
+	// color_series_id=2
+	
+	
+}
+export default service
+/**
+ * url:/userphoneapplets/index
+ * 
+ * 获取附件店铺
+ * query:{s: 'Machine.shopList',longitude: ,latitude: ,distance:}
+ * 个人最新消费记录
+ * query:{s: 'Account.newOrder'}
+ * 获取首页广告
+ * query:{s: 'Ad.list'}
+ * 设备轮播图
+ * query:{s: 'Ad.list',ad_position_key: 'phone_shell_index',machine_id:}
+ * 获取手机壳品牌数据
+ * query:{s: 'product.find',machine_id:,key:}
+ * 释放锁定库存
+ * query:{s: 'Order.newLockAttrStock',machine_id:,goods_id:null, dict_id:null,old_sn:null,onlyClear:1}
+ * 锁定库存
+ * query:{s: 'Order.newLockAttrStock',machine_id:,goods_id:,dict_id:,old_sn:}
+ * 设备详情
+ * query:{s: 'machine.detail',machine_id: }
+ * 保存作品
+ * query:{s: 'Works.save',components: components,works_id: ,goods_id: ,template: ,template_price: ,template_user_id: ,user_id: ,platform: 3,shape_image: ,shape_id:,shape_price:,machine_id:,background_color:,}
+ * 创建订单
+ * query:{s: 'Order.create',type: this.key,machine_id: ,goods_id: ,works_id: ,channel_no: ,dict_id: ,goods_size: ,works_num: ,shop_id: ,sn: ,coupon_id: ,user_address: }
+ * 作品详情
+ * query:{s: 'Works.detail',id: }
+ * 贴图详情
+ * query:{s: 'Material.detail',id: }
+ * 获取产品详情数据
+ * query:{s: 'Product.detail',id: }
+ * 形状图分类
+ * query:{s: 'Material.getShapeCategory','machine_id': null }
+ * 贴图分类
+ * query:{s: 'Material.category','machine_id': null}
+ * 查询货到库存
+ * query:{s: 'Product.getMachineProduct',machine_id:}
+ * 字体列表
+ * query:{s: 'Material.fontFamilyList'}
+ * 形状图列表
+ * query: {s: 'Material.getShapeList',page: 1,per_page: 50,shape_category_id: null,goods_category_id:null,total: 0,machine_id: null,}
+ * 贴图列表
+ * query:{s: 'Material.list',page: 1,per_page: 50,is_revise: 1,is_edit: 1,total: 0,is_new: null,is_hot: null ,machine_id: null, }
+ * 获取设备打印排队列表
+ * query:{s:'Machine.wait',machine_id:null,}
+ * 获取通知提醒配置
+ * {s:'Qrcode.getSubscribeTemplate'}
+ * 获取库存与优惠券信息
+ * {s: 'Machine.getMachineStock',machine_id:,key: }
+ * 订单页面-获取可以下单的设备列表
+ * {s: 'Machine.shopList',longitude: ,latitude: ,status:[1,2],distance:,goods_id:}
+ * 查询商品属性-----配送模式用
+ * {s: 'machine.getProductAttribute',goods_id: options.goods_id}
+ * 订单详情
+ * {s: 'Order.detail',id: null}
+ * 查询订单状态
+ * {s:'Order.orderStatus',order_id:}
+ * 查询订单排队情况
+ * {s:'Order.orderRanking',order_id:,machine_id:}
+*/
+
+/**
+ * url:/userapplets​/index​/index,
+ * 获取该手机型号对应的商品信息
+ * query:{s : 'DeviceAccess.getModelGoods',machine_id :,brand :,model:}
+ * 记录用户手机配置信息
+ * query:{s :'DeviceAccess.create'}
+*/
\ No newline at end of file
diff --git a/static/bizhi.png b/static/bizhi.png
new file mode 100644
index 0000000..14c1d37
Binary files /dev/null and b/static/bizhi.png differ
diff --git a/static/color.png b/static/color.png
new file mode 100644
index 0000000..25f5203
Binary files /dev/null and b/static/color.png differ
diff --git a/static/delete-active.png b/static/delete-active.png
new file mode 100644
index 0000000..36fb3d9
Binary files /dev/null and b/static/delete-active.png differ
diff --git a/static/delete.png b/static/delete.png
new file mode 100644
index 0000000..2f1bfd3
Binary files /dev/null and b/static/delete.png differ
diff --git a/static/dise.png b/static/dise.png
new file mode 100644
index 0000000..c9df785
Binary files /dev/null and b/static/dise.png differ
diff --git a/static/diy.png b/static/diy.png
new file mode 100644
index 0000000..449ed84
Binary files /dev/null and b/static/diy.png differ
diff --git a/static/diy_icon_middle_default.png b/static/diy_icon_middle_default.png
new file mode 100644
index 0000000..ad580af
Binary files /dev/null and b/static/diy_icon_middle_default.png differ
diff --git a/static/diy_icon_replace_default.png b/static/diy_icon_replace_default.png
new file mode 100644
index 0000000..63b2339
Binary files /dev/null and b/static/diy_icon_replace_default.png differ
diff --git a/static/font-awesome/font-awesome.css b/static/font-awesome/font-awesome.css
new file mode 100644
index 0000000..9e0c2be
--- /dev/null
+++ b/static/font-awesome/font-awesome.css
@@ -0,0 +1,2342 @@
+/* This stylesheet generated by Transfonter (https://transfonter.org) on March 30, 2018 3:15 AM */
+
+@font-face {
+    font-family: 'FontAwesome';
+    /* src: url('FontAwesome.eot'); */
+    font-weight: normal;
+    font-style: normal;
+}
+@font-face {
+    font-family: 'FontAwesome';
+    src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'),
+        url(data:application/font-woff;charset=utf-8;base64,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) format('woff');
+        /* url('FontAwesome.ttf') format('truetype'), */
+        /* url('FontAwesome.svg#FontAwesome') format('svg'); */
+    font-weight: normal;
+    font-style: normal;
+}
+
+.fa {
+  display: inline-block;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.33333333em;
+  line-height: 0.75em;
+  vertical-align: -15%;
+}
+.fa-2x {
+  font-size: 2em;
+}
+.fa-3x {
+  font-size: 3em;
+}
+.fa-4x {
+  font-size: 4em;
+}
+.fa-5x {
+  font-size: 5em;
+}
+.fa-fw {
+  width: 1.28571429em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.14285714em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.14285714em;
+  width: 2.14285714em;
+  top: 0.14285714em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.85714286em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.fa-pull-left {
+  float: left;
+}
+.fa-pull-right {
+  float: right;
+}
+.fa.fa-pull-left {
+  margin-right: .3em;
+}
+.fa.fa-pull-right {
+  margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+  animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+  animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+  -webkit-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  filter: none;
+}
+.fa-stack {
+  position: relative;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  text-align: center;
+}
+.fa-stack-1x {
+  line-height: inherit;
+}
+.fa-stack-2x {
+  font-size: 2em;
+}
+.fa-inverse {
+  color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-glass:before {
+  content: "\f000";
+}
+.fa-music:before {
+  content: "\f001";
+}
+.fa-search:before {
+  content: "\f002";
+}
+.fa-envelope-o:before {
+  content: "\f003";
+}
+.fa-heart:before {
+  content: "\f004";
+}
+.fa-star:before {
+  content: "\f005";
+}
+.fa-star-o:before {
+  content: "\f006";
+}
+.fa-user:before {
+  content: "\f007";
+}
+.fa-film:before {
+  content: "\f008";
+}
+.fa-th-large:before {
+  content: "\f009";
+}
+.fa-th:before {
+  content: "\f00a";
+}
+.fa-th-list:before {
+  content: "\f00b";
+}
+.fa-check:before {
+  content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+  content: "\f00d";
+}
+.fa-search-plus:before {
+  content: "\f00e";
+}
+.fa-search-minus:before {
+  content: "\f010";
+}
+.fa-power-off:before {
+  content: "\f011";
+}
+.fa-signal:before {
+  content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+  content: "\f013";
+}
+.fa-trash-o:before {
+  content: "\f014";
+}
+.fa-home:before {
+  content: "\f015";
+}
+.fa-file-o:before {
+  content: "\f016";
+}
+.fa-clock-o:before {
+  content: "\f017";
+}
+.fa-road:before {
+  content: "\f018";
+}
+.fa-download:before {
+  content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+  content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+  content: "\f01b";
+}
+.fa-inbox:before {
+  content: "\f01c";
+}
+.fa-play-circle-o:before {
+  content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+  content: "\f01e";
+}
+.fa-refresh:before {
+  content: "\f021";
+}
+.fa-list-alt:before {
+  content: "\f022";
+}
+.fa-lock:before {
+  content: "\f023";
+}
+.fa-flag:before {
+  content: "\f024";
+}
+.fa-headphones:before {
+  content: "\f025";
+}
+.fa-volume-off:before {
+  content: "\f026";
+}
+.fa-volume-down:before {
+  content: "\f027";
+}
+.fa-volume-up:before {
+  content: "\f028";
+}
+.fa-qrcode:before {
+  content: "\f029";
+}
+.fa-barcode:before {
+  content: "\f02a";
+}
+.fa-tag:before {
+  content: "\f02b";
+}
+.fa-tags:before {
+  content: "\f02c";
+}
+.fa-book:before {
+  content: "\f02d";
+}
+.fa-bookmark:before {
+  content: "\f02e";
+}
+.fa-print:before {
+  content: "\f02f";
+}
+.fa-camera:before {
+  content: "\f030";
+}
+.fa-font:before {
+  content: "\f031";
+}
+.fa-bold:before {
+  content: "\f032";
+}
+.fa-italic:before {
+  content: "\f033";
+}
+.fa-text-height:before {
+  content: "\f034";
+}
+.fa-text-width:before {
+  content: "\f035";
+}
+.fa-align-left:before {
+  content: "\f036";
+}
+.fa-align-center:before {
+  content: "\f037";
+}
+.fa-align-right:before {
+  content: "\f038";
+}
+.fa-align-justify:before {
+  content: "\f039";
+}
+.fa-list:before {
+  content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+  content: "\f03b";
+}
+.fa-indent:before {
+  content: "\f03c";
+}
+.fa-video-camera:before {
+  content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+  content: "\f03e";
+}
+.fa-pencil:before {
+  content: "\f040";
+}
+.fa-map-marker:before {
+  content: "\f041";
+}
+.fa-adjust:before {
+  content: "\f042";
+}
+.fa-tint:before {
+  content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+  content: "\f044";
+}
+.fa-share-square-o:before {
+  content: "\f045";
+}
+.fa-check-square-o:before {
+  content: "\f046";
+}
+.fa-arrows:before {
+  content: "\f047";
+}
+.fa-step-backward:before {
+  content: "\f048";
+}
+.fa-fast-backward:before {
+  content: "\f049";
+}
+.fa-backward:before {
+  content: "\f04a";
+}
+.fa-play:before {
+  content: "\f04b";
+}
+.fa-pause:before {
+  content: "\f04c";
+}
+.fa-stop:before {
+  content: "\f04d";
+}
+.fa-forward:before {
+  content: "\f04e";
+}
+.fa-fast-forward:before {
+  content: "\f050";
+}
+.fa-step-forward:before {
+  content: "\f051";
+}
+.fa-eject:before {
+  content: "\f052";
+}
+.fa-chevron-left:before {
+  content: "\f053";
+}
+.fa-chevron-right:before {
+  content: "\f054";
+}
+.fa-plus-circle:before {
+  content: "\f055";
+}
+.fa-minus-circle:before {
+  content: "\f056";
+}
+.fa-times-circle:before {
+  content: "\f057";
+}
+.fa-check-circle:before {
+  content: "\f058";
+}
+.fa-question-circle:before {
+  content: "\f059";
+}
+.fa-info-circle:before {
+  content: "\f05a";
+}
+.fa-crosshairs:before {
+  content: "\f05b";
+}
+.fa-times-circle-o:before {
+  content: "\f05c";
+}
+.fa-check-circle-o:before {
+  content: "\f05d";
+}
+.fa-ban:before {
+  content: "\f05e";
+}
+.fa-arrow-left:before {
+  content: "\f060";
+}
+.fa-arrow-right:before {
+  content: "\f061";
+}
+.fa-arrow-up:before {
+  content: "\f062";
+}
+.fa-arrow-down:before {
+  content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+  content: "\f064";
+}
+.fa-expand:before {
+  content: "\f065";
+}
+.fa-compress:before {
+  content: "\f066";
+}
+.fa-plus:before {
+  content: "\f067";
+}
+.fa-minus:before {
+  content: "\f068";
+}
+.fa-asterisk:before {
+  content: "\f069";
+}
+.fa-exclamation-circle:before {
+  content: "\f06a";
+}
+.fa-gift:before {
+  content: "\f06b";
+}
+.fa-leaf:before {
+  content: "\f06c";
+}
+.fa-fire:before {
+  content: "\f06d";
+}
+.fa-eye:before {
+  content: "\f06e";
+}
+.fa-eye-slash:before {
+  content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+  content: "\f071";
+}
+.fa-plane:before {
+  content: "\f072";
+}
+.fa-calendar:before {
+  content: "\f073";
+}
+.fa-random:before {
+  content: "\f074";
+}
+.fa-comment:before {
+  content: "\f075";
+}
+.fa-magnet:before {
+  content: "\f076";
+}
+.fa-chevron-up:before {
+  content: "\f077";
+}
+.fa-chevron-down:before {
+  content: "\f078";
+}
+.fa-retweet:before {
+  content: "\f079";
+}
+.fa-shopping-cart:before {
+  content: "\f07a";
+}
+.fa-folder:before {
+  content: "\f07b";
+}
+.fa-folder-open:before {
+  content: "\f07c";
+}
+.fa-arrows-v:before {
+  content: "\f07d";
+}
+.fa-arrows-h:before {
+  content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+  content: "\f080";
+}
+.fa-twitter-square:before {
+  content: "\f081";
+}
+.fa-facebook-square:before {
+  content: "\f082";
+}
+.fa-camera-retro:before {
+  content: "\f083";
+}
+.fa-key:before {
+  content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+  content: "\f085";
+}
+.fa-comments:before {
+  content: "\f086";
+}
+.fa-thumbs-o-up:before {
+  content: "\f087";
+}
+.fa-thumbs-o-down:before {
+  content: "\f088";
+}
+.fa-star-half:before {
+  content: "\f089";
+}
+.fa-heart-o:before {
+  content: "\f08a";
+}
+.fa-sign-out:before {
+  content: "\f08b";
+}
+.fa-linkedin-square:before {
+  content: "\f08c";
+}
+.fa-thumb-tack:before {
+  content: "\f08d";
+}
+.fa-external-link:before {
+  content: "\f08e";
+}
+.fa-sign-in:before {
+  content: "\f090";
+}
+.fa-trophy:before {
+  content: "\f091";
+}
+.fa-github-square:before {
+  content: "\f092";
+}
+.fa-upload:before {
+  content: "\f093";
+}
+.fa-lemon-o:before {
+  content: "\f094";
+}
+.fa-phone:before {
+  content: "\f095";
+}
+.fa-square-o:before {
+  content: "\f096";
+}
+.fa-bookmark-o:before {
+  content: "\f097";
+}
+.fa-phone-square:before {
+  content: "\f098";
+}
+.fa-twitter:before {
+  content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.fa-feed:before,
+.fa-rss:before {
+  content: "\f09e";
+}
+.fa-hdd-o:before {
+  content: "\f0a0";
+}
+.fa-bullhorn:before {
+  content: "\f0a1";
+}
+.fa-bell:before {
+  content: "\f0f3";
+}
+.fa-certificate:before {
+  content: "\f0a3";
+}
+.fa-hand-o-right:before {
+  content: "\f0a4";
+}
+.fa-hand-o-left:before {
+  content: "\f0a5";
+}
+.fa-hand-o-up:before {
+  content: "\f0a6";
+}
+.fa-hand-o-down:before {
+  content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+  content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+  content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+  content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+  content: "\f0ab";
+}
+.fa-globe:before {
+  content: "\f0ac";
+}
+.fa-wrench:before {
+  content: "\f0ad";
+}
+.fa-tasks:before {
+  content: "\f0ae";
+}
+.fa-filter:before {
+  content: "\f0b0";
+}
+.fa-briefcase:before {
+  content: "\f0b1";
+}
+.fa-arrows-alt:before {
+  content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+  content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+  content: "\f0c1";
+}
+.fa-cloud:before {
+  content: "\f0c2";
+}
+.fa-flask:before {
+  content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+  content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+  content: "\f0c5";
+}
+.fa-paperclip:before {
+  content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+  content: "\f0c7";
+}
+.fa-square:before {
+  content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+  content: "\f0c9";
+}
+.fa-list-ul:before {
+  content: "\f0ca";
+}
+.fa-list-ol:before {
+  content: "\f0cb";
+}
+.fa-strikethrough:before {
+  content: "\f0cc";
+}
+.fa-underline:before {
+  content: "\f0cd";
+}
+.fa-table:before {
+  content: "\f0ce";
+}
+.fa-magic:before {
+  content: "\f0d0";
+}
+.fa-truck:before {
+  content: "\f0d1";
+}
+.fa-pinterest:before {
+  content: "\f0d2";
+}
+.fa-pinterest-square:before {
+  content: "\f0d3";
+}
+.fa-google-plus-square:before {
+  content: "\f0d4";
+}
+.fa-google-plus:before {
+  content: "\f0d5";
+}
+.fa-money:before {
+  content: "\f0d6";
+}
+.fa-caret-down:before {
+  content: "\f0d7";
+}
+.fa-caret-up:before {
+  content: "\f0d8";
+}
+.fa-caret-left:before {
+  content: "\f0d9";
+}
+.fa-caret-right:before {
+  content: "\f0da";
+}
+.fa-columns:before {
+  content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+  content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+  content: "\f0de";
+}
+.fa-envelope:before {
+  content: "\f0e0";
+}
+.fa-linkedin:before {
+  content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+  content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+  content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+  content: "\f0e4";
+}
+.fa-comment-o:before {
+  content: "\f0e5";
+}
+.fa-comments-o:before {
+  content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+  content: "\f0e7";
+}
+.fa-sitemap:before {
+  content: "\f0e8";
+}
+.fa-umbrella:before {
+  content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+  content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+  content: "\f0eb";
+}
+.fa-exchange:before {
+  content: "\f0ec";
+}
+.fa-cloud-download:before {
+  content: "\f0ed";
+}
+.fa-cloud-upload:before {
+  content: "\f0ee";
+}
+.fa-user-md:before {
+  content: "\f0f0";
+}
+.fa-stethoscope:before {
+  content: "\f0f1";
+}
+.fa-suitcase:before {
+  content: "\f0f2";
+}
+.fa-bell-o:before {
+  content: "\f0a2";
+}
+.fa-coffee:before {
+  content: "\f0f4";
+}
+.fa-cutlery:before {
+  content: "\f0f5";
+}
+.fa-file-text-o:before {
+  content: "\f0f6";
+}
+.fa-building-o:before {
+  content: "\f0f7";
+}
+.fa-hospital-o:before {
+  content: "\f0f8";
+}
+.fa-ambulance:before {
+  content: "\f0f9";
+}
+.fa-medkit:before {
+  content: "\f0fa";
+}
+.fa-fighter-jet:before {
+  content: "\f0fb";
+}
+.fa-beer:before {
+  content: "\f0fc";
+}
+.fa-h-square:before {
+  content: "\f0fd";
+}
+.fa-plus-square:before {
+  content: "\f0fe";
+}
+.fa-angle-double-left:before {
+  content: "\f100";
+}
+.fa-angle-double-right:before {
+  content: "\f101";
+}
+.fa-angle-double-up:before {
+  content: "\f102";
+}
+.fa-angle-double-down:before {
+  content: "\f103";
+}
+.fa-angle-left:before {
+  content: "\f104";
+}
+.fa-angle-right:before {
+  content: "\f105";
+}
+.fa-angle-up:before {
+  content: "\f106";
+}
+.fa-angle-down:before {
+  content: "\f107";
+}
+.fa-desktop:before {
+  content: "\f108";
+}
+.fa-laptop:before {
+  content: "\f109";
+}
+.fa-tablet:before {
+  content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+  content: "\f10b";
+}
+.fa-circle-o:before {
+  content: "\f10c";
+}
+.fa-quote-left:before {
+  content: "\f10d";
+}
+.fa-quote-right:before {
+  content: "\f10e";
+}
+.fa-spinner:before {
+  content: "\f110";
+}
+.fa-circle:before {
+  content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+  content: "\f112";
+}
+.fa-github-alt:before {
+  content: "\f113";
+}
+.fa-folder-o:before {
+  content: "\f114";
+}
+.fa-folder-open-o:before {
+  content: "\f115";
+}
+.fa-smile-o:before {
+  content: "\f118";
+}
+.fa-frown-o:before {
+  content: "\f119";
+}
+.fa-meh-o:before {
+  content: "\f11a";
+}
+.fa-gamepad:before {
+  content: "\f11b";
+}
+.fa-keyboard-o:before {
+  content: "\f11c";
+}
+.fa-flag-o:before {
+  content: "\f11d";
+}
+.fa-flag-checkered:before {
+  content: "\f11e";
+}
+.fa-terminal:before {
+  content: "\f120";
+}
+.fa-code:before {
+  content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+  content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+  content: "\f123";
+}
+.fa-location-arrow:before {
+  content: "\f124";
+}
+.fa-crop:before {
+  content: "\f125";
+}
+.fa-code-fork:before {
+  content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+  content: "\f127";
+}
+.fa-question:before {
+  content: "\f128";
+}
+.fa-info:before {
+  content: "\f129";
+}
+.fa-exclamation:before {
+  content: "\f12a";
+}
+.fa-superscript:before {
+  content: "\f12b";
+}
+.fa-subscript:before {
+  content: "\f12c";
+}
+.fa-eraser:before {
+  content: "\f12d";
+}
+.fa-puzzle-piece:before {
+  content: "\f12e";
+}
+.fa-microphone:before {
+  content: "\f130";
+}
+.fa-microphone-slash:before {
+  content: "\f131";
+}
+.fa-shield:before {
+  content: "\f132";
+}
+.fa-calendar-o:before {
+  content: "\f133";
+}
+.fa-fire-extinguisher:before {
+  content: "\f134";
+}
+.fa-rocket:before {
+  content: "\f135";
+}
+.fa-maxcdn:before {
+  content: "\f136";
+}
+.fa-chevron-circle-left:before {
+  content: "\f137";
+}
+.fa-chevron-circle-right:before {
+  content: "\f138";
+}
+.fa-chevron-circle-up:before {
+  content: "\f139";
+}
+.fa-chevron-circle-down:before {
+  content: "\f13a";
+}
+.fa-html5:before {
+  content: "\f13b";
+}
+.fa-css3:before {
+  content: "\f13c";
+}
+.fa-anchor:before {
+  content: "\f13d";
+}
+.fa-unlock-alt:before {
+  content: "\f13e";
+}
+.fa-bullseye:before {
+  content: "\f140";
+}
+.fa-ellipsis-h:before {
+  content: "\f141";
+}
+.fa-ellipsis-v:before {
+  content: "\f142";
+}
+.fa-rss-square:before {
+  content: "\f143";
+}
+.fa-play-circle:before {
+  content: "\f144";
+}
+.fa-ticket:before {
+  content: "\f145";
+}
+.fa-minus-square:before {
+  content: "\f146";
+}
+.fa-minus-square-o:before {
+  content: "\f147";
+}
+.fa-level-up:before {
+  content: "\f148";
+}
+.fa-level-down:before {
+  content: "\f149";
+}
+.fa-check-square:before {
+  content: "\f14a";
+}
+.fa-pencil-square:before {
+  content: "\f14b";
+}
+.fa-external-link-square:before {
+  content: "\f14c";
+}
+.fa-share-square:before {
+  content: "\f14d";
+}
+.fa-compass:before {
+  content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+  content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+  content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+  content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+  content: "\f153";
+}
+.fa-gbp:before {
+  content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+  content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+  content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+  content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+  content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+  content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+  content: "\f15a";
+}
+.fa-file:before {
+  content: "\f15b";
+}
+.fa-file-text:before {
+  content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+  content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+  content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+  content: "\f160";
+}
+.fa-sort-amount-desc:before {
+  content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+  content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+  content: "\f163";
+}
+.fa-thumbs-up:before {
+  content: "\f164";
+}
+.fa-thumbs-down:before {
+  content: "\f165";
+}
+.fa-youtube-square:before {
+  content: "\f166";
+}
+.fa-youtube:before {
+  content: "\f167";
+}
+.fa-xing:before {
+  content: "\f168";
+}
+.fa-xing-square:before {
+  content: "\f169";
+}
+.fa-youtube-play:before {
+  content: "\f16a";
+}
+.fa-dropbox:before {
+  content: "\f16b";
+}
+.fa-stack-overflow:before {
+  content: "\f16c";
+}
+.fa-instagram:before {
+  content: "\f16d";
+}
+.fa-flickr:before {
+  content: "\f16e";
+}
+.fa-adn:before {
+  content: "\f170";
+}
+.fa-bitbucket:before {
+  content: "\f171";
+}
+.fa-bitbucket-square:before {
+  content: "\f172";
+}
+.fa-tumblr:before {
+  content: "\f173";
+}
+.fa-tumblr-square:before {
+  content: "\f174";
+}
+.fa-long-arrow-down:before {
+  content: "\f175";
+}
+.fa-long-arrow-up:before {
+  content: "\f176";
+}
+.fa-long-arrow-left:before {
+  content: "\f177";
+}
+.fa-long-arrow-right:before {
+  content: "\f178";
+}
+.fa-apple:before {
+  content: "\f179";
+}
+.fa-windows:before {
+  content: "\f17a";
+}
+.fa-android:before {
+  content: "\f17b";
+}
+.fa-linux:before {
+  content: "\f17c";
+}
+.fa-dribbble:before {
+  content: "\f17d";
+}
+.fa-skype:before {
+  content: "\f17e";
+}
+.fa-foursquare:before {
+  content: "\f180";
+}
+.fa-trello:before {
+  content: "\f181";
+}
+.fa-female:before {
+  content: "\f182";
+}
+.fa-male:before {
+  content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+  content: "\f184";
+}
+.fa-sun-o:before {
+  content: "\f185";
+}
+.fa-moon-o:before {
+  content: "\f186";
+}
+.fa-archive:before {
+  content: "\f187";
+}
+.fa-bug:before {
+  content: "\f188";
+}
+.fa-vk:before {
+  content: "\f189";
+}
+.fa-weibo:before {
+  content: "\f18a";
+}
+.fa-renren:before {
+  content: "\f18b";
+}
+.fa-pagelines:before {
+  content: "\f18c";
+}
+.fa-stack-exchange:before {
+  content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+  content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+  content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+  content: "\f191";
+}
+.fa-dot-circle-o:before {
+  content: "\f192";
+}
+.fa-wheelchair:before {
+  content: "\f193";
+}
+.fa-vimeo-square:before {
+  content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+  content: "\f195";
+}
+.fa-plus-square-o:before {
+  content: "\f196";
+}
+.fa-space-shuttle:before {
+  content: "\f197";
+}
+.fa-slack:before {
+  content: "\f198";
+}
+.fa-envelope-square:before {
+  content: "\f199";
+}
+.fa-wordpress:before {
+  content: "\f19a";
+}
+.fa-openid:before {
+  content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+  content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+  content: "\f19d";
+}
+.fa-yahoo:before {
+  content: "\f19e";
+}
+.fa-google:before {
+  content: "\f1a0";
+}
+.fa-reddit:before {
+  content: "\f1a1";
+}
+.fa-reddit-square:before {
+  content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+  content: "\f1a3";
+}
+.fa-stumbleupon:before {
+  content: "\f1a4";
+}
+.fa-delicious:before {
+  content: "\f1a5";
+}
+.fa-digg:before {
+  content: "\f1a6";
+}
+.fa-pied-piper-pp:before {
+  content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+  content: "\f1a8";
+}
+.fa-drupal:before {
+  content: "\f1a9";
+}
+.fa-joomla:before {
+  content: "\f1aa";
+}
+.fa-language:before {
+  content: "\f1ab";
+}
+.fa-fax:before {
+  content: "\f1ac";
+}
+.fa-building:before {
+  content: "\f1ad";
+}
+.fa-child:before {
+  content: "\f1ae";
+}
+.fa-paw:before {
+  content: "\f1b0";
+}
+.fa-spoon:before {
+  content: "\f1b1";
+}
+.fa-cube:before {
+  content: "\f1b2";
+}
+.fa-cubes:before {
+  content: "\f1b3";
+}
+.fa-behance:before {
+  content: "\f1b4";
+}
+.fa-behance-square:before {
+  content: "\f1b5";
+}
+.fa-steam:before {
+  content: "\f1b6";
+}
+.fa-steam-square:before {
+  content: "\f1b7";
+}
+.fa-recycle:before {
+  content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+  content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+  content: "\f1ba";
+}
+.fa-tree:before {
+  content: "\f1bb";
+}
+.fa-spotify:before {
+  content: "\f1bc";
+}
+.fa-deviantart:before {
+  content: "\f1bd";
+}
+.fa-soundcloud:before {
+  content: "\f1be";
+}
+.fa-database:before {
+  content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+  content: "\f1c1";
+}
+.fa-file-word-o:before {
+  content: "\f1c2";
+}
+.fa-file-excel-o:before {
+  content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+  content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+  content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+  content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+  content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+  content: "\f1c8";
+}
+.fa-file-code-o:before {
+  content: "\f1c9";
+}
+.fa-vine:before {
+  content: "\f1ca";
+}
+.fa-codepen:before {
+  content: "\f1cb";
+}
+.fa-jsfiddle:before {
+  content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+  content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+  content: "\f1ce";
+}
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+  content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+  content: "\f1d1";
+}
+.fa-git-square:before {
+  content: "\f1d2";
+}
+.fa-git:before {
+  content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+  content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+  content: "\f1d5";
+}
+.fa-qq:before {
+  content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+  content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+  content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+  content: "\f1d9";
+}
+.fa-history:before {
+  content: "\f1da";
+}
+.fa-circle-thin:before {
+  content: "\f1db";
+}
+.fa-header:before {
+  content: "\f1dc";
+}
+.fa-paragraph:before {
+  content: "\f1dd";
+}
+.fa-sliders:before {
+  content: "\f1de";
+}
+.fa-share-alt:before {
+  content: "\f1e0";
+}
+.fa-share-alt-square:before {
+  content: "\f1e1";
+}
+.fa-bomb:before {
+  content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+  content: "\f1e3";
+}
+.fa-tty:before {
+  content: "\f1e4";
+}
+.fa-binoculars:before {
+  content: "\f1e5";
+}
+.fa-plug:before {
+  content: "\f1e6";
+}
+.fa-slideshare:before {
+  content: "\f1e7";
+}
+.fa-twitch:before {
+  content: "\f1e8";
+}
+.fa-yelp:before {
+  content: "\f1e9";
+}
+.fa-newspaper-o:before {
+  content: "\f1ea";
+}
+.fa-wifi:before {
+  content: "\f1eb";
+}
+.fa-calculator:before {
+  content: "\f1ec";
+}
+.fa-paypal:before {
+  content: "\f1ed";
+}
+.fa-google-wallet:before {
+  content: "\f1ee";
+}
+.fa-cc-visa:before {
+  content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+  content: "\f1f1";
+}
+.fa-cc-discover:before {
+  content: "\f1f2";
+}
+.fa-cc-amex:before {
+  content: "\f1f3";
+}
+.fa-cc-paypal:before {
+  content: "\f1f4";
+}
+.fa-cc-stripe:before {
+  content: "\f1f5";
+}
+.fa-bell-slash:before {
+  content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+  content: "\f1f7";
+}
+.fa-trash:before {
+  content: "\f1f8";
+}
+.fa-copyright:before {
+  content: "\f1f9";
+}
+.fa-at:before {
+  content: "\f1fa";
+}
+.fa-eyedropper:before {
+  content: "\f1fb";
+}
+.fa-paint-brush:before {
+  content: "\f1fc";
+}
+.fa-birthday-cake:before {
+  content: "\f1fd";
+}
+.fa-area-chart:before {
+  content: "\f1fe";
+}
+.fa-pie-chart:before {
+  content: "\f200";
+}
+.fa-line-chart:before {
+  content: "\f201";
+}
+.fa-lastfm:before {
+  content: "\f202";
+}
+.fa-lastfm-square:before {
+  content: "\f203";
+}
+.fa-toggle-off:before {
+  content: "\f204";
+}
+.fa-toggle-on:before {
+  content: "\f205";
+}
+.fa-bicycle:before {
+  content: "\f206";
+}
+.fa-bus:before {
+  content: "\f207";
+}
+.fa-ioxhost:before {
+  content: "\f208";
+}
+.fa-angellist:before {
+  content: "\f209";
+}
+.fa-cc:before {
+  content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+  content: "\f20b";
+}
+.fa-meanpath:before {
+  content: "\f20c";
+}
+.fa-buysellads:before {
+  content: "\f20d";
+}
+.fa-connectdevelop:before {
+  content: "\f20e";
+}
+.fa-dashcube:before {
+  content: "\f210";
+}
+.fa-forumbee:before {
+  content: "\f211";
+}
+.fa-leanpub:before {
+  content: "\f212";
+}
+.fa-sellsy:before {
+  content: "\f213";
+}
+.fa-shirtsinbulk:before {
+  content: "\f214";
+}
+.fa-simplybuilt:before {
+  content: "\f215";
+}
+.fa-skyatlas:before {
+  content: "\f216";
+}
+.fa-cart-plus:before {
+  content: "\f217";
+}
+.fa-cart-arrow-down:before {
+  content: "\f218";
+}
+.fa-diamond:before {
+  content: "\f219";
+}
+.fa-ship:before {
+  content: "\f21a";
+}
+.fa-user-secret:before {
+  content: "\f21b";
+}
+.fa-motorcycle:before {
+  content: "\f21c";
+}
+.fa-street-view:before {
+  content: "\f21d";
+}
+.fa-heartbeat:before {
+  content: "\f21e";
+}
+.fa-venus:before {
+  content: "\f221";
+}
+.fa-mars:before {
+  content: "\f222";
+}
+.fa-mercury:before {
+  content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+  content: "\f224";
+}
+.fa-transgender-alt:before {
+  content: "\f225";
+}
+.fa-venus-double:before {
+  content: "\f226";
+}
+.fa-mars-double:before {
+  content: "\f227";
+}
+.fa-venus-mars:before {
+  content: "\f228";
+}
+.fa-mars-stroke:before {
+  content: "\f229";
+}
+.fa-mars-stroke-v:before {
+  content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+  content: "\f22b";
+}
+.fa-neuter:before {
+  content: "\f22c";
+}
+.fa-genderless:before {
+  content: "\f22d";
+}
+.fa-facebook-official:before {
+  content: "\f230";
+}
+.fa-pinterest-p:before {
+  content: "\f231";
+}
+.fa-whatsapp:before {
+  content: "\f232";
+}
+.fa-server:before {
+  content: "\f233";
+}
+.fa-user-plus:before {
+  content: "\f234";
+}
+.fa-user-times:before {
+  content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+  content: "\f236";
+}
+.fa-viacoin:before {
+  content: "\f237";
+}
+.fa-train:before {
+  content: "\f238";
+}
+.fa-subway:before {
+  content: "\f239";
+}
+.fa-medium:before {
+  content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+  content: "\f23b";
+}
+.fa-optin-monster:before {
+  content: "\f23c";
+}
+.fa-opencart:before {
+  content: "\f23d";
+}
+.fa-expeditedssl:before {
+  content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+  content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+  content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+  content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+  content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+  content: "\f244";
+}
+.fa-mouse-pointer:before {
+  content: "\f245";
+}
+.fa-i-cursor:before {
+  content: "\f246";
+}
+.fa-object-group:before {
+  content: "\f247";
+}
+.fa-object-ungroup:before {
+  content: "\f248";
+}
+.fa-sticky-note:before {
+  content: "\f249";
+}
+.fa-sticky-note-o:before {
+  content: "\f24a";
+}
+.fa-cc-jcb:before {
+  content: "\f24b";
+}
+.fa-cc-diners-club:before {
+  content: "\f24c";
+}
+.fa-clone:before {
+  content: "\f24d";
+}
+.fa-balance-scale:before {
+  content: "\f24e";
+}
+.fa-hourglass-o:before {
+  content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+  content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+  content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+  content: "\f253";
+}
+.fa-hourglass:before {
+  content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+  content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+  content: "\f256";
+}
+.fa-hand-scissors-o:before {
+  content: "\f257";
+}
+.fa-hand-lizard-o:before {
+  content: "\f258";
+}
+.fa-hand-spock-o:before {
+  content: "\f259";
+}
+.fa-hand-pointer-o:before {
+  content: "\f25a";
+}
+.fa-hand-peace-o:before {
+  content: "\f25b";
+}
+.fa-trademark:before {
+  content: "\f25c";
+}
+.fa-registered:before {
+  content: "\f25d";
+}
+.fa-creative-commons:before {
+  content: "\f25e";
+}
+.fa-gg:before {
+  content: "\f260";
+}
+.fa-gg-circle:before {
+  content: "\f261";
+}
+.fa-tripadvisor:before {
+  content: "\f262";
+}
+.fa-odnoklassniki:before {
+  content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+  content: "\f264";
+}
+.fa-get-pocket:before {
+  content: "\f265";
+}
+.fa-wikipedia-w:before {
+  content: "\f266";
+}
+.fa-safari:before {
+  content: "\f267";
+}
+.fa-chrome:before {
+  content: "\f268";
+}
+.fa-firefox:before {
+  content: "\f269";
+}
+.fa-opera:before {
+  content: "\f26a";
+}
+.fa-internet-explorer:before {
+  content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+  content: "\f26c";
+}
+.fa-contao:before {
+  content: "\f26d";
+}
+.fa-500px:before {
+  content: "\f26e";
+}
+.fa-amazon:before {
+  content: "\f270";
+}
+.fa-calendar-plus-o:before {
+  content: "\f271";
+}
+.fa-calendar-minus-o:before {
+  content: "\f272";
+}
+.fa-calendar-times-o:before {
+  content: "\f273";
+}
+.fa-calendar-check-o:before {
+  content: "\f274";
+}
+.fa-industry:before {
+  content: "\f275";
+}
+.fa-map-pin:before {
+  content: "\f276";
+}
+.fa-map-signs:before {
+  content: "\f277";
+}
+.fa-map-o:before {
+  content: "\f278";
+}
+.fa-map:before {
+  content: "\f279";
+}
+.fa-commenting:before {
+  content: "\f27a";
+}
+.fa-commenting-o:before {
+  content: "\f27b";
+}
+.fa-houzz:before {
+  content: "\f27c";
+}
+.fa-vimeo:before {
+  content: "\f27d";
+}
+.fa-black-tie:before {
+  content: "\f27e";
+}
+.fa-fonticons:before {
+  content: "\f280";
+}
+.fa-reddit-alien:before {
+  content: "\f281";
+}
+.fa-edge:before {
+  content: "\f282";
+}
+.fa-credit-card-alt:before {
+  content: "\f283";
+}
+.fa-codiepie:before {
+  content: "\f284";
+}
+.fa-modx:before {
+  content: "\f285";
+}
+.fa-fort-awesome:before {
+  content: "\f286";
+}
+.fa-usb:before {
+  content: "\f287";
+}
+.fa-product-hunt:before {
+  content: "\f288";
+}
+.fa-mixcloud:before {
+  content: "\f289";
+}
+.fa-scribd:before {
+  content: "\f28a";
+}
+.fa-pause-circle:before {
+  content: "\f28b";
+}
+.fa-pause-circle-o:before {
+  content: "\f28c";
+}
+.fa-stop-circle:before {
+  content: "\f28d";
+}
+.fa-stop-circle-o:before {
+  content: "\f28e";
+}
+.fa-shopping-bag:before {
+  content: "\f290";
+}
+.fa-shopping-basket:before {
+  content: "\f291";
+}
+.fa-hashtag:before {
+  content: "\f292";
+}
+.fa-bluetooth:before {
+  content: "\f293";
+}
+.fa-bluetooth-b:before {
+  content: "\f294";
+}
+.fa-percent:before {
+  content: "\f295";
+}
+.fa-gitlab:before {
+  content: "\f296";
+}
+.fa-wpbeginner:before {
+  content: "\f297";
+}
+.fa-wpforms:before {
+  content: "\f298";
+}
+.fa-envira:before {
+  content: "\f299";
+}
+.fa-universal-access:before {
+  content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+  content: "\f29b";
+}
+.fa-question-circle-o:before {
+  content: "\f29c";
+}
+.fa-blind:before {
+  content: "\f29d";
+}
+.fa-audio-description:before {
+  content: "\f29e";
+}
+.fa-volume-control-phone:before {
+  content: "\f2a0";
+}
+.fa-braille:before {
+  content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+  content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+  content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+  content: "\f2a4";
+}
+.fa-glide:before {
+  content: "\f2a5";
+}
+.fa-glide-g:before {
+  content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+  content: "\f2a7";
+}
+.fa-low-vision:before {
+  content: "\f2a8";
+}
+.fa-viadeo:before {
+  content: "\f2a9";
+}
+.fa-viadeo-square:before {
+  content: "\f2aa";
+}
+.fa-snapchat:before {
+  content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+  content: "\f2ac";
+}
+.fa-snapchat-square:before {
+  content: "\f2ad";
+}
+.fa-pied-piper:before {
+  content: "\f2ae";
+}
+.fa-first-order:before {
+  content: "\f2b0";
+}
+.fa-yoast:before {
+  content: "\f2b1";
+}
+.fa-themeisle:before {
+  content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+  content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+  content: "\f2b4";
+}
+.fa-handshake-o:before {
+  content: "\f2b5";
+}
+.fa-envelope-open:before {
+  content: "\f2b6";
+}
+.fa-envelope-open-o:before {
+  content: "\f2b7";
+}
+.fa-linode:before {
+  content: "\f2b8";
+}
+.fa-address-book:before {
+  content: "\f2b9";
+}
+.fa-address-book-o:before {
+  content: "\f2ba";
+}
+.fa-vcard:before,
+.fa-address-card:before {
+  content: "\f2bb";
+}
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+  content: "\f2bc";
+}
+.fa-user-circle:before {
+  content: "\f2bd";
+}
+.fa-user-circle-o:before {
+  content: "\f2be";
+}
+.fa-user-o:before {
+  content: "\f2c0";
+}
+.fa-id-badge:before {
+  content: "\f2c1";
+}
+.fa-drivers-license:before,
+.fa-id-card:before {
+  content: "\f2c2";
+}
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+  content: "\f2c3";
+}
+.fa-quora:before {
+  content: "\f2c4";
+}
+.fa-free-code-camp:before {
+  content: "\f2c5";
+}
+.fa-telegram:before {
+  content: "\f2c6";
+}
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+  content: "\f2c7";
+}
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+  content: "\f2c8";
+}
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+  content: "\f2c9";
+}
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+  content: "\f2ca";
+}
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+  content: "\f2cb";
+}
+.fa-shower:before {
+  content: "\f2cc";
+}
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+  content: "\f2cd";
+}
+.fa-podcast:before {
+  content: "\f2ce";
+}
+.fa-window-maximize:before {
+  content: "\f2d0";
+}
+.fa-window-minimize:before {
+  content: "\f2d1";
+}
+.fa-window-restore:before {
+  content: "\f2d2";
+}
+.fa-times-rectangle:before,
+.fa-window-close:before {
+  content: "\f2d3";
+}
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+  content: "\f2d4";
+}
+.fa-bandcamp:before {
+  content: "\f2d5";
+}
+.fa-grav:before {
+  content: "\f2d6";
+}
+.fa-etsy:before {
+  content: "\f2d7";
+}
+.fa-imdb:before {
+  content: "\f2d8";
+}
+.fa-ravelry:before {
+  content: "\f2d9";
+}
+.fa-eercast:before {
+  content: "\f2da";
+}
+.fa-microchip:before {
+  content: "\f2db";
+}
+.fa-snowflake-o:before {
+  content: "\f2dc";
+}
+.fa-superpowers:before {
+  content: "\f2dd";
+}
+.fa-wpexplorer:before {
+  content: "\f2de";
+}
+.fa-meetup:before {
+  content: "\f2e0";
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
diff --git a/static/home_icon_default_no.png b/static/home_icon_default_no.png
new file mode 100644
index 0000000..265e06d
Binary files /dev/null and b/static/home_icon_default_no.png differ
diff --git a/static/icon/designer-f.png b/static/icon/designer-f.png
new file mode 100644
index 0000000..f8a390d
Binary files /dev/null and b/static/icon/designer-f.png differ
diff --git a/static/icon/designer-o.png b/static/icon/designer-o.png
new file mode 100644
index 0000000..a1ab5e8
Binary files /dev/null and b/static/icon/designer-o.png differ
diff --git a/static/icon/diy_icon_editor_default.png b/static/icon/diy_icon_editor_default.png
new file mode 100644
index 0000000..a29a94b
Binary files /dev/null and b/static/icon/diy_icon_editor_default.png differ
diff --git a/static/icon/diy_icon_editor_pressed.png b/static/icon/diy_icon_editor_pressed.png
new file mode 100644
index 0000000..13960c3
Binary files /dev/null and b/static/icon/diy_icon_editor_pressed.png differ
diff --git a/static/icon/diy_icon_on_default.png b/static/icon/diy_icon_on_default.png
new file mode 100644
index 0000000..c9b4d89
Binary files /dev/null and b/static/icon/diy_icon_on_default.png differ
diff --git a/static/icon/diy_icon_remove_normal.png b/static/icon/diy_icon_remove_normal.png
new file mode 100644
index 0000000..d19ddc4
Binary files /dev/null and b/static/icon/diy_icon_remove_normal.png differ
diff --git a/static/icon/diy_icon_up_default.png b/static/icon/diy_icon_up_default.png
new file mode 100644
index 0000000..fc95c40
Binary files /dev/null and b/static/icon/diy_icon_up_default.png differ
diff --git a/static/icon/home-f.png b/static/icon/home-f.png
new file mode 100644
index 0000000..075c64d
Binary files /dev/null and b/static/icon/home-f.png differ
diff --git a/static/icon/home-o.png b/static/icon/home-o.png
new file mode 100644
index 0000000..8699a07
Binary files /dev/null and b/static/icon/home-o.png differ
diff --git a/static/icon/icon_close.png b/static/icon/icon_close.png
new file mode 100644
index 0000000..95b4248
Binary files /dev/null and b/static/icon/icon_close.png differ
diff --git a/static/icon/icon_collection@2x.png b/static/icon/icon_collection@2x.png
new file mode 100644
index 0000000..9a57904
Binary files /dev/null and b/static/icon/icon_collection@2x.png differ
diff --git a/static/icon/icon_collection_@2x-o.png b/static/icon/icon_collection_@2x-o.png
new file mode 100644
index 0000000..69cd4d4
Binary files /dev/null and b/static/icon/icon_collection_@2x-o.png differ
diff --git a/static/icon/icon_collection_@2x.png b/static/icon/icon_collection_@2x.png
new file mode 100644
index 0000000..1c9f154
Binary files /dev/null and b/static/icon/icon_collection_@2x.png differ
diff --git a/static/icon/icon_determine.png b/static/icon/icon_determine.png
new file mode 100644
index 0000000..c026cb2
Binary files /dev/null and b/static/icon/icon_determine.png differ
diff --git a/static/icon/icon_diy_collection.png b/static/icon/icon_diy_collection.png
new file mode 100644
index 0000000..662a636
Binary files /dev/null and b/static/icon/icon_diy_collection.png differ
diff --git a/static/icon/icon_form.png b/static/icon/icon_form.png
new file mode 100644
index 0000000..3d98394
Binary files /dev/null and b/static/icon/icon_form.png differ
diff --git a/static/icon/icon_good@2x-o.png b/static/icon/icon_good@2x-o.png
new file mode 100644
index 0000000..abd1a65
Binary files /dev/null and b/static/icon/icon_good@2x-o.png differ
diff --git a/static/icon/icon_good@2x.png b/static/icon/icon_good@2x.png
new file mode 100644
index 0000000..cec72e2
Binary files /dev/null and b/static/icon/icon_good@2x.png differ
diff --git a/static/icon/icon_history_image.png b/static/icon/icon_history_image.png
new file mode 100644
index 0000000..0e30116
Binary files /dev/null and b/static/icon/icon_history_image.png differ
diff --git a/static/icon/icon_history_sticker-o.png b/static/icon/icon_history_sticker-o.png
new file mode 100644
index 0000000..707d0a1
Binary files /dev/null and b/static/icon/icon_history_sticker-o.png differ
diff --git a/static/icon/icon_history_sticker.png b/static/icon/icon_history_sticker.png
new file mode 100644
index 0000000..d97a35e
Binary files /dev/null and b/static/icon/icon_history_sticker.png differ
diff --git a/static/icon/icon_muban.png b/static/icon/icon_muban.png
new file mode 100644
index 0000000..b591425
Binary files /dev/null and b/static/icon/icon_muban.png differ
diff --git a/static/icon/icon_qiehuan.png b/static/icon/icon_qiehuan.png
new file mode 100644
index 0000000..79e1705
Binary files /dev/null and b/static/icon/icon_qiehuan.png differ
diff --git a/static/icon/icon_qiehuan_on.png b/static/icon/icon_qiehuan_on.png
new file mode 100644
index 0000000..5290630
Binary files /dev/null and b/static/icon/icon_qiehuan_on.png differ
diff --git a/static/icon/icon_qiehuan_one.png b/static/icon/icon_qiehuan_one.png
new file mode 100644
index 0000000..27f9cd0
Binary files /dev/null and b/static/icon/icon_qiehuan_one.png differ
diff --git a/static/icon/icon_refresh.png b/static/icon/icon_refresh.png
new file mode 100644
index 0000000..fa368c3
Binary files /dev/null and b/static/icon/icon_refresh.png differ
diff --git a/static/icon/icon_refresh_red.png b/static/icon/icon_refresh_red.png
new file mode 100644
index 0000000..186d240
Binary files /dev/null and b/static/icon/icon_refresh_red.png differ
diff --git a/static/icon/icon_stickers.png b/static/icon/icon_stickers.png
new file mode 100644
index 0000000..f80b89a
Binary files /dev/null and b/static/icon/icon_stickers.png differ
diff --git a/static/icon/icon_template.png b/static/icon/icon_template.png
new file mode 100644
index 0000000..758c82b
Binary files /dev/null and b/static/icon/icon_template.png differ
diff --git a/static/icon/icon_typeface.png b/static/icon/icon_typeface.png
new file mode 100644
index 0000000..b784e5f
Binary files /dev/null and b/static/icon/icon_typeface.png differ
diff --git a/static/icon/icon_zoom.png b/static/icon/icon_zoom.png
new file mode 100644
index 0000000..c570572
Binary files /dev/null and b/static/icon/icon_zoom.png differ
diff --git a/static/icon/icon_zuopin.png b/static/icon/icon_zuopin.png
new file mode 100644
index 0000000..237011d
Binary files /dev/null and b/static/icon/icon_zuopin.png differ
diff --git a/static/icon/my-o.png b/static/icon/my-o.png
new file mode 100644
index 0000000..067ad27
Binary files /dev/null and b/static/icon/my-o.png differ
diff --git a/static/icon/my.png b/static/icon/my.png
new file mode 100644
index 0000000..849c118
Binary files /dev/null and b/static/icon/my.png differ
diff --git a/static/icon/recommend-f.png b/static/icon/recommend-f.png
new file mode 100644
index 0000000..326d452
Binary files /dev/null and b/static/icon/recommend-f.png differ
diff --git a/static/icon/recommend-o.png b/static/icon/recommend-o.png
new file mode 100644
index 0000000..3fca8a1
Binary files /dev/null and b/static/icon/recommend-o.png differ
diff --git a/static/icon/replace.png b/static/icon/replace.png
new file mode 100644
index 0000000..c6662da
Binary files /dev/null and b/static/icon/replace.png differ
diff --git a/static/icon/yanse_icon.png b/static/icon/yanse_icon.png
new file mode 100644
index 0000000..9b2f18f
Binary files /dev/null and b/static/icon/yanse_icon.png differ
diff --git a/static/icon_close.png b/static/icon_close.png
new file mode 100644
index 0000000..cce21a2
Binary files /dev/null and b/static/icon_close.png differ
diff --git a/static/icon_confirm.png b/static/icon_confirm.png
new file mode 100644
index 0000000..affe5d7
Binary files /dev/null and b/static/icon_confirm.png differ
diff --git a/static/icon_custom_tips.png b/static/icon_custom_tips.png
new file mode 100644
index 0000000..2cbe35a
Binary files /dev/null and b/static/icon_custom_tips.png differ
diff --git a/static/icon_default_no.png b/static/icon_default_no.png
new file mode 100644
index 0000000..2dc2e94
Binary files /dev/null and b/static/icon_default_no.png differ
diff --git a/static/icon_diy_ai.png b/static/icon_diy_ai.png
new file mode 100644
index 0000000..4c21296
Binary files /dev/null and b/static/icon_diy_ai.png differ
diff --git a/static/icon_diy_anime_style.png b/static/icon_diy_anime_style.png
new file mode 100644
index 0000000..c3d7ec9
Binary files /dev/null and b/static/icon_diy_anime_style.png differ
diff --git a/static/icon_diy_enhance_style.png b/static/icon_diy_enhance_style.png
new file mode 100644
index 0000000..5d7ec36
Binary files /dev/null and b/static/icon_diy_enhance_style.png differ
diff --git a/static/icon_diy_matting_style.png b/static/icon_diy_matting_style.png
new file mode 100644
index 0000000..24f055f
Binary files /dev/null and b/static/icon_diy_matting_style.png differ
diff --git a/static/icon_diy_sketch_style.png b/static/icon_diy_sketch_style.png
new file mode 100644
index 0000000..bac045f
Binary files /dev/null and b/static/icon_diy_sketch_style.png differ
diff --git a/static/icon_guanbi.png b/static/icon_guanbi.png
new file mode 100644
index 0000000..ea7e2fc
Binary files /dev/null and b/static/icon_guanbi.png differ
diff --git a/static/icon_guaqi.png b/static/icon_guaqi.png
new file mode 100644
index 0000000..1ed2078
Binary files /dev/null and b/static/icon_guaqi.png differ
diff --git a/static/icon_make_diy_back_color.png b/static/icon_make_diy_back_color.png
new file mode 100644
index 0000000..70ffbc2
Binary files /dev/null and b/static/icon_make_diy_back_color.png differ
diff --git a/static/icon_make_diy_uplaod_image.png b/static/icon_make_diy_uplaod_image.png
new file mode 100644
index 0000000..6ac19dc
Binary files /dev/null and b/static/icon_make_diy_uplaod_image.png differ
diff --git a/static/icon_more_left.png b/static/icon_more_left.png
new file mode 100644
index 0000000..7043340
Binary files /dev/null and b/static/icon_more_left.png differ
diff --git a/static/icon_more_one.png b/static/icon_more_one.png
new file mode 100644
index 0000000..3d2b12d
Binary files /dev/null and b/static/icon_more_one.png differ
diff --git a/static/icon_more_right.png b/static/icon_more_right.png
new file mode 100644
index 0000000..d5d9229
Binary files /dev/null and b/static/icon_more_right.png differ
diff --git a/static/icon_wechat.png b/static/icon_wechat.png
new file mode 100644
index 0000000..6503663
Binary files /dev/null and b/static/icon_wechat.png differ
diff --git a/static/iconfont/iconfont.css b/static/iconfont/iconfont.css
new file mode 100644
index 0000000..c509ebf
--- /dev/null
+++ b/static/iconfont/iconfont.css
@@ -0,0 +1,69 @@
+@font-face {font-family: "iconfont";
+  src: url('iconfont.eot?t=1604382534615'); /* IE9 */
+  src: url('iconfont.eot?t=1604382534615#iefix') format('embedded-opentype'), /* IE6-IE8 */
+  url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+  url('iconfont.woff?t=1604382534615') format('woff'),
+  url('iconfont.ttf?t=1604382534615') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+  url('iconfont.svg?t=1604382534615#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.iconditu:before {
+  content: "\e60b";
+}
+
+.iconduihao2:before {
+  content: "\e69e";
+}
+
+.iconchuizhijuzhongduiqi:before {
+  content: "\e654";
+}
+
+.iconjiantou1:before {
+  content: "\e631";
+}
+
+.iconjiantou-copy-copy:before {
+  content: "\e633";
+}
+
+.iconzhengpinbaozheng:before {
+  content: "\e639";
+}
+
+.iconxiala:before {
+  content: "\e613";
+}
+
+.iconwithdraw-fill:before {
+  content: "\e642";
+}
+
+.iconbianji:before {
+  content: "\e771";
+}
+
+.icon21:before {
+  content: "\e620";
+}
+
+.iconxingzhuang-sanjiaoxing:before {
+  content: "\eb99";
+}
+
+.iconsanjiaoxing:before {
+  content: "\e649";
+}
+
+.iconjiantou:before {
+  content: "\e61f";
+}
+
diff --git a/static/iconfont/iconfont.eot b/static/iconfont/iconfont.eot
new file mode 100644
index 0000000..4ddc99b
Binary files /dev/null and b/static/iconfont/iconfont.eot differ
diff --git a/static/iconfont/iconfont.js b/static/iconfont/iconfont.js
new file mode 100644
index 0000000..d427e56
--- /dev/null
+++ b/static/iconfont/iconfont.js
@@ -0,0 +1,47 @@
+! function(i) {
+	var c, t =
+		'<svg><symbol id="icon-31daishouhuo" viewBox="0 0 1024 1024"><path d="M841.530179 137.779993 366.132818 137.779993c-49.562812 0-89.855494 40.144302-89.855494 89.499383l0 131.069151-172.015725 99.067296-6.299473 4.189416 0.713244 1.218758 0.029676 0.118704c-3.922333 4.694929-6.062066 10.54824-6.062066 16.58063l0 275.063683c0 16.075117 12.063757 29.1499 26.891464 29.1499 14.857383 0 26.921139-13.103436 26.921139-29.238928L146.455583 494.973208l168.746262-97.373725c11.707646-4.130064 19.552312-15.124466 19.552312-27.336602L334.754157 231.587496c0-19.552312 16.015765-35.479049 35.68678-35.479049l466.750423 0c19.671015 0 35.68678 15.926738 35.68678 35.479049l0 512.034792c0 16.104793 13.104459 29.179576 29.238928 29.179576 16.134469 0 29.238928-13.104459 29.238928-29.238928L931.355997 227.278353C931.355997 177.923272 891.063315 137.779993 841.530179 137.779993z"  ></path><path d="M741.957369 656.351666c-55.595202 0-102.900601 39.49041-112.973004 94.104261l-204.284663-0.118704c-10.132778-54.555523-57.437154-93.985558-112.973004-93.985558-63.647599 0-115.439172 51.554166-115.439172 114.934682s51.791573 114.934682 115.439172 114.934682c51.67287 0 97.194646-34.558074 111.071701-84.209914l208.117968 0.089028c13.906731 49.592488 59.398832 84.120886 111.042026 84.120886 63.647599 0 115.409496-51.554166 115.409496-114.934682S805.604968 656.351666 741.957369 656.351666zM741.957369 825.514413c-30.070876 0-54.525847-24.336268-54.525847-54.228065 0-29.892821 24.454972-54.228065 54.525847-54.228065s54.525847 24.336268 54.525847 54.228065C796.483216 801.178145 772.028245 825.514413 741.957369 825.514413zM311.726697 825.514413c-30.070876 0-54.525847-24.336268-54.525847-54.228065 0-29.892821 24.454972-54.228065 54.525847-54.228065 30.0412 0 54.496172 24.336268 54.496172 54.228065C366.221846 801.178145 341.766874 825.514413 311.726697 825.514413z"  ></path><path d="M224.930889 573.151755c0 15.540951 12.687974 28.199249 28.317952 28.199249l109.526509-0.029676c15.421224 0 27.575032-4.605901 36.162618-13.727653 13.638625-14.470573 12.539594-35.003212 12.509918-35.121915l0-85.814458c0-15.540951-12.687974-28.199249-28.317952-28.199249s-28.317952 12.658298-28.317952 28.199249l0.029676 78.2072-101.652168 0C237.589187 544.952506 224.930889 557.64048 224.930889 573.151755z"  ></path></symbol><symbol id="icon-wodeqianbao" viewBox="0 0 1024 1024"><path d="M510.027066 1018.883469c-310.781162 0-449.376731-106.263186-449.376731-344.549244 0-188.549284 149.627832-393.97084 333.539492-457.902918l233.69346 0.329505c182.468798 63.797002 331.50516 269.12953 331.513346 457.573413C959.39561 912.61926 820.807205 1018.883469 510.027066 1018.883469zM403.554102 281.066397c-34.134425 13.268188-67.544349 32.459273-99.323123 57.051367-35.151591 27.239388-66.721611 59.758012-93.818759 96.66048-27.224038 37.081547-48.516993 76.631308-63.288418 117.526717-14.981203 41.434691-22.572088 82.479503-22.572088 122.029264 0 50.379411 7.067976 93.51893 21.008476 128.222313 13.223163 32.967856 32.766264 59.32413 59.728336 80.595596 28.959565 22.825868 67.709101 40.431851 115.179252 52.309366 51.785433 12.938684 115.559922 19.505239 189.559287 19.505239 73.991178 0 137.765667-6.566556 189.5511-19.505239 47.462988-11.876492 86.212524-29.468149 115.179252-52.309366 26.977421-21.300119 46.520523-47.657416 59.735499-80.595596 13.941524-34.733059 21.001313-77.872578 21.001313-128.222313 0-39.549761-7.599072-80.609922-22.579251-122.029264-14.771425-40.926108-36.06438-80.46052-63.281255-117.526717-27.088962-36.916794-58.658981-69.436442-93.818759-96.66048-31.794124-24.591071-65.187675-43.783179-99.255585-57.020668l-211.94411-0.418532L403.554102 281.066397zM500.326123 844.409762c-23.320125 0-42.294268-18.98233-42.294268-42.302455 0-2.692319 0.284479-5.445012 0.845251-8.196683l1.480724-7.389294-2.169409 0 0-39.041178-83.751473-0.045025c-18.039865 0-32.714076-14.59951-32.714076-32.549324 0-17.97949 14.629185-32.608675 32.601512-32.608675l5.653767 0 0.01535-0.104377L458.189444 682.172751 458.189444 631.209032l-81.395822 0-2.273786-0.059352c-18.107403 0-32.79594-14.613836-32.79594-32.578999s14.629185-32.594349 32.601512-32.594349l5.467525 0 0.01535-0.074701 70.198805 0 1.196245-4.6366c0.441045-1.749854 1.166569-3.261277 2.213411-4.622274l3.365654-4.247744-90.871637-90.856287c-8.331759-8.316409-4.823865-25.399483 7.816013-38.053688 7.66661-7.673773 17.404392-12.251022 26.050306-12.251022 4.966105 0 9.109472 1.541099 11.989055 4.427846l89.562828 89.585341 83.115999-88.6132c3.829212-4.158716 9.647731-6.446829 16.394389-6.446829 9.610892 0 19.707854 4.39817 27.007097 11.756765 13.9712 14.120602 19.310811 24.276916 7.52437 37.560454l-92.090395 94.132914-0.994654 4.771677-1.02433 5.564739 6.087649 1.765203 77.266781 0.164752 1.75804 0.090051c17.994839 0.135076 32.564673 14.748912 32.564673 32.594349 0 17.830087-14.531971 32.429597-32.391734 32.549324l-4.009314 0.074701-80.415494 0 0 50.962695 82.435501 0 1.772366 0.119727c18.032702 0.135076 32.608675 14.748912 32.608675 32.578999 0 17.845437-14.531971 32.444946-32.399921 32.564673l-84.416622 0.045025 0 40.702004-0.441045 1.779529 0.029676 3.290953c0.590448 3.261277 0.912789 6.028297 0.912789 8.855692C542.621415 825.427432 523.646248 844.409762 500.326123 844.409762zM397.069411 177.824011 323.130422 66.75845l0.276293-0.972141-0.171915-3.948939c-0.61296-2.857071-1.001817-4.577249-1.001817-6.238075 0-12.011568 5.92392-22.556739 15.099906-26.880207l2.737344-2.423189c8.840342-2.093684 97.752348-22.138206 170.023348-22.482037l2.109034 0c73.019037 0 154.436348 19.102057 167.839613 22.37766l0.650823 1.541099 2.131547 1.017166c9.102309 4.322445 14.988366 14.868639 14.988366 26.850531 0 1.675152-0.418532 3.440355-0.852414 5.29561l-0.441045 1.88493 0.957815 4.457522-74.395384 110.586654L397.069411 177.825035zM510.415922 67.716264c-26.14752 0.135076-57.596789 3.096525-93.504604 8.810666l-9.491165 1.5104 23.896246 35.885302 157.52571 0 24.232914-36.363186-9.468652-1.541099c-34.149774-5.504364-64.896032-8.302083-91.39557-8.302083L510.415922 67.716264z"  ></path></symbol><symbol id="icon-wodeyouhuijuan" viewBox="0 0 1024 1024"><path d="M1009.770667 393.536C1018.282667 390.528 1024 382.464 1024 373.397333l0-131.242667c0-52.352-42.56-94.976-94.912-94.976L94.976 147.178667c-52.352 0-94.954667 42.624-94.954667 94.976l0 131.242667c0 9.045333 5.696 17.130667 14.250667 20.138667C64.426667 411.264 98.133333 458.858667 98.133333 512c0 53.12-33.706667 100.757333-83.882667 118.506667C5.696 633.450667 0 641.578667 0 650.624l0 131.242667c0 52.330667 42.602667 94.954667 94.954667 94.954667L929.066667 876.821333c52.330667 0 94.933333-42.624 94.933333-94.954667l0-131.242667c0-9.045333-5.674667-17.130667-14.229333-20.117333-50.218667-17.749333-83.946667-65.365333-83.946667-118.506667S959.552 411.285333 1009.770667 393.536zM883.114667 512c0 66.048 38.869333 125.717333 98.154667 152.981333l0 116.885333c0 28.778667-23.402667 52.202667-52.202667 52.202667L94.954667 834.069333c-28.8 0-52.224-23.424-52.224-52.202667l0-116.885333c59.264-27.264 98.133333-86.933333 98.133333-152.981333 0-66.048-38.869333-125.738667-98.133333-152.981333l0-116.864c0-28.8 23.402667-52.224 52.224-52.224L929.066667 189.930667c28.778667 0 52.202667 23.402667 52.202667 52.224l0 116.864C921.962667 386.282667 883.114667 445.952 883.114667 512z"  ></path><path d="M683.690667 392.533333l-144.682667 0 86.293333-86.208c8.384-8.362667 8.384-21.888 0-30.229333-8.341333-8.341333-21.824-8.341333-30.208 0L512 359.104l-83.008-82.986667c-8.384-8.362667-21.866667-8.362667-30.208 0-8.362667 8.362667-8.362667 21.866667 0 30.208l86.229333 86.208-144.768 0c-11.776 0-21.354667 9.557333-21.354667 21.354667 0 11.797333 9.578667 21.376 21.354667 21.376l150.4 0 0 79.893333L364.8 515.157333c-11.818667 0-21.376 9.557333-21.376 21.376 0 11.818667 9.557333 21.333333 21.376 21.333333l125.845333 0 0 174.869333c0 11.84 9.557333 21.376 21.354667 21.376 11.84 0 21.376-9.578667 21.376-21.376L533.376 557.866667l125.76 0c11.861333 0 21.418667-9.536 21.418667-21.333333s-9.536-21.376-21.376-21.376l-125.781333 0 0-79.893333 150.357333 0c11.776 0 21.312-9.6 21.312-21.376C705.045333 402.112 695.509333 392.533333 683.690667 392.533333z"  ></path></symbol><symbol id="icon-daifukuan01" viewBox="0 0 1024 1024"><path d="M391.809105 95.359858l217.4628 0c5.718235 0 10.354835-5.102205 10.354835-11.395538l0-8.546653c0-6.293333-4.6366-11.395538-10.354835-11.395538l-217.4628 0c-5.719258 0-10.355859 5.102205-10.355859 11.395538l0 8.546653C381.453247 90.257653 386.089847 95.359858 391.809105 95.359858z"  ></path><path d="M305.64877 389.746632l389.782448 0c5.718235 0 10.354835-5.102205 10.354835-11.395538l0-8.546653c0-6.293333-4.6366-11.395538-10.354835-11.395538L305.64877 358.408903c-5.719258 0-10.355859 5.102205-10.355859 11.395538l0 8.546653C295.292911 384.644427 299.929512 389.746632 305.64877 389.746632z"  ></path><path d="M860.412736 595.754542 860.412736 102.585423c0-20.977777-15.429411-37.986149-34.463929-37.986149L704.581622 64.599274c-10.743692 1.198292-15.273868 14.719236-15.273868 14.719236l-38.392402 69.362764c0 0-2.835581 4.306072-4.256954 5.184069-1.219781 0.7552-4.738931 0.949628-4.738931 0.949628L357.80771 154.814971c0 0-2.674922-0.339738-3.66139-0.949628-0.724501-0.448208-2.591011-2.174526-2.591011-2.174526l-40.058344-72.372308c0 0-4.530177-13.520945-15.272845-14.719236L175.201789 64.599274c-19.033495 0-34.463929 17.007349-34.463929 37.986149l0 754.434541c0 20.9788 15.430434 37.985126 34.463929 37.985126l382.28059 0c-0.002047-0.002047-0.004093-0.004093-0.00614-0.00614 38.684044 39.760562 92.759637 64.470337 152.61691 64.470337 117.593232 0 212.923414-95.329159 212.923414-212.922391C923.016563 687.630043 899.083477 634.304534 860.412736 595.754542zM854.310761 589.918627c-0.218988-0.200568-0.432859-0.406253-0.652869-0.607844C853.878926 589.511351 854.092797 589.717036 854.310761 589.918627zM850.96455 586.902944c-0.287549-0.254803-0.573051-0.512676-0.862647-0.766456C850.391499 586.390267 850.677001 586.648141 850.96455 586.902944zM175.201789 863.667362c-3.325745 0-6.031367-2.982938-6.031367-6.647397L169.170422 102.585423c0-3.665483 2.705622-6.647397 6.031367-6.647397l112.188128 0 39.893592 72.073502 2.424212 4.380774 3.566222 3.300162c3.911076 3.618411 6.048763 4.940522 6.952342 5.499248 1.477654 0.914836 5.973038 3.696182 14.328333 4.755304l1.620917 0.205685 1.63115 0 284.11278 0 0.711198 0 0.710175-0.039909c10.194176-0.562818 15.497972-3.846608 17.225313-4.916986 3.194762-1.974981 7.598049-5.362124 13.358239-14.106276l0.668219-1.017166 0.594541-1.072425 38.22458-69.062935 112.534006 0c3.324722 0 6.031367 2.981914 6.031367 6.647397l0 469.37111c-34.530444-24.153096-76.550467-38.33305-121.886001-38.33305-1.439792 0-2.874467 0.025583-4.307096 0.055259l0-7.184633c0-6.293333-4.6366-11.395538-10.354835-11.395538L305.64877 515.097548c-5.719258 0-10.355859 5.102205-10.355859 11.395538l0 8.546653c0 6.29538 4.6366 11.396561 10.355859 11.396561l331.537905 0c1.38658-0.505513 2.781346-0.995677 4.181229-1.472538-60.281945 20.546965-108.391662 67.375503-130.688481 126.8255L305.64877 671.789263c-5.719258 0-10.355859 5.102205-10.355859 11.395538l0 8.547677c0 6.294356 4.6366 11.395538 10.355859 11.395538l195.95802 0c0.282433-1.363044 0.578168-2.720971 0.887206-4.074805-3.479241 15.273868-5.323239 31.168883-5.323239 47.495734 0 43.278689 12.924357 83.533508 35.107589 117.138884-0.004093-0.00614-0.008186-0.01228-0.01228-0.01842L175.201789 863.669408zM847.305207 583.743998c-0.26606-0.224104-0.530073-0.450255-0.797156-0.673335C846.775134 583.293743 847.039147 583.520917 847.305207 583.743998zM843.547627 580.647473c-0.221034-0.178055-0.441045-0.357134-0.661056-0.533143C843.106582 580.290339 843.326593 580.469418 843.547627 580.647473zM839.734788 577.647139c-0.163729-0.12689-0.328481-0.252757-0.493234-0.379647C839.406307 577.394383 839.571059 577.520249 839.734788 577.647139zM835.868737 574.74402c-0.088004-0.064468-0.176009-0.128937-0.264013-0.192382C835.692728 574.615083 835.780733 574.678528 835.868737 574.74402zM701.857581 533.797445c-0.303922 0.011256-0.608867 0.021489-0.912789 0.033769C701.248713 533.818935 701.553659 533.808702 701.857581 533.797445zM697.232237 534.021549c-0.343831 0.021489-0.686638 0.042979-1.030469 0.064468C696.545598 534.064528 696.888406 534.040992 697.232237 534.021549zM692.459536 534.355147c-0.172939 0.01535-0.344854 0.031722-0.517793 0.046049C692.115706 534.38687 692.287621 534.369473 692.459536 534.355147zM680.063205 535.741727c-0.394996 0.055259-0.789992 0.106424-1.183965 0.164752C679.273213 535.849174 679.668209 535.796986 680.063205 535.741727zM675.686525 536.40483c-0.532119 0.086981-1.063215 0.173962-1.594311 0.265036C674.623309 536.578792 675.154405 536.491811 675.686525 536.40483zM671.063227 537.206078c-0.568958 0.105401-1.133823 0.215918-1.701758 0.325411C669.929404 537.421996 670.495292 537.310456 671.063227 537.206078zM666.400021 538.119891c-0.522909 0.10847-1.041726 0.228197-1.561565 0.339738C665.358295 538.347065 665.877111 538.228361 666.400021 538.119891zM659.509077 539.685549c-0.653893 0.158612-1.308809 0.313132-1.960655 0.478907C658.200268 539.997658 658.856207 539.844162 659.509077 539.685549zM655.051555 540.821419c-0.727571 0.193405-1.454118 0.387833-2.177596 0.589424C653.597437 541.209252 654.323984 541.015847 655.051555 540.821419zM650.470213 542.096459c-0.7552 0.220011-1.509377 0.445138-2.260483 0.673335C648.96186 542.541597 649.715013 542.316469 650.470213 542.096459zM645.903198 543.479969c-0.799202 0.251733-1.595334 0.5137-2.390443 0.775666C644.308887 543.993668 645.103995 543.731702 645.903198 543.479969zM509.358335 675.41586c-0.049119 0.1361-0.097214 0.273223-0.145309 0.409322C509.261121 675.689083 509.309216 675.55196 509.358335 675.41586zM505.630431 686.968987c-0.027629 0.093121-0.057305 0.187265-0.083911 0.280386C505.574149 687.156252 505.602801 687.062108 505.630431 686.968987zM504.702292 690.271196c-0.140193 0.51063-0.278339 1.02126-0.414439 1.532913C504.423953 691.292456 504.562099 690.781826 504.702292 690.271196zM503.572562 694.563966c-0.156566 0.627287-0.309038 1.257643-0.460488 1.886977C503.26557 695.821609 503.414973 695.191252 503.572562 694.563966zM554.005184 891.345748c0.010233 0.011256 0.021489 0.021489 0.030699 0.032746C554.025651 891.36826 554.014394 891.357004 554.005184 891.345748zM535.081183 867.826078c0.00921 0.01228 0.01842 0.024559 0.026606 0.037862C535.098579 867.850637 535.089369 867.838358 535.081183 867.826078zM538.005792 871.933629c0.00921 0.01228 0.01842 0.023536 0.025583 0.035816C538.024212 871.958188 538.015002 871.945909 538.005792 871.933629zM541.023522 875.967502c0.00921 0.013303 0.019443 0.024559 0.028653 0.037862C541.042965 875.992061 541.032732 875.980805 541.023522 875.967502zM544.13028 879.923604c0.01228 0.01535 0.024559 0.029676 0.036839 0.046049C544.155862 879.95328 544.142559 879.938953 544.13028 879.923604zM547.332205 883.808074c0.01228 0.01535 0.024559 0.028653 0.036839 0.044002C547.357787 883.836727 547.344484 883.823424 547.332205 883.808074zM550.624181 887.615796c0.01228 0.014326 0.023536 0.026606 0.035816 0.039909C550.647717 887.642402 550.63646 887.629099 550.624181 887.615796zM838.944795 875.398544c-34.417881 34.416857-80.179111 53.371558-128.851647 53.371558-48.673559 0-94.433766-18.954701-128.851647-53.371558-34.417881-34.417881-53.372581-80.179111-53.372581-128.851647 0-48.673559 18.954701-94.433766 53.372581-128.851647s80.178087-53.372581 128.851647-53.372581c48.672536 0 94.433766 18.954701 128.851647 53.372581s53.372581 80.179111 53.372581 128.851647S873.362676 840.97964 838.944795 875.398544z"  ></path><path d="M801.834596 756.008386c8.477069 0 15.349593-6.872524 15.349593-15.349593s-6.872524-15.349593-15.349593-15.349593l-59.743686 0 65.669652-85.421508c5.167696-6.721075 3.906983-16.35755-2.813069-21.524223-6.721075-5.16872-16.358573-3.906983-21.524223 2.813069l-72.494081 94.297666-72.496128-94.297666c-5.166673-6.720052-14.802124-7.981788-21.524223-2.813069-6.720052 5.166673-7.980765 14.803147-2.813069 21.524223l65.671699 85.421508-59.744709 0c-8.477069 0-15.349593 6.872524-15.349593 15.349593s6.872524 15.349593 15.349593 15.349593l75.556836 0 0 33.440623-71.920006 0c-8.477069 0-15.349593 6.872524-15.349593 15.349593s6.872524 15.349593 15.349593 15.349593l71.920006 0 0 57.341986c0 8.477069 6.872524 15.349593 15.349593 15.349593s15.349593-6.872524 15.349593-15.349593l0-57.341986 71.918983 0c8.477069 0 15.349593-6.872524 15.349593-15.349593s-6.872524-15.349593-15.349593-15.349593l-71.918983 0 0-33.440623L801.834596 756.008386z"  ></path></symbol><symbol id="icon-yiwancheng" viewBox="0 0 1024 1024"><path d="M889.679805 547.051307c0-41.48074-27.488051-76.604702-65.056692-87.821161L824.623114 320.252885c0-47.821145-38.557154-86.729294-85.951581-86.729294l-39.310308 0-87.373976-94.53405c-3.321652-3.619434-8.553817-4.706185-13.033851-2.76702L374.667192 233.523591l-85.661985 0c-47.393403 0-85.951581 38.908148-85.951581 86.729294l0 453.629591c0 47.806819 38.557154 86.706781 85.951581 86.706781l449.666326 0c47.393403 0 85.951581-38.899962 85.951581-86.706781L824.623114 634.881678C862.190731 623.665219 889.679805 588.53921 889.679805 547.051307zM600.618317 160.9149l67.11149 72.608691L433.252495 233.523591 600.618317 160.9149zM801.478997 773.881452c0 34.932604-28.181853 63.35698-62.808488 63.35698L289.005206 837.238432c-34.626635 0-62.808488-28.424376-62.808488-63.35698L226.196719 320.252885c0-34.94693 28.181853-63.379493 62.808488-63.379493l449.666326 0c34.626635 0 62.808488 28.433586 62.808488 63.379493l0 135.267776c-0.857531-0.024559-1.716084-0.038886-2.578732-0.038886L578.36243 455.481775c-6.390547 0-11.573593 5.230118-11.573593 11.675924l0 159.799496c0 6.445806 5.184069 11.675924 11.573593 11.675924l220.537835 0c0.862647 0 1.722224-0.01535 2.578732-0.038886L801.478997 773.881452zM798.900266 615.282295 589.936023 615.282295 589.936023 478.82953l208.964242 0c37.296441 0 67.636446 30.607088 67.636446 68.221778C866.536712 584.675206 836.196707 615.282295 798.900266 615.282295z"  ></path></symbol><symbol id="icon-wodedingdan" viewBox="0 0 1024 1024"><path d="M383 341l260 0c16.6 0 30-13.4 30-30 0-16.6-13.4-30-30-30L383 281c-16.6 0-30 13.4-30 30C353 327.6 366.4 341 383 341z"  ></path><path d="M383 465l260 0c16.6 0 30-13.4 30-30 0-16.6-13.4-30-30-30L383 405c-16.6 0-30 13.4-30 30C353 451.6 366.4 465 383 465z"  ></path><path d="M383 598l260 0c16.6 0 30-13.4 30-30 0-16.6-13.4-30-30-30L383 538c-16.6 0-30 13.4-30 30C353 584.6 366.4 598 383 598z"  ></path><path d="M807 690.7c0.4-2.9 0.4-5.9 0-8.9L807 203l-0.5 0c-4.5-39.9-38.3-71-79.5-71L316 132c-44.2 0-80 35.8-80 80l0 600c0 41.1 31.1 75 71 79.5l0 0.5 281 0 0-0.4c4-0.7 7.8-2.2 11.1-4.3 3.5-1.3 6.8-3.3 9.7-6l188.8-172.9c3.8-3.5 6.6-7.8 8.1-12.4l1.3 0L807 690.7zM296 812 296 212c0-11 9-20 20-20l411 0c11 0 20 9 20 20l0 437L633 649c-44.2 0-80 35.8-80 80l0 103L316 832C305 832 296 823 296 812zM708.1 709 613 796.1 613 729c0-11 9-20 20-20L708.1 709z"  ></path></symbol><symbol id="icon-jifen" viewBox="0 0 1603 1024"><path d="M801.23724 0C518.930425 0 289.23724 229.693184 289.23724 512s229.693184 512 512 512c282.311824 0 512-229.693184 512-512S1083.549065 0 801.23724 0zM801.23724 960.000939c-247.04241 0-447.995931-200.963537-447.995931-448.000939 0-247.04241 200.95352-448.000939 447.995931-448.000939S1249.23818 264.95759 1249.23818 512C1249.23818 759.037402 1048.279651 960.000939 801.23724 960.000939z"  ></path><path d="M801.23724 409.832892c-22.665682 0-43.835093-2.909902-63.543293-8.725949-19.689418-5.796014-35.216825-14.408021-46.594742-25.773417l0 34.499367c0 9.338231 4.933311 17.999071 14.782402 25.975007 9.841579 7.977188 23.235392 14.292827 40.150136 18.975716 16.914744 4.659099 35.315742 6.996787 55.205498 6.996787 19.879739 0 38.290753-2.337688 55.196733-6.996787 16.914744-4.659099 30.308557-10.998528 40.1589-18.975716 9.840327-7.975936 14.773637-16.638028 14.773637-25.975007l0-34.499367c-11.369152 11.364144-26.920349 19.953613-46.61102 25.773417C845.064821 406.925495 823.894158 409.832892 801.23724 409.832892z"  ></path><path d="M911.366511 531.161028c-11.369152 11.365396-26.920349 19.956117-46.61102 25.772165-19.69067 5.8173-40.860082 8.728454-63.516999 8.728454-22.665682 0-43.835093-2.909902-63.543293-8.728454-19.689418-5.816048-35.216825-14.382979-46.594742-25.748375l0 34.49561c0 9.340735 4.933311 18.000323 14.782402 25.977511 9.841579 7.974684 23.235392 14.292827 40.150136 18.975716 16.914744 4.659099 35.315742 6.976753 55.205498 6.976753 19.879739 0 38.290753-2.341444 55.196733-7.000543 16.914744-4.680384 30.308557-10.998528 40.1589-18.973212 9.840327-7.97844 14.773637-16.635524 14.773637-25.975007L911.367763 531.161028z"  ></path><path d="M705.86533 357.904165c9.840327 7.999726 23.235392 14.320374 40.150136 18.979472 16.931021 4.659099 35.332019 6.976753 55.221775 6.976753 19.879739 0 38.290753-2.342696 55.196733-7.000543 16.914744-4.659099 30.308557-10.998528 40.1589-18.975716 9.840327-7.97844 14.773637-16.634272 14.773637-25.975007l0-21.514994c0-9.339483-4.932058-17.996566-14.773637-25.973755-9.850344-7.975936-23.244156-14.296584-40.1589-18.975716-16.905979-4.659099-35.316994-7.000543-55.196733-7.000543-19.889756 0-38.290753 2.341444-55.221775 7.000543-16.914744 4.679132-30.309809 10.998528-40.150136 18.975716-9.849091 7.977188-14.774889 16.634272-14.774889 25.97125l0 21.540036C691.09044 341.269893 696.016238 349.928229 705.86533 357.904165z"  ></path><path d="M864.771769 479.029459c-19.706948 5.8173-40.876359 8.729706-63.534528 8.729706-22.665682 0-43.835093-2.911154-63.542041-8.729706-19.691922-5.818552-35.218077-14.404265-46.595994-25.769661l0 34.499367c0 9.339483 4.933311 17.996566 14.782402 25.973755 9.841579 7.974684 23.235392 14.294079 40.150136 18.974464 16.931021 4.659099 35.332019 7.000543 55.221775 7.000543 19.879739 0 38.281989-2.341444 55.196733-7.000543 16.913492-4.659099 30.308557-10.99978 40.1589-18.974464 9.840327-7.977188 14.774889-16.635524 14.774889-25.973755l0-34.499367C900.013636 464.625194 884.462439 473.213411 864.771769 479.029459z"  ></path><path d="M801.23724 642.725216c-22.665682 0-43.835093-2.909902-63.543293-8.725949-19.689418-5.796014-35.216825-14.408021-46.594742-25.773417l0 34.499367c0 9.338231 4.933311 17.999071 14.782402 25.975007 9.841579 7.977188 23.235392 14.292827 40.150136 18.975716 16.914744 4.659099 35.315742 6.996787 55.205498 6.996787 19.879739 0 38.290753-2.337688 55.196733-6.996787 16.914744-4.659099 30.308557-10.998528 40.1589-18.975716 9.840327-7.975936 14.773637-16.638028 14.773637-25.975007l0-34.499367c-11.369152 11.364144-26.920349 19.953613-46.61102 25.773417C845.064821 639.817818 823.894158 642.725216 801.23724 642.725216z"  ></path><path d="M801.23724 720.651488c-22.665682 0-43.835093-2.911154-63.542041-8.729706-19.691922-5.818552-35.218077-14.404265-46.595994-25.769661l0 34.499367c0 9.339483 4.933311 17.996566 14.782402 25.973755 9.841579 7.974684 23.235392 14.294079 40.150136 18.974464 16.931021 4.659099 35.332019 7.000543 55.221775 7.000543 19.879739 0 38.281989-2.341444 55.196733-7.000543 16.913492-4.659099 30.308557-10.99978 40.1589-18.974464 9.840327-7.977188 14.774889-16.635524 14.774889-25.973755l0-34.499367c-11.370404 11.365396-26.921601 19.953613-46.612272 25.769661C845.064821 717.740334 823.894158 720.651488 801.23724 720.651488z"  ></path><path d="M801.23724 798.552718c-22.665682 0-43.835093-2.909902-63.543293-8.728454-19.689418-5.816048-35.216825-14.382979-46.594742-25.748375l0 34.49561c0 9.340735 4.933311 18.000323 14.782402 25.977511 9.841579 7.974684 23.235392 14.292827 40.150136 18.975716 16.914744 4.659099 35.315742 6.976753 55.205498 6.976753 19.879739 0 38.290753-2.341444 55.196733-7.000543 16.914744-4.680384 30.308557-10.998528 40.1589-18.973212 9.840327-7.97844 14.773637-16.635524 14.773637-25.975007l0-34.499367c-11.369152 11.365396-26.920349 19.956117-46.61102 25.772165C845.064821 795.642816 823.894158 798.552718 801.23724 798.552718z"  ></path><path d="M465.847252 496.296046c-8.431704 6.829004-12.648808 14.240239-12.648808 22.234956l0 18.441065c0 7.993466 4.217104 15.407205 12.648808 22.234956 8.425443 6.849038 19.89226 12.259402 34.374156 16.248622 14.494417 3.987968 30.248456 5.972561 47.277142 5.972561 17.019921 0 32.781473-2.005879 47.255856-5.992595 14.480644-3.98922 25.94746-9.415862 34.380416-16.244866 8.425443-6.831508 12.647556-14.241491 12.647556-22.238713l0-18.419779c0-7.99597-4.223365-15.407205-12.647556-22.236208-8.432956-6.829004-19.899773-12.239368-34.380416-16.244866-14.473131-3.987968-30.235935-5.992595-47.255856-5.992595-17.028686 0-32.781473 2.004627-47.277142 5.992595C485.739512 484.056678 474.272696 489.468294 465.847252 496.296046M453.205957 640.844548 453.205957 670.379301c0 7.99597 4.224617 15.407205 12.65632 22.237461 8.425443 6.827752 19.89226 12.238116 34.374156 16.244866 14.494417 3.98922 30.248456 5.993847 47.277142 5.993847 17.019921 0 32.77396-2.004627 47.255856-5.993847 14.480644-3.987968 25.94746-9.417114 34.380416-16.244866 8.425443-6.829004 12.648808-14.242743 12.648808-22.237461l0-29.536005c-9.73515 9.730141-23.047575 17.082527-39.905974 22.062165-16.87092 4.980891-34.995202 7.47384-54.392879 7.47384-19.403937 0-37.528219-2.49295-54.400391-7.47384C476.239759 657.925822 462.946115 650.574689 453.205957 640.844548M453.205957 707.556929l0 29.532249c0 7.997222 4.224617 15.410961 12.65632 22.239965 8.425443 6.827752 19.89226 12.236864 34.374156 16.244866 14.480644 3.987968 30.234682 5.972561 47.262116 5.972561 17.019921 0 32.781473-2.004627 47.255856-5.992595 14.480644-4.00675 25.94746-9.415862 34.380416-16.243614 8.425443-6.830256 12.647556-14.242743 12.647556-22.238713l0-29.536005c-9.733897 9.730141-23.046323 17.085031-39.904722 22.063417-16.857147 4.980891-34.981429 7.472588-54.379105 7.472588-19.403937 0-37.528219-2.491697-54.401643-7.472588C476.239759 724.621927 462.946115 717.287071 453.205957 707.556929M453.205957 574.129662l0 29.536005c0 7.994718 4.224617 15.409709 12.65632 22.238713 8.425443 6.829004 19.89226 12.236864 34.374156 16.244866 14.480644 3.987968 30.234682 5.990091 47.262116 5.990091 17.019921 0 32.781473-2.000871 47.255856-5.990091 14.480644-3.987968 25.94746-9.415862 34.380416-16.244866 8.425443-6.829004 12.647556-14.243995 12.647556-22.238713L641.782378 574.129662c-9.733897 9.730141-23.046323 17.082527-39.904722 22.064669-16.857147 4.980891-34.981429 7.470084-54.379105 7.470084-19.403937 0-37.528219-2.491697-54.401643-7.470084C476.239759 591.232222 462.946115 583.859803 453.205957 574.129662"  ></path><path d="M973.325886 490.937018c-8.431704 6.829004-12.648808 14.241491-12.648808 22.234956l0 18.441065c0 7.993466 4.217104 15.407205 12.648808 22.234956 8.425443 6.849038 19.89226 12.259402 34.374156 16.248622 14.494417 3.987968 30.248456 5.972561 47.277142 5.972561 17.019921 0 32.781473-2.005879 47.255856-5.992595 14.480644-3.98922 25.94746-9.415862 34.380416-16.244866 8.425443-6.831508 12.647556-14.241491 12.647556-22.238713l0-18.419779c0-7.99597-4.222112-15.407205-12.647556-22.236208-8.432956-6.829004-19.899773-12.239368-34.380416-16.244866-14.474383-3.987968-30.235935-5.992595-47.255856-5.992595-17.028686 0-32.781473 2.004627-47.277142 5.992595C993.218146 478.69765 981.751329 484.108014 973.325886 490.937018M960.684591 635.484268l0 29.536005c0 7.99597 4.223365 15.407205 12.65632 22.237461 8.425443 6.8265 19.89226 12.238116 34.374156 16.244866 14.494417 3.98922 30.248456 5.993847 47.277142 5.993847 17.019921 0 32.77396-2.004627 47.255856-5.993847 14.480644-3.987968 25.94746-9.417114 34.380416-16.244866 8.425443-6.829004 12.648808-14.242743 12.648808-22.237461l0-29.536005c-9.73515 9.730141-23.047575 17.082527-39.905974 22.062165-16.87092 4.980891-34.995202 7.47384-54.392879 7.47384-19.403937 0-37.529471-2.49295-54.400391-7.47384C983.718393 652.565543 970.424749 645.214409 960.684591 635.484268M960.684591 702.197902l0 29.532249c0 7.997222 4.223365 15.410961 12.65632 22.239965 8.425443 6.827752 19.89226 12.236864 34.374156 16.244866 14.480644 3.987968 30.234682 5.972561 47.262116 5.972561 17.019921 0 32.781473-2.004627 47.255856-5.992595 14.480644-4.00675 25.94746-9.415862 34.380416-16.243614 8.425443-6.830256 12.647556-14.242743 12.647556-22.238713l0-29.536005c-9.733897 9.730141-23.046323 17.085031-39.904722 22.063417-16.857147 4.980891-34.981429 7.472588-54.379105 7.472588-19.403937 0-37.529471-2.491697-54.401643-7.472588C983.718393 719.261647 970.424749 711.926791 960.684591 702.197902M960.684591 568.769382l0 29.536005c0 7.994718 4.223365 15.409709 12.65632 22.238713 8.425443 6.829004 19.89226 12.236864 34.374156 16.244866 14.480644 3.987968 30.234682 5.990091 47.262116 5.990091 17.019921 0 32.781473-2.000871 47.255856-5.990091 14.480644-3.987968 25.94746-9.415862 34.380416-16.244866 8.425443-6.829004 12.647556-14.243995 12.647556-22.238713l0-29.536005c-9.733897 9.730141-23.046323 17.082527-39.904722 22.064669-16.857147 4.980891-34.981429 7.470084-54.379105 7.470084-19.403937 0-37.529471-2.491697-54.401643-7.470084C983.718393 585.871942 970.424749 578.499523 960.684591 568.769382"  ></path></symbol><symbol id="icon-lingjuandizhi" viewBox="0 0 1024 1024"><path d="M943.088 340.144 526.592 27.64C516.24 19.88 504.112 16 492 16c-12.12 0-24.24 3.88-34.592 11.64L40.912 340.144C25.28 351.872 16 370.816 16 391l0 562.488C16 988.008 42.64 1016 75.496 1016c0 0 79.44 0 146.528 0 103.688 0 91.472-81.88 91.472-81.88L313.496 641c0-34.52 26.64-62.504 59.496-62.504l238 0c32.856 0 59.504 27.984 59.504 62.504l0 298.368c0 0-3.68 75.304 81.528 76.624 68.904 0 156.464 0 156.464 0 32.856 0 59.504-27.992 59.504-62.504L967.992 391C968 370.816 958.72 351.872 943.088 340.144z"  ></path></symbol><symbol id="icon-weibiaoti2fuzhi05" viewBox="0 0 1024 1024"><path d="M633.6 217.6l108.8 0L512 64 281.6 217.6 384 217.6l0 275.2 249.6 0L633.6 217.6zM435.2 172.8 512 121.6l76.8 51.2L588.8 448 435.2 448 435.2 172.8z"  ></path><path d="M627.2 761.6l76.8-102.4 179.2 0-64 249.6L204.8 908.8l-64-249.6 179.2 0 76.8 102.4L627.2 761.6zM838.4 281.6l-147.2 0c-12.8 0-25.6 12.8-25.6 25.6 0 12.8 12.8 25.6 25.6 25.6l108.8 0c12.8 0 19.2 6.4 25.6 19.2L876.8 576c6.4 12.8-6.4 32-25.6 32l-160 0c-6.4 0-12.8 6.4-19.2 12.8l-57.6 83.2c-6.4 6.4-12.8 12.8-19.2 12.8L435.2 716.8c-6.4 0-12.8-6.4-19.2-12.8L358.4 620.8C352 614.4 345.6 608 339.2 608L172.8 608C160 608 147.2 595.2 147.2 576l51.2-224c0-12.8 12.8-19.2 25.6-19.2l108.8 0c12.8 0 25.6-12.8 25.6-25.6 0-12.8-12.8-25.6-25.6-25.6L185.6 281.6c-12.8 0-19.2 6.4-25.6 19.2L89.6 627.2c0 6.4 0 6.4 0 12.8l76.8 300.8c0 12.8 12.8 19.2 25.6 19.2l652.8 0c12.8 0 19.2-6.4 25.6-19.2l76.8-300.8c0-6.4 0-6.4 0-12.8l-76.8-326.4C857.6 288 851.2 281.6 838.4 281.6z"  ></path></symbol><symbol id="icon-shouhuodizhi" viewBox="0 0 1024 1024"><path d="M512.005117 0.346901c-282.287201 0-434.613492 213.591633-434.613492 396.730697 0 190.322673 196.84625 402.487817 429.855118 504.555447l4.758374 2.100848 4.758374-2.100848c232.997612-102.066607 429.844885-314.251194 429.844885-504.555447C946.607352 213.93751 794.292318 0.346901 512.005117 0.346901zM512.00307 526.686491c-108.035552 0-195.61419-87.579661-195.61419-195.61419S403.967518 135.458111 512.00307 135.458111c108.033505 0 195.61419 87.579661 195.61419 195.61419S620.037599 526.686491 512.00307 526.686491z"  ></path><path d="M259.848143 984.530057a246.409 38.232 0 1 0 504.303714 0 246.409 38.232 0 1 0-504.303714 0Z"  ></path></symbol><symbol id="icon-wodeshoucang" viewBox="0 0 1024 1024"><path d="M1019.733333 384c-8.533333-25.6-34.133333-46.933333-59.733333-51.2l-268.8-42.666667L580.266667 42.666667c-12.8-25.6-38.4-42.666667-68.266667-42.666667s-55.466667 17.066667-68.266667 42.666667L328.533333 290.133333l-264.533333 42.666667C34.133333 337.066667 12.8 354.133333 4.266667 384c-8.533333 25.6 0 55.466667 17.066666 76.8l196.266667 200.533333L170.666667 938.666667c-4.266667 29.866667 8.533333 55.466667 29.866666 72.533333 12.8 8.533333 29.866667 12.8 42.666667 12.8 12.8 0 25.6-4.266667 34.133333-8.533333l230.4-123.733334 230.4 123.733334c12.8 4.266667 25.6 8.533333 34.133334 8.533333 17.066667 0 29.866667-4.266667 42.666666-12.8 21.333333-17.066667 34.133333-46.933333 29.866667-72.533333l-46.933333-277.333334 196.266666-200.533333c29.866667-25.6 34.133333-51.2 25.6-76.8z"  ></path></symbol><symbol id="icon-ziyuan" viewBox="0 0 1024 1024"><path d="M512 425.353846a226.855385 226.855385 0 1 0 205.193846 322.953846 36.233846 36.233846 0 1 0-65.378461-30.326154 154.781538 154.781538 0 0 1-294.99077-65.378461A154.781538 154.781538 0 0 1 512 497.427692a157.538462 157.538462 0 0 1 140.603077 90.19077 36.233846 36.233846 0 0 0 65.378461-30.326154A228.036923 228.036923 0 0 0 512 425.353846z"  ></path><path d="M512 291.446154a351.704615 351.704615 0 1 0 351.310769 351.310769A351.704615 351.704615 0 0 0 512 291.446154z m279.236923 351.310769A279.236923 279.236923 0 1 1 512 363.52a279.630769 279.630769 0 0 1 279.236923 279.236923z"  ></path><path d="M801.083077 29.538462H222.916923a62.227692 62.227692 0 0 0-62.227692 62.227692v142.178461a114.215385 114.215385 0 0 0 39.384615 78.769231L250.486154 354.461538a36.233846 36.233846 0 1 0 45.686154-54.744615l-50.412308-39.384615a48.049231 48.049231 0 0 1-12.996923-24.418462V101.612308h558.473846v132.332307a30.326154 30.326154 0 0 1-12.996923 24.418462l-50.412308 39.384615A36.233846 36.233846 0 0 0 773.513846 354.461538l50.806154-39.384615a101.612308 101.612308 0 0 0 39.384615-78.769231V91.766154A62.227692 62.227692 0 0 0 801.083077 29.538462z"  ></path></symbol><symbol id="icon-gouwuche" viewBox="0 0 1024 1024"><path d="M289 881.2c-55.9 0-101.4-45.5-101.4-101.4 0-55.9 45.5-101.4 101.4-101.4s101.4 45.5 101.4 101.4c0 55.9-45.5 101.4-101.4 101.4z m0-161.6c-33.2 0-60.2 27-60.2 60.1 0 33.2 27 60.1 60.2 60.1s60.2-27 60.2-60.1c-0.1-33.1-27.1-60.1-60.2-60.1zM566.2 881.2c-55.9 0-101.4-45.5-101.4-101.4 0-55.9 45.5-101.4 101.4-101.4s101.4 45.5 101.4 101.4c0 55.9-45.5 101.4-101.4 101.4z m0-161.6c-33.2 0-60.2 27-60.2 60.1 0 33.2 27 60.1 60.2 60.1s60.2-27 60.2-60.1c-0.1-33.1-27.1-60.1-60.2-60.1zM648.4 640.8H198.3L86.9 250.6h567.2l45.7-107.7h163.5c40.7 0 73.8 33.4 73.8 74.5 0 41-33.1 74.3-73.8 74.3-5.1 0-47.7 0.1-70.2 0.2L648.4 640.8z m-419-41.3h391.4l144.7-348.9h13.7s77.1-0.2 84-0.2c17.9 0 32.6-14.8 32.6-33 0-18-14.9-33.2-32.6-33.2H727l-45.7 107.7H141.6l87.8 307.6z"  ></path></symbol><symbol id="icon-yiguanbigongdanshu" viewBox="0 0 1025 1024"><path d="M576 64H256a64.19 64.19 0 0 0-64 64v768a64.19 64.19 0 0 0 64 64h512a64.19 64.19 0 0 0 64-64V320z m94.39 687.53l-45.25 45.25L512 683.65 398.86 796.78l-45.25-45.25 113.14-113.14-113.14-113.14L398.86 480 512 593.14 625.14 480l45.25 45.25-113.14 113.14zM576 320V128l192 192z"  ></path></symbol><symbol id="icon-shouhoukefu" viewBox="0 0 1024 1024"><path d="M824.2 360.7C809 305.8 744.7 128 512.1 128c-230.8 0-297 177.8-310.2 232.7-43.5 17-104 62.4-104 151.3 0 87 60.5 136.2 102.2 155.1 5.7 34.1 22.7 109.7 96.5 155.1 53 34.1 117.3 41.6 160.8 43.5 9.5 18.9 28.4 30.3 49.2 30.3 32.2 0 56.8-24.6 56.8-56.8 0-30.3-24.6-56.8-56.8-56.8-22.7 0-41.6 13.2-51.1 34.1-37.8-1.9-90.8-9.5-134.3-35.9-70-43.5-73.8-128.6-73.8-132.4V383.4c3.8-22.7 45.4-204.3 264.8-204.3S773.3 362.6 777 383.4v266.7c0 7.6 3.8 15.1 9.5 20.8 3.8 3.8 9.5 5.7 15.1 5.7 1.9 0 5.7 0 7.6-1.9 41.6-13.2 119.2-62.4 119.2-160.8-0.2-90.8-62.6-136.2-104.2-153.2zM198 608.5c-22.7-17-51.1-45.4-51.1-96.5s28.4-79.5 51.1-92.7v189.2z m630 0V419.3c22.7 15.1 51.1 43.5 51.1 92.7s-28.4 79.5-51.1 96.5z"  ></path></symbol><symbol id="icon-wodeyuyue" viewBox="0 0 1024 1024"><path d="M868.864 366.08h-808.96v61.44h808.96v-61.44zM261.632 281.088c-16.896 0-30.72-13.824-30.72-30.72V104.448c0-16.896 13.824-30.72 30.72-30.72s30.72 13.824 30.72 30.72v145.92c0 16.896-13.824 30.72-30.72 30.72zM161.792 542.72c0-16.896 13.824-30.72 30.72-30.72h145.92c16.896 0 30.72 13.824 30.72 30.72s-13.824 30.72-30.72 30.72H192.512c-16.896 0-30.72-13.824-30.72-30.72zM747.52 603.136c16.896 0 30.72 13.824 30.72 30.72V711.68c0 16.896-13.824 30.72-30.72 30.72s-30.72-13.824-30.72-30.72v-78.336c0-16.896 13.824-30.208 30.72-30.208z"  ></path><path d="M858.624 715.264c0 16.896-13.824 30.72-30.72 30.72h-78.336c-16.896 0-30.72-13.824-30.72-30.72s13.824-30.72 30.72-30.72h78.336c16.896 0 30.72 13.824 30.72 30.72zM161.792 706.56c0-16.896 13.824-30.72 30.72-30.72h145.92c16.896 0 30.72 13.824 30.72 30.72s-13.824 30.72-30.72 30.72H192.512c-16.896 0-30.72-13.824-30.72-30.72zM666.112 281.088c-16.896 0-30.72-13.824-30.72-30.72V104.448c0-16.896 13.824-30.72 30.72-30.72s30.72 13.824 30.72 30.72v145.92c0 16.896-13.824 30.72-30.72 30.72z"  ></path><path d="M458.752 873.472m-30.72 0a30.72 30.72 0 1 0 61.44 0 30.72 30.72 0 1 0-61.44 0Z"  ></path><path d="M752.64 541.696c93.184 0 168.96 75.776 168.96 168.96s-75.776 168.96-168.96 168.96-168.96-75.776-168.96-168.96 75.776-168.96 168.96-168.96m0-61.44c-127.488 0-230.4 102.912-230.4 230.4s102.912 230.4 230.4 230.4 230.4-102.912 230.4-230.4-102.912-230.4-230.4-230.4z"  ></path><path d="M460.8 842.752H175.104c-37.376 0-68.608-30.72-68.608-68.608V248.32c0-37.376 30.72-68.608 68.608-68.608h578.048c37.376 0 68.608 30.72 68.608 68.608v177.664h60.416V250.88c0-72.704-58.88-131.584-131.584-131.584H178.176C105.472 119.296 46.08 178.176 46.08 250.88v520.704c0 72.704 58.88 131.584 131.584 131.584H460.8v-60.416z"  ></path></symbol><symbol id="icon-buqiajuan" viewBox="0 0 1024 1024"><path d="M941.511111 409.6l25.6-2.844444V224.711111c0-48.355556-36.977778-85.333333-85.333333-85.333333H142.222222c-48.355556 0-85.333333 36.977778-85.333333 85.333333v184.888889l19.911111 5.688889c39.822222 14.222222 65.422222 51.2 65.422222 93.866667 0 42.666667-25.6 79.644444-65.422222 93.866666l-19.911111 5.688889v184.888889c0 48.355556 36.977778 85.333333 85.333333 85.333333h739.555556c48.355556 0 85.333333-36.977778 85.333333-85.333333v-182.044444l-25.6-2.844445c-51.2-5.688889-88.177778-48.355556-88.177778-99.555555s36.977778-93.866667 88.177778-99.555556zM910.222222 659.911111v133.688889c0 17.066667-11.377778 28.444444-28.444444 28.444444H142.222222c-17.066667 0-28.444444-11.377778-28.444444-28.444444v-145.066667c51.2-25.6 85.333333-79.644444 85.333333-139.377777s-34.133333-113.777778-85.333333-139.377778V224.711111c0-17.066667 11.377778-28.444444 28.444444-28.444444h739.555556c17.066667 0 28.444444 11.377778 28.444444 28.444444v133.688889c-65.422222 19.911111-113.777778 79.644444-113.777778 150.755556s48.355556 130.844444 113.777778 150.755555z"  ></path><path d="M696.888889 480.711111h-113.777778c-17.066667 0-28.444444 11.377778-28.444444 28.444445s11.377778 28.444444 28.444444 28.444444h113.777778c17.066667 0 28.444444-11.377778 28.444444-28.444444s-11.377778-28.444444-28.444444-28.444445zM440.888889 480.711111h-113.777778c-17.066667 0-28.444444 11.377778-28.444444 28.444445s11.377778 28.444444 28.444444 28.444444h113.777778c17.066667 0 28.444444-11.377778 28.444444-28.444444s-11.377778-28.444444-28.444444-28.444445z"  ></path></symbol><symbol id="icon-kuaidi-" viewBox="0 0 1024 1024"><path d="M292.6799 823.7c-2.32 2.57-2.41 2.77-1.81 2.13s1.1-1.29 1.66-1.93zM750.5899 841.92l0.37-0.19c-1.62 0.59-2.51 0.94-2.91 1.11l1.35-0.46z"  ></path><path d="M1024.0099 741.39c-0.54-12.16-9.79-22.19-22.3-22.29l-63.15-0.51-100.62-0.81-23.06-0.19c-12-0.1-22.39 10.29-22.3 22.3 0.05 6.16 0 12.31-0.37 18.46-0.3 5.54-1.3 11.11-1.46 16.63 0.21-7.2 0-0.29-0.31 1.73-0.4 2.42-0.84 4.83-1.34 7.24-0.91 4.45-2 8.88-3.31 13.24q-1.6 5.4-3.67 10.66c-0.08 0.17-0.17 0.35-0.26 0.57q-1.26 2.72-2.65 5.37c-1.49 2.8-3.1 5.54-4.85 8.18-0.66 1-1.36 2-2.06 2.95l-0.68 0.84a80.58 80.58 0 0 1-5.6 5.94c-0.88 0.84-1.79 1.65-2.71 2.46-1.9 0.61-4.53 3.29-6.18 4.28-2 1.2-4.05 2.29-6.15 3.29l1.67-0.61c-0.68 0.25-1.36 0.52-2 0.8-1.3 0.61-3.57 1.36-2.51 0.91-1.64 0.56-3.29 1.08-5 1.54-1.84 0.49-3.69 0.93-5.55 1.3-0.61 0.12-1.21 0.22-1.81 0.32a88.6 88.6 0 0 1-14.75 0.27l-1.71-0.17a108.17 108.17 0 0 1-13.52-3.09c-1.51-0.47-3-1-4.5-1.55l0.88 0.46c-0.4-0.21-0.81-0.39-1.22-0.58l-0.24-0.09a16.3 16.3 0 0 1-2.16-1 76.59 76.59 0 0 1-8.78-5.18 7.57 7.57 0 0 1-1.27-0.9l-0.17-0.15a10.81 10.81 0 0 0-1.4-1l0.79 0.45c-0.9-0.79-1.8-1.57-2.67-2.39-2.64-2.51-4.77-5.49-7.34-8l0.92 0.91a15.4 15.4 0 0 1-1.14-1.42q-1.25-1.83-2.4-3.71a95.38 95.38 0 0 1-5-9.23c-0.24-0.49-0.46-1-0.68-1.48-0.4-1-0.81-2.06-1.18-3.1q-1.77-4.92-3.13-10t-2.36-10.18c-0.3-1.52-0.57-3-0.82-4.57l-0.21-1.34c-0.57-5.14-1-10.28-1.17-15.46a128.6 128.6 0 0 1 0.3-16.07c1.14-12-11.14-22.3-22.3-22.3H338.7299c-12.8 0-21.28 10.26-22.3 22.3-0.27 3.27-0.58 6.53-0.95 9.78-0.11 1-0.24 2-0.37 3v0.27c-0.92 5.67-1.87 11.31-3.13 16.91a174.93 174.93 0 0 1-7.76 25.74l0.49-1c-0.27 0.57-0.52 1.16-0.77 1.74l-0.11 0.27c-0.07 0.14-0.13 0.29-0.19 0.43-0.79 1.72-1.6 3.43-2.46 5.12a115.18 115.18 0 0 1-5.47 9.6c-0.88 1.39-1.79 2.75-2.74 4.1l-0.25 0.33 0.66-0.73-0.81 0.93c-0.55 0.7-1.26 1.5-1.66 1.93-1.25 1.47-2.49 2.95-3.86 4.34q-2.79 2.83-5.83 5.39c-0.7 0.5-1.39 1-2.11 1.47-1.9 1.27-3.87 2.46-5.89 3.54-1.71 0.92-6.14 2.59-5.63 2.43a62.73 62.73 0 0 1-6.26 1.87c-1 0.24-2 0.44-3.06 0.63l2.13-0.18c-0.7 0.06-1.4 0.16-2.09 0.23h-0.42c-0.38 0.07-0.76 0.15-1.15 0.21-1.81 0.33-4.61 0.33 0.12-0.14-2.33 0.11-4.63 0-7 0-3.24 0-6.46 0.38-9.72 0.29-1.3 0-2.6-0.11-3.89-0.21l0.79 0.23a7.89 7.89 0 0 0-1.3-0.27l-0.69-0.06a7.54 7.54 0 0 1-1.47-0.28 68.25 68.25 0 0 1-9.32-2.53l-1-0.39c-1.39-0.71-2.81-1.37-4.18-2.14-1.57-0.88-3.35-1.81-5-2.87l-0.52-0.48c-0.64-0.58-1.33-1.1-2-1.67q-2-1.69-3.78-3.52c-2.13-2.11-4.09-4.36-6-6.66-1.14-1.63-2.29-3.26-3.37-4.93a130.08 130.08 0 0 1-9-16.63c0-0.1-0.1-0.22-0.15-0.34 0.12 0.31 0.24 0.63 0.37 1-0.58-1.58-1.26-3.12-1.86-4.69q-1.6-4.23-3-8.53a220.54 220.54 0 0 1-8-34c-0.1-0.62-0.19-1.23-0.28-1.84-0.14-1.22-0.29-2.43-0.41-3.65s-0.27-2.7-0.35-4.06c-0.72-12-9.63-22.3-22.3-22.3H44.6199v-278l40.29-35 74.64-64.91 9.64-8.39h147.24v105.77c0 11.66 10.26 22.84 22.3 22.3s22.3-9.8 22.3-22.3V318 177.57h602.13c8.46 0 16.94 0.15 25.4 0h1.08c11.66 0 22.84-10.25 22.3-22.29s-9.8-22.3-22.3-22.3H365.2099c-8.46 0-16.94-0.15-25.39 0h-1.09a22.62 22.62 0 0 0-22.3 22.3V294.2H163.6599a27.77 27.77 0 0 0-18.52 6.56c-1.25 1-2.45 2.12-3.67 3.19l-56.78 49.37-65.74 57.16c-4.07 3.55-8.62 6.9-12.39 10.78C-0.5401 428.57 0.0099 436.5 0.0099 445.34v302.08a22.62 22.62 0 0 0 22.3 22.3h111.19c6.27 40.17 23.47 81.13 56.43 104.87 19.17 13.81 42.6 16.79 65.57 15.75 21.59-1 41.26-9.71 57.65-23.61 28.06-23.81 40-61 45.33-97H616.0099a203 203 0 0 0 4.53 30.87c7.22 32.51 26.22 64.35 57.24 79a109.27 109.27 0 0 0 30.75 9.69c1.45 0.21 3.89 0.54 5.53 0.75s3 0.44 4.53 0.6a80.76 80.76 0 0 0 14.75 0.22c24-1.82 46.58-10.8 64.16-27.62 27-25.86 36.7-64.08 39-100.87l41.45 0.33 100.63 0.82 23 0.18c11.78 0.09 22.95-10.33 22.43-22.31z m-810.4 95.75a17.18 17.18 0 0 1-2.56-2.08c-0.11-0.06 1.64 1.34 2.56 2.08z m55 5.51l3.2-1.13z m494-7.85l-1.31 1.08c-2.17 1.78-0.15 0.01 1.26-1.08z"  ></path><path d="M678.6399 824c1.5 1.68 3.12 3.1 0 0zM235.7299 845.7h0.51c-3.89-1.12-3.87-0.73-2.67-0.38h0.12c0.66 0.2 1.32 0.27 2.04 0.38zM258.2299 845.5l-1.41 0.14 1-0.07zM689.2399 834.67c0.18 0.13 0.37 0.24 0.54 0.37 0.94 0.51 1.14 0.26-2-1.59l0.61 0.54c0.25 0.24 0.55 0.48 0.85 0.68zM304.0999 803.37l0.08-0.21c-2 4.26-1.07 2.48-0.39 1 0-0.09 0.07-0.18 0.11-0.27s0.11-0.37 0.2-0.52zM701.0099 841.36l0.34 0.12c-2.63-1.33-3.11-1.5-2.74-1.26l0.84 0.43c0.46 0.25 0.98 0.48 1.56 0.71zM989.6399 422.27H686.7899c-11.67 0-22.84 10.26-22.3 22.3s9.8 22.3 22.3 22.3h302.85c11.66 0 22.84-10.26 22.3-22.3s-9.8-22.3-22.3-22.3z"  ></path></symbol></svg>',
+		l = (c = document.getElementsByTagName("script"))[c.length - 1].getAttribute("data-injectcss");
+	if (l && !i.__iconfont__svg__cssinject__) {
+		i.__iconfont__svg__cssinject__ = !0;
+		try {
+			document.write(
+				"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>"
+			)
+		} catch (c) {
+			console && console.log(c)
+		}
+	}! function(c) {
+		if (document.addEventListener)
+			if (~["complete", "loaded", "interactive"].indexOf(document.readyState)) setTimeout(c, 0);
+			else {
+				var l = function() {
+					document.removeEventListener("DOMContentLoaded", l, !1), c()
+				};
+				document.addEventListener("DOMContentLoaded", l, !1)
+			}
+		else document.attachEvent && (t = c, a = i.document, h = !1, o = function() {
+			h || (h = !0, t())
+		}, (e = function() {
+			try {
+				a.documentElement.doScroll("left")
+			} catch (c) {
+				return void setTimeout(e, 50)
+			}
+			o()
+		})(), a.onreadystatechange = function() {
+			"complete" == a.readyState && (a.onreadystatechange = null, o())
+		});
+		var t, a, h, o, e
+	}(function() {
+		var c, l;
+		(c = document.createElement("div")).innerHTML = t, t = null, (l = c.getElementsByTagName("svg")[0]) && (l.setAttribute(
+				"aria-hidden", "true"), l.style.position = "absolute", l.style.width = 0, l.style.height = 0, l.style.overflow =
+			"hidden",
+			function(c, l) {
+				l.firstChild ? function(c, l) {
+					l.parentNode.insertBefore(c, l)
+				}(c, l.firstChild) : l.appendChild(c)
+			}(l, document.body))
+	})
+}(window);
diff --git a/static/iconfont/iconfont.svg b/static/iconfont/iconfont.svg
new file mode 100644
index 0000000..2f889f5
--- /dev/null
+++ b/static/iconfont/iconfont.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="iconfont" horiz-adv-x="1024" >
+  <font-face
+    font-family="iconfont"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    ascent="896"
+    descent="-128"
+  />
+    <missing-glyph />
+    
+    <glyph glyph-name="31daishouhuo" unicode="&#58880;" d="M841.530179 758.220007 366.132818 758.220007c-49.562812 0-89.855494-40.144302-89.855494-89.499383l0-131.069151-172.015725-99.067296-6.299473-4.189416 0.713244-1.218758 0.029676-0.118704c-3.922333-4.694929-6.062066-10.54824-6.062066-16.58063l0-275.063683c0-16.075117 12.063757-29.1499 26.891464-29.1499 14.857383 0 26.921139 13.103436 26.921139 29.238928L146.455583 401.026792l168.746262 97.373725c11.707646 4.130064 19.552312 15.124466 19.552312 27.336602L334.754157 664.412504c0 19.552312 16.015765 35.479049 35.68678 35.479049l466.750423 0c19.671015 0 35.68678-15.926738 35.68678-35.479049l0-512.034792c0-16.104793 13.104459-29.179576 29.238928-29.179576 16.134469 0 29.238928 13.104459 29.238928 29.238928L931.355997 668.721647C931.355997 718.076728 891.063315 758.220007 841.530179 758.220007zM741.957369 239.648334c-55.595202 0-102.900601-39.49041-112.973004-94.104261l-204.284663 0.118704c-10.132778 54.555523-57.437154 93.985558-112.973004 93.985558-63.647599 0-115.439172-51.554166-115.439172-114.934682s51.791573-114.934682 115.439172-114.934682c51.67287 0 97.194646 34.558074 111.071701 84.209914l208.117968-0.089028c13.906731-49.592488 59.398832-84.120886 111.042026-84.120886 63.647599 0 115.409496 51.554166 115.409496 114.934682S805.604968 239.648334 741.957369 239.648334zM741.957369 70.485587c-30.070876 0-54.525847 24.336268-54.525847 54.228065 0 29.892821 24.454972 54.228065 54.525847 54.228065s54.525847-24.336268 54.525847-54.228065C796.483216 94.821855 772.028245 70.485587 741.957369 70.485587zM311.726697 70.485587c-30.070876 0-54.525847 24.336268-54.525847 54.228065 0 29.892821 24.454972 54.228065 54.525847 54.228065 30.0412 0 54.496172-24.336268 54.496172-54.228065C366.221846 94.821855 341.766874 70.485587 311.726697 70.485587zM224.930889 322.848245c0-15.540951 12.687974-28.199249 28.317952-28.199249l109.526509 0.029676c15.421224 0 27.575032 4.605901 36.162618 13.727653 13.638625 14.470573 12.539594 35.003212 12.509918 35.121915l0 85.814458c0 15.540951-12.687974 28.199249-28.317952 28.199249s-28.317952-12.658298-28.317952-28.199249l0.029676-78.2072-101.652168 0C237.589187 351.047494 224.930889 338.35952 224.930889 322.848245z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wodeqianbao" unicode="&#58917;" d="M510.027066-206.883469c-310.781162 0-449.376731 106.263186-449.376731 344.549244 0 188.549284 149.627832 393.97084 333.539492 457.902918l233.69346-0.329505c182.468798-63.797002 331.50516-269.12953 331.513346-457.573413C959.39561-100.61926 820.807205-206.883469 510.027066-206.883469zM403.554102 530.933603c-34.134425-13.268188-67.544349-32.459273-99.323123-57.051367-35.151591-27.239388-66.721611-59.758012-93.818759-96.66048-27.224038-37.081547-48.516993-76.631308-63.288418-117.526717-14.981203-41.434691-22.572088-82.479503-22.572088-122.029264 0-50.379411 7.067976-93.51893 21.008476-128.222313 13.223163-32.967856 32.766264-59.32413 59.728336-80.595596 28.959565-22.825868 67.709101-40.431851 115.179252-52.309366 51.785433-12.938684 115.559922-19.505239 189.559287-19.505239 73.991178 0 137.765667 6.566556 189.5511 19.505239 47.462988 11.876492 86.212524 29.468149 115.179252 52.309366 26.977421 21.300119 46.520523 47.657416 59.735499 80.595596 13.941524 34.733059 21.001313 77.872578 21.001313 128.222313 0 39.549761-7.599072 80.609922-22.579251 122.029264-14.771425 40.926108-36.06438 80.46052-63.281255 117.526717-27.088962 36.916794-58.658981 69.436442-93.818759 96.66048-31.794124 24.591071-65.187675 43.783179-99.255585 57.020668l-211.94411 0.418532L403.554102 530.933603zM500.326123-32.409762c-23.320125 0-42.294268 18.98233-42.294268 42.302455 0 2.692319 0.284479 5.445012 0.845251 8.196683l1.480724 7.389294-2.169409 0 0 39.041178-83.751473 0.045025c-18.039865 0-32.714076 14.59951-32.714076 32.549324 0 17.97949 14.629185 32.608675 32.601512 32.608675l5.653767 0 0.01535 0.104377L458.189444 129.827249 458.189444 180.790968l-81.395822 0-2.273786 0.059352c-18.107403 0-32.79594 14.613836-32.79594 32.578999s14.629185 32.594349 32.601512 32.594349l5.467525 0 0.01535 0.074701 70.198805 0 1.196245 4.6366c0.441045 1.749854 1.166569 3.261277 2.213411 4.622274l3.365654 4.247744-90.871637 90.856287c-8.331759 8.316409-4.823865 25.399483 7.816013 38.053688 7.66661 7.673773 17.404392 12.251022 26.050306 12.251022 4.966105 0 9.109472-1.541099 11.989055-4.427846l89.562828-89.585341 83.115999 88.6132c3.829212 4.158716 9.647731 6.446829 16.394389 6.446829 9.610892 0 19.707854-4.39817 27.007097-11.756765 13.9712-14.120602 19.310811-24.276916 7.52437-37.560454l-92.090395-94.132914-0.994654-4.771677-1.02433-5.564739 6.087649-1.765203 77.266781-0.164752 1.75804-0.090051c17.994839-0.135076 32.564673-14.748912 32.564673-32.594349 0-17.830087-14.531971-32.429597-32.391734-32.549324l-4.009314-0.074701-80.415494 0 0-50.962695 82.435501 0 1.772366-0.119727c18.032702-0.135076 32.608675-14.748912 32.608675-32.578999 0-17.845437-14.531971-32.444946-32.399921-32.564673l-84.416622-0.045025 0-40.702004-0.441045-1.779529 0.029676-3.290953c0.590448-3.261277 0.912789-6.028297 0.912789-8.855692C542.621415-13.427432 523.646248-32.409762 500.326123-32.409762zM397.069411 634.175989 323.130422 745.24155l0.276293 0.972141-0.171915 3.948939c-0.61296 2.857071-1.001817 4.577249-1.001817 6.238075 0 12.011568 5.92392 22.556739 15.099906 26.880207l2.737344 2.423189c8.840342 2.093684 97.752348 22.138206 170.023348 22.482037l2.109034 0c73.019037 0 154.436348-19.102057 167.839613-22.37766l0.650823-1.541099 2.131547-1.017166c9.102309-4.322445 14.988366-14.868639 14.988366-26.850531 0-1.675152-0.418532-3.440355-0.852414-5.29561l-0.441045-1.88493 0.957815-4.457522-74.395384-110.586654L397.069411 634.174965zM510.415922 744.283736c-26.14752-0.135076-57.596789-3.096525-93.504604-8.810666l-9.491165-1.5104 23.896246-35.885302 157.52571 0 24.232914 36.363186-9.468652 1.541099c-34.149774 5.504364-64.896032 8.302083-91.39557 8.302083L510.415922 744.283736z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wodeyouhuijuan" unicode="&#59374;" d="M1009.770667 502.464C1018.282667 505.472 1024 513.536 1024 522.602667l0 131.242667c0 52.352-42.56 94.976-94.912 94.976L94.976 748.821333c-52.352 0-94.954667-42.624-94.954667-94.976l0-131.242667c0-9.045333 5.696-17.130667 14.250667-20.138667C64.426667 484.736 98.133333 437.141333 98.133333 384c0-53.12-33.706667-100.757333-83.882667-118.506667C5.696 262.549333 0 254.421333 0 245.376l0-131.242667c0-52.330667 42.602667-94.954667 94.954667-94.954667L929.066667 19.178667c52.330667 0 94.933333 42.624 94.933333 94.954667l0 131.242667c0 9.045333-5.674667 17.130667-14.229333 20.117333-50.218667 17.749333-83.946667 65.365333-83.946667 118.506667S959.552 484.714667 1009.770667 502.464zM883.114667 384c0-66.048 38.869333-125.717333 98.154667-152.981333l0-116.885333c0-28.778667-23.402667-52.202667-52.202667-52.202667L94.954667 61.930667c-28.8 0-52.224 23.424-52.224 52.202667l0 116.885333c59.264 27.264 98.133333 86.933333 98.133333 152.981333 0 66.048-38.869333 125.738667-98.133333 152.981333l0 116.864c0 28.8 23.402667 52.224 52.224 52.224L929.066667 706.069333c28.778667 0 52.202667-23.402667 52.202667-52.224l0-116.864C921.962667 509.717333 883.114667 450.048 883.114667 384zM683.690667 503.466667l-144.682667 0 86.293333 86.208c8.384 8.362667 8.384 21.888 0 30.229333-8.341333 8.341333-21.824 8.341333-30.208 0L512 536.896l-83.008 82.986667c-8.384 8.362667-21.866667 8.362667-30.208 0-8.362667-8.362667-8.362667-21.866667 0-30.208l86.229333-86.208-144.768 0c-11.776 0-21.354667-9.557333-21.354667-21.354667 0-11.797333 9.578667-21.376 21.354667-21.376l150.4 0 0-79.893333L364.8 380.842667c-11.818667 0-21.376-9.557333-21.376-21.376 0-11.818667 9.557333-21.333333 21.376-21.333333l125.845333 0 0-174.869333c0-11.84 9.557333-21.376 21.354667-21.376 11.84 0 21.376 9.578667 21.376 21.376L533.376 338.133333l125.76 0c11.861333 0 21.418667 9.536 21.418667 21.333333s-9.536 21.376-21.376 21.376l-125.781333 0 0 79.893333 150.357333 0c11.776 0 21.312 9.6 21.312 21.376C705.045333 493.888 695.509333 503.466667 683.690667 503.466667z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="daifukuan01" unicode="&#58918;" d="M391.809105 800.640142l217.4628 0c5.718235 0 10.354835 5.102205 10.354835 11.395538l0 8.546653c0 6.293333-4.6366 11.395538-10.354835 11.395538l-217.4628 0c-5.719258 0-10.355859-5.102205-10.355859-11.395538l0-8.546653C381.453247 805.742347 386.089847 800.640142 391.809105 800.640142zM305.64877 506.253368l389.782448 0c5.718235 0 10.354835 5.102205 10.354835 11.395538l0 8.546653c0 6.293333-4.6366 11.395538-10.354835 11.395538L305.64877 537.591097c-5.719258 0-10.355859-5.102205-10.355859-11.395538l0-8.546653C295.292911 511.355573 299.929512 506.253368 305.64877 506.253368zM860.412736 300.245458 860.412736 793.414577c0 20.977777-15.429411 37.986149-34.463929 37.986149L704.581622 831.400726c-10.743692-1.198292-15.273868-14.719236-15.273868-14.719236l-38.392402-69.362764c0 0-2.835581-4.306072-4.256954-5.184069-1.219781-0.7552-4.738931-0.949628-4.738931-0.949628L357.80771 741.185029c0 0-2.674922 0.339738-3.66139 0.949628-0.724501 0.448208-2.591011 2.174526-2.591011 2.174526l-40.058344 72.372308c0 0-4.530177 13.520945-15.272845 14.719236L175.201789 831.400726c-19.033495 0-34.463929-17.007349-34.463929-37.986149l0-754.434541c0-20.9788 15.430434-37.985126 34.463929-37.985126l382.28059 0c-0.002047 0.002047-0.004093 0.004093-0.00614 0.00614 38.684044-39.760562 92.759637-64.470337 152.61691-64.470337 117.593232 0 212.923414 95.329159 212.923414 212.922391C923.016563 208.369957 899.083477 261.695466 860.412736 300.245458zM854.310761 306.081373c-0.218988 0.200568-0.432859 0.406253-0.652869 0.607844C853.878926 306.488649 854.092797 306.282964 854.310761 306.081373zM850.96455 309.097056c-0.287549 0.254803-0.573051 0.512676-0.862647 0.766456C850.391499 309.609733 850.677001 309.351859 850.96455 309.097056zM175.201789 32.332638c-3.325745 0-6.031367 2.982938-6.031367 6.647397L169.170422 793.414577c0 3.665483 2.705622 6.647397 6.031367 6.647397l112.188128 0 39.893592-72.073502 2.424212-4.380774 3.566222-3.300162c3.911076-3.618411 6.048763-4.940522 6.952342-5.499248 1.477654-0.914836 5.973038-3.696182 14.328333-4.755304l1.620917-0.205685 1.63115 0 284.11278 0 0.711198 0 0.710175 0.039909c10.194176 0.562818 15.497972 3.846608 17.225313 4.916986 3.194762 1.974981 7.598049 5.362124 13.358239 14.106276l0.668219 1.017166 0.594541 1.072425 38.22458 69.062935 112.534006 0c3.324722 0 6.031367-2.981914 6.031367-6.647397l0-469.37111c-34.530444 24.153096-76.550467 38.33305-121.886001 38.33305-1.439792 0-2.874467-0.025583-4.307096-0.055259l0 7.184633c0 6.293333-4.6366 11.395538-10.354835 11.395538L305.64877 380.902452c-5.719258 0-10.355859-5.102205-10.355859-11.395538l0-8.546653c0-6.29538 4.6366-11.396561 10.355859-11.396561l331.537905 0c1.38658 0.505513 2.781346 0.995677 4.181229 1.472538-60.281945-20.546965-108.391662-67.375503-130.688481-126.8255L305.64877 224.210737c-5.719258 0-10.355859-5.102205-10.355859-11.395538l0-8.547677c0-6.294356 4.6366-11.395538 10.355859-11.395538l195.95802 0c0.282433 1.363044 0.578168 2.720971 0.887206 4.074805-3.479241-15.273868-5.323239-31.168883-5.323239-47.495734 0-43.278689 12.924357-83.533508 35.107589-117.138884-0.004093 0.00614-0.008186 0.01228-0.01228 0.01842L175.201789 32.330592zM847.305207 312.256002c-0.26606 0.224104-0.530073 0.450255-0.797156 0.673335C846.775134 312.706257 847.039147 312.479083 847.305207 312.256002zM843.547627 315.352527c-0.221034 0.178055-0.441045 0.357134-0.661056 0.533143C843.106582 315.709661 843.326593 315.530582 843.547627 315.352527zM839.734788 318.352861c-0.163729 0.12689-0.328481 0.252757-0.493234 0.379647C839.406307 318.605617 839.571059 318.479751 839.734788 318.352861zM835.868737 321.25598c-0.088004 0.064468-0.176009 0.128937-0.264013 0.192382C835.692728 321.384917 835.780733 321.321472 835.868737 321.25598zM701.857581 362.202555c-0.303922-0.011256-0.608867-0.021489-0.912789-0.033769C701.248713 362.181065 701.553659 362.191298 701.857581 362.202555zM697.232237 361.978451c-0.343831-0.021489-0.686638-0.042979-1.030469-0.064468C696.545598 361.935472 696.888406 361.959008 697.232237 361.978451zM692.459536 361.644853c-0.172939-0.01535-0.344854-0.031722-0.517793-0.046049C692.115706 361.61313 692.287621 361.630527 692.459536 361.644853zM680.063205 360.258273c-0.394996-0.055259-0.789992-0.106424-1.183965-0.164752C679.273213 360.150826 679.668209 360.203014 680.063205 360.258273zM675.686525 359.59517c-0.532119-0.086981-1.063215-0.173962-1.594311-0.265036C674.623309 359.421208 675.154405 359.508189 675.686525 359.59517zM671.063227 358.793922c-0.568958-0.105401-1.133823-0.215918-1.701758-0.325411C669.929404 358.578004 670.495292 358.689544 671.063227 358.793922zM666.400021 357.880109c-0.522909-0.10847-1.041726-0.228197-1.561565-0.339738C665.358295 357.652935 665.877111 357.771639 666.400021 357.880109zM659.509077 356.314451c-0.653893-0.158612-1.308809-0.313132-1.960655-0.478907C658.200268 356.002342 658.856207 356.155838 659.509077 356.314451zM655.051555 355.178581c-0.727571-0.193405-1.454118-0.387833-2.177596-0.589424C653.597437 354.790748 654.323984 354.984153 655.051555 355.178581zM650.470213 353.903541c-0.7552-0.220011-1.509377-0.445138-2.260483-0.673335C648.96186 353.458403 649.715013 353.683531 650.470213 353.903541zM645.903198 352.520031c-0.799202-0.251733-1.595334-0.5137-2.390443-0.775666C644.308887 352.006332 645.103995 352.268298 645.903198 352.520031zM509.358335 220.58414c-0.049119-0.1361-0.097214-0.273223-0.145309-0.409322C509.261121 220.310917 509.309216 220.44804 509.358335 220.58414zM505.630431 209.031013c-0.027629-0.093121-0.057305-0.187265-0.083911-0.280386C505.574149 208.843748 505.602801 208.937892 505.630431 209.031013zM504.702292 205.728804c-0.140193-0.51063-0.278339-1.02126-0.414439-1.532913C504.423953 204.707544 504.562099 205.218174 504.702292 205.728804zM503.572562 201.436034c-0.156566-0.627287-0.309038-1.257643-0.460488-1.886977C503.26557 200.178391 503.414973 200.808748 503.572562 201.436034zM554.005184 4.654252c0.010233-0.011256 0.021489-0.021489 0.030699-0.032746C554.025651 4.63174 554.014394 4.642996 554.005184 4.654252zM535.081183 28.173922c0.00921-0.01228 0.01842-0.024559 0.026606-0.037862C535.098579 28.149363 535.089369 28.161642 535.081183 28.173922zM538.005792 24.066371c0.00921-0.01228 0.01842-0.023536 0.025583-0.035816C538.024212 24.041812 538.015002 24.054091 538.005792 24.066371zM541.023522 20.032498c0.00921-0.013303 0.019443-0.024559 0.028653-0.037862C541.042965 20.007939 541.032732 20.019195 541.023522 20.032498zM544.13028 16.076396c0.01228-0.01535 0.024559-0.029676 0.036839-0.046049C544.155862 16.04672 544.142559 16.061047 544.13028 16.076396zM547.332205 12.191926c0.01228-0.01535 0.024559-0.028653 0.036839-0.044002C547.357787 12.163273 547.344484 12.176576 547.332205 12.191926zM550.624181 8.384204c0.01228-0.014326 0.023536-0.026606 0.035816-0.039909C550.647717 8.357598 550.63646 8.370901 550.624181 8.384204zM838.944795 20.601456c-34.417881-34.416857-80.179111-53.371558-128.851647-53.371558-48.673559 0-94.433766 18.954701-128.851647 53.371558-34.417881 34.417881-53.372581 80.179111-53.372581 128.851647 0 48.673559 18.954701 94.433766 53.372581 128.851647s80.178087 53.372581 128.851647 53.372581c48.672536 0 94.433766-18.954701 128.851647-53.372581s53.372581-80.179111 53.372581-128.851647S873.362676 55.02036 838.944795 20.601456zM801.834596 139.991614c8.477069 0 15.349593 6.872524 15.349593 15.349593s-6.872524 15.349593-15.349593 15.349593l-59.743686 0 65.669652 85.421508c5.167696 6.721075 3.906983 16.35755-2.813069 21.524223-6.721075 5.16872-16.358573 3.906983-21.524223-2.813069l-72.494081-94.297666-72.496128 94.297666c-5.166673 6.720052-14.802124 7.981788-21.524223 2.813069-6.720052-5.166673-7.980765-14.803147-2.813069-21.524223l65.671699-85.421508-59.744709 0c-8.477069 0-15.349593-6.872524-15.349593-15.349593s6.872524-15.349593 15.349593-15.349593l75.556836 0 0-33.440623-71.920006 0c-8.477069 0-15.349593-6.872524-15.349593-15.349593s6.872524-15.349593 15.349593-15.349593l71.920006 0 0-57.341986c0-8.477069 6.872524-15.349593 15.349593-15.349593s15.349593 6.872524 15.349593 15.349593l0 57.341986 71.918983 0c8.477069 0 15.349593 6.872524 15.349593 15.349593s-6.872524 15.349593-15.349593 15.349593l-71.918983 0 0 33.440623L801.834596 139.991614z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="yiwancheng" unicode="&#58974;" d="M889.679805 348.948693c0 41.48074-27.488051 76.604702-65.056692 87.821161L824.623114 575.747115c0 47.821145-38.557154 86.729294-85.951581 86.729294l-39.310308 0-87.373976 94.53405c-3.321652 3.619434-8.553817 4.706185-13.033851 2.76702L374.667192 662.476409l-85.661985 0c-47.393403 0-85.951581-38.908148-85.951581-86.729294l0-453.629591c0-47.806819 38.557154-86.706781 85.951581-86.706781l449.666326 0c47.393403 0 85.951581 38.899962 85.951581 86.706781L824.623114 261.118322C862.190731 272.334781 889.679805 307.46079 889.679805 348.948693zM600.618317 735.0851l67.11149-72.608691L433.252495 662.476409 600.618317 735.0851zM801.478997 122.118548c0-34.932604-28.181853-63.35698-62.808488-63.35698L289.005206 58.761568c-34.626635 0-62.808488 28.424376-62.808488 63.35698L226.196719 575.747115c0 34.94693 28.181853 63.379493 62.808488 63.379493l449.666326 0c34.626635 0 62.808488-28.433586 62.808488-63.379493l0-135.267776c-0.857531 0.024559-1.716084 0.038886-2.578732 0.038886L578.36243 440.518225c-6.390547 0-11.573593-5.230118-11.573593-11.675924l0-159.799496c0-6.445806 5.184069-11.675924 11.573593-11.675924l220.537835 0c0.862647 0 1.722224 0.01535 2.578732 0.038886L801.478997 122.118548zM798.900266 280.717705 589.936023 280.717705 589.936023 417.17047l208.964242 0c37.296441 0 67.636446-30.607088 67.636446-68.221778C866.536712 311.324794 836.196707 280.717705 798.900266 280.717705z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wodedingdan" unicode="&#58950;" d="M383 555l260 0c16.6 0 30 13.4 30 30 0 16.6-13.4 30-30 30L383 615c-16.6 0-30-13.4-30-30C353 568.4 366.4 555 383 555zM383 431l260 0c16.6 0 30 13.4 30 30 0 16.6-13.4 30-30 30L383 491c-16.6 0-30-13.4-30-30C353 444.4 366.4 431 383 431zM383 298l260 0c16.6 0 30 13.4 30 30 0 16.6-13.4 30-30 30L383 358c-16.6 0-30-13.4-30-30C353 311.4 366.4 298 383 298zM807 205.3c0.4 2.9 0.4 5.9 0 8.9L807 693l-0.5 0c-4.5 39.9-38.3 71-79.5 71L316 764c-44.2 0-80-35.8-80-80l0-600c0-41.1 31.1-75 71-79.5l0-0.5 281 0 0 0.4c4 0.7 7.8 2.2 11.1 4.3 3.5 1.3 6.8 3.3 9.7 6l188.8 172.9c3.8 3.5 6.6 7.8 8.1 12.4l1.3 0L807 205.3zM296 84 296 684c0 11 9 20 20 20l411 0c11 0 20-9 20-20l0-437L633 247c-44.2 0-80-35.8-80-80l0-103L316 64C305 64 296 73 296 84zM708.1 187 613 99.9 613 167c0 11 9 20 20 20L708.1 187z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="jifen" unicode="&#58954;" d="M801.23724 896C518.930425 896 289.23724 666.306816 289.23724 384s229.693184-512 512-512c282.311824 0 512 229.693184 512 512S1083.549065 896 801.23724 896zM801.23724-64.000939c-247.04241 0-447.995931 200.963537-447.995931 448.000939 0 247.04241 200.95352 448.000939 447.995931 448.000939S1249.23818 631.04241 1249.23818 384C1249.23818 136.962598 1048.279651-64.000939 801.23724-64.000939zM801.23724 486.167108c-22.665682 0-43.835093 2.909902-63.543293 8.725949-19.689418 5.796014-35.216825 14.408021-46.594742 25.773417l0-34.499367c0-9.338231 4.933311-17.999071 14.782402-25.975007 9.841579-7.977188 23.235392-14.292827 40.150136-18.975716 16.914744-4.659099 35.315742-6.996787 55.205498-6.996787 19.879739 0 38.290753 2.337688 55.196733 6.996787 16.914744 4.659099 30.308557 10.998528 40.1589 18.975716 9.840327 7.975936 14.773637 16.638028 14.773637 25.975007l0 34.499367c-11.369152-11.364144-26.920349-19.953613-46.61102-25.773417C845.064821 489.074505 823.894158 486.167108 801.23724 486.167108zM911.366511 364.838972c-11.369152-11.365396-26.920349-19.956117-46.61102-25.772165-19.69067-5.8173-40.860082-8.728454-63.516999-8.728454-22.665682 0-43.835093 2.909902-63.543293 8.728454-19.689418 5.816048-35.216825 14.382979-46.594742 25.748375l0-34.49561c0-9.340735 4.933311-18.000323 14.782402-25.977511 9.841579-7.974684 23.235392-14.292827 40.150136-18.975716 16.914744-4.659099 35.315742-6.976753 55.205498-6.976753 19.879739 0 38.290753 2.341444 55.196733 7.000543 16.914744 4.680384 30.308557 10.998528 40.1589 18.973212 9.840327 7.97844 14.773637 16.635524 14.773637 25.975007L911.367763 364.838972zM705.86533 538.095835c9.840327-7.999726 23.235392-14.320374 40.150136-18.979472 16.931021-4.659099 35.332019-6.976753 55.221775-6.976753 19.879739 0 38.290753 2.342696 55.196733 7.000543 16.914744 4.659099 30.308557 10.998528 40.1589 18.975716 9.840327 7.97844 14.773637 16.634272 14.773637 25.975007l0 21.514994c0 9.339483-4.932058 17.996566-14.773637 25.973755-9.850344 7.975936-23.244156 14.296584-40.1589 18.975716-16.905979 4.659099-35.316994 7.000543-55.196733 7.000543-19.889756 0-38.290753-2.341444-55.221775-7.000543-16.914744-4.679132-30.309809-10.998528-40.150136-18.975716-9.849091-7.977188-14.774889-16.634272-14.774889-25.97125l0-21.540036C691.09044 554.730107 696.016238 546.071771 705.86533 538.095835zM864.771769 416.970541c-19.706948-5.8173-40.876359-8.729706-63.534528-8.729706-22.665682 0-43.835093 2.911154-63.542041 8.729706-19.691922 5.818552-35.218077 14.404265-46.595994 25.769661l0-34.499367c0-9.339483 4.933311-17.996566 14.782402-25.973755 9.841579-7.974684 23.235392-14.294079 40.150136-18.974464 16.931021-4.659099 35.332019-7.000543 55.221775-7.000543 19.879739 0 38.281989 2.341444 55.196733 7.000543 16.913492 4.659099 30.308557 10.99978 40.1589 18.974464 9.840327 7.977188 14.774889 16.635524 14.774889 25.973755l0 34.499367C900.013636 431.374806 884.462439 422.786589 864.771769 416.970541zM801.23724 253.274784c-22.665682 0-43.835093 2.909902-63.543293 8.725949-19.689418 5.796014-35.216825 14.408021-46.594742 25.773417l0-34.499367c0-9.338231 4.933311-17.999071 14.782402-25.975007 9.841579-7.977188 23.235392-14.292827 40.150136-18.975716 16.914744-4.659099 35.315742-6.996787 55.205498-6.996787 19.879739 0 38.290753 2.337688 55.196733 6.996787 16.914744 4.659099 30.308557 10.998528 40.1589 18.975716 9.840327 7.975936 14.773637 16.638028 14.773637 25.975007l0 34.499367c-11.369152-11.364144-26.920349-19.953613-46.61102-25.773417C845.064821 256.182182 823.894158 253.274784 801.23724 253.274784zM801.23724 175.348512c-22.665682 0-43.835093 2.911154-63.542041 8.729706-19.691922 5.818552-35.218077 14.404265-46.595994 25.769661l0-34.499367c0-9.339483 4.933311-17.996566 14.782402-25.973755 9.841579-7.974684 23.235392-14.294079 40.150136-18.974464 16.931021-4.659099 35.332019-7.000543 55.221775-7.000543 19.879739 0 38.281989 2.341444 55.196733 7.000543 16.913492 4.659099 30.308557 10.99978 40.1589 18.974464 9.840327 7.977188 14.774889 16.635524 14.774889 25.973755l0 34.499367c-11.370404-11.365396-26.921601-19.953613-46.612272-25.769661C845.064821 178.259666 823.894158 175.348512 801.23724 175.348512zM801.23724 97.447282c-22.665682 0-43.835093 2.909902-63.543293 8.728454-19.689418 5.816048-35.216825 14.382979-46.594742 25.748375l0-34.49561c0-9.340735 4.933311-18.000323 14.782402-25.977511 9.841579-7.974684 23.235392-14.292827 40.150136-18.975716 16.914744-4.659099 35.315742-6.976753 55.205498-6.976753 19.879739 0 38.290753 2.341444 55.196733 7.000543 16.914744 4.680384 30.308557 10.998528 40.1589 18.973212 9.840327 7.97844 14.773637 16.635524 14.773637 25.975007l0 34.499367c-11.369152-11.365396-26.920349-19.956117-46.61102-25.772165C845.064821 100.357184 823.894158 97.447282 801.23724 97.447282zM465.847252 399.703954c-8.431704-6.829004-12.648808-14.240239-12.648808-22.234956l0-18.441065c0-7.993466 4.217104-15.407205 12.648808-22.234956 8.425443-6.849038 19.89226-12.259402 34.374156-16.248622 14.494417-3.987968 30.248456-5.972561 47.277142-5.972561 17.019921 0 32.781473 2.005879 47.255856 5.992595 14.480644 3.98922 25.94746 9.415862 34.380416 16.244866 8.425443 6.831508 12.647556 14.241491 12.647556 22.238713l0 18.419779c0 7.99597-4.223365 15.407205-12.647556 22.236208-8.432956 6.829004-19.899773 12.239368-34.380416 16.244866-14.473131 3.987968-30.235935 5.992595-47.255856 5.992595-17.028686 0-32.781473-2.004627-47.277142-5.992595C485.739512 411.943322 474.272696 406.531706 465.847252 399.703954M453.205957 255.155452 453.205957 225.620699c0-7.99597 4.224617-15.407205 12.65632-22.237461 8.425443-6.827752 19.89226-12.238116 34.374156-16.244866 14.494417-3.98922 30.248456-5.993847 47.277142-5.993847 17.019921 0 32.77396 2.004627 47.255856 5.993847 14.480644 3.987968 25.94746 9.417114 34.380416 16.244866 8.425443 6.829004 12.648808 14.242743 12.648808 22.237461l0 29.536005c-9.73515-9.730141-23.047575-17.082527-39.905974-22.062165-16.87092-4.980891-34.995202-7.47384-54.392879-7.47384-19.403937 0-37.528219 2.49295-54.400391 7.47384C476.239759 238.074178 462.946115 245.425311 453.205957 255.155452M453.205957 188.443071l0-29.532249c0-7.997222 4.224617-15.410961 12.65632-22.239965 8.425443-6.827752 19.89226-12.236864 34.374156-16.244866 14.480644-3.987968 30.234682-5.972561 47.262116-5.972561 17.019921 0 32.781473 2.004627 47.255856 5.992595 14.480644 4.00675 25.94746 9.415862 34.380416 16.243614 8.425443 6.830256 12.647556 14.242743 12.647556 22.238713l0 29.536005c-9.733897-9.730141-23.046323-17.085031-39.904722-22.063417-16.857147-4.980891-34.981429-7.472588-54.379105-7.472588-19.403937 0-37.528219 2.491697-54.401643 7.472588C476.239759 171.378073 462.946115 178.712929 453.205957 188.443071M453.205957 321.870338l0-29.536005c0-7.994718 4.224617-15.409709 12.65632-22.238713 8.425443-6.829004 19.89226-12.236864 34.374156-16.244866 14.480644-3.987968 30.234682-5.990091 47.262116-5.990091 17.019921 0 32.781473 2.000871 47.255856 5.990091 14.480644 3.987968 25.94746 9.415862 34.380416 16.244866 8.425443 6.829004 12.647556 14.243995 12.647556 22.238713L641.782378 321.870338c-9.733897-9.730141-23.046323-17.082527-39.904722-22.064669-16.857147-4.980891-34.981429-7.470084-54.379105-7.470084-19.403937 0-37.528219 2.491697-54.401643 7.470084C476.239759 304.767778 462.946115 312.140197 453.205957 321.870338M973.325886 405.062982c-8.431704-6.829004-12.648808-14.241491-12.648808-22.234956l0-18.441065c0-7.993466 4.217104-15.407205 12.648808-22.234956 8.425443-6.849038 19.89226-12.259402 34.374156-16.248622 14.494417-3.987968 30.248456-5.972561 47.277142-5.972561 17.019921 0 32.781473 2.005879 47.255856 5.992595 14.480644 3.98922 25.94746 9.415862 34.380416 16.244866 8.425443 6.831508 12.647556 14.241491 12.647556 22.238713l0 18.419779c0 7.99597-4.222112 15.407205-12.647556 22.236208-8.432956 6.829004-19.899773 12.239368-34.380416 16.244866-14.474383 3.987968-30.235935 5.992595-47.255856 5.992595-17.028686 0-32.781473-2.004627-47.277142-5.992595C993.218146 417.30235 981.751329 411.891986 973.325886 405.062982M960.684591 260.515732l0-29.536005c0-7.99597 4.223365-15.407205 12.65632-22.237461 8.425443-6.8265 19.89226-12.238116 34.374156-16.244866 14.494417-3.98922 30.248456-5.993847 47.277142-5.993847 17.019921 0 32.77396 2.004627 47.255856 5.993847 14.480644 3.987968 25.94746 9.417114 34.380416 16.244866 8.425443 6.829004 12.648808 14.242743 12.648808 22.237461l0 29.536005c-9.73515-9.730141-23.047575-17.082527-39.905974-22.062165-16.87092-4.980891-34.995202-7.47384-54.392879-7.47384-19.403937 0-37.529471 2.49295-54.400391 7.47384C983.718393 243.434457 970.424749 250.785591 960.684591 260.515732M960.684591 193.802098l0-29.532249c0-7.997222 4.223365-15.410961 12.65632-22.239965 8.425443-6.827752 19.89226-12.236864 34.374156-16.244866 14.480644-3.987968 30.234682-5.972561 47.262116-5.972561 17.019921 0 32.781473 2.004627 47.255856 5.992595 14.480644 4.00675 25.94746 9.415862 34.380416 16.243614 8.425443 6.830256 12.647556 14.242743 12.647556 22.238713l0 29.536005c-9.733897-9.730141-23.046323-17.085031-39.904722-22.063417-16.857147-4.980891-34.981429-7.472588-54.379105-7.472588-19.403937 0-37.529471 2.491697-54.401643 7.472588C983.718393 176.738353 970.424749 184.073209 960.684591 193.802098M960.684591 327.230618l0-29.536005c0-7.994718 4.223365-15.409709 12.65632-22.238713 8.425443-6.829004 19.89226-12.236864 34.374156-16.244866 14.480644-3.987968 30.234682-5.990091 47.262116-5.990091 17.019921 0 32.781473 2.000871 47.255856 5.990091 14.480644 3.987968 25.94746 9.415862 34.380416 16.244866 8.425443 6.829004 12.647556 14.243995 12.647556 22.238713l0 29.536005c-9.733897-9.730141-23.046323-17.082527-39.904722-22.064669-16.857147-4.980891-34.981429-7.470084-54.379105-7.470084-19.403937 0-37.529471 2.491697-54.401643 7.470084C983.718393 310.128058 970.424749 317.500477 960.684591 327.230618"  horiz-adv-x="1603" />
+
+    
+    <glyph glyph-name="lingjuandizhi" unicode="&#59006;" d="M943.088 555.856 526.592 868.36C516.24 876.12 504.112 880 492 880c-12.12 0-24.24-3.88-34.592-11.64L40.912 555.856C25.28 544.128 16 525.184 16 505l0-562.488C16-92.008 42.64-120 75.496-120c0 0 79.44 0 146.528 0 103.688 0 91.472 81.88 91.472 81.88L313.496 255c0 34.52 26.64 62.504 59.496 62.504l238 0c32.856 0 59.504-27.984 59.504-62.504l0-298.368c0 0-3.68-75.304 81.528-76.624 68.904 0 156.464 0 156.464 0 32.856 0 59.504 27.992 59.504 62.504L967.992 505C968 525.184 958.72 544.128 943.088 555.856z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="weibiaoti2fuzhi05" unicode="&#58914;" d="M633.6 678.4l108.8 0L512 832 281.6 678.4 384 678.4l0-275.2 249.6 0L633.6 678.4zM435.2 723.2 512 774.4l76.8-51.2L588.8 448 435.2 448 435.2 723.2zM627.2 134.4l76.8 102.4 179.2 0-64-249.6L204.8-12.8l-64 249.6 179.2 0 76.8-102.4L627.2 134.4zM838.4 614.4l-147.2 0c-12.8 0-25.6-12.8-25.6-25.6 0-12.8 12.8-25.6 25.6-25.6l108.8 0c12.8 0 19.2-6.4 25.6-19.2L876.8 320c6.4-12.8-6.4-32-25.6-32l-160 0c-6.4 0-12.8-6.4-19.2-12.8l-57.6-83.2c-6.4-6.4-12.8-12.8-19.2-12.8L435.2 179.2c-6.4 0-12.8 6.4-19.2 12.8L358.4 275.2C352 281.6 345.6 288 339.2 288L172.8 288C160 288 147.2 300.8 147.2 320l51.2 224c0 12.8 12.8 19.2 25.6 19.2l108.8 0c12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6L185.6 614.4c-12.8 0-19.2-6.4-25.6-19.2L89.6 268.8c0-6.4 0-6.4 0-12.8l76.8-300.8c0-12.8 12.8-19.2 25.6-19.2l652.8 0c12.8 0 19.2 6.4 25.6 19.2l76.8 300.8c0 6.4 0 6.4 0 12.8l-76.8 326.4C857.6 608 851.2 614.4 838.4 614.4z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="shouhuodizhi" unicode="&#58978;" d="M512.005117 895.653099c-282.287201 0-434.613492-213.591633-434.613492-396.730697 0-190.322673 196.84625-402.487817 429.855118-504.555447l4.758374-2.100848 4.758374 2.100848c232.997612 102.066607 429.844885 314.251194 429.844885 504.555447C946.607352 682.06249 794.292318 895.653099 512.005117 895.653099zM512.00307 369.313509c-108.035552 0-195.61419 87.579661-195.61419 195.61419S403.967518 760.541889 512.00307 760.541889c108.033505 0 195.61419-87.579661 195.61419-195.61419S620.037599 369.313509 512.00307 369.313509zM259.848143-88.530057a246.409 38.232 0 1 0 504.303714 0 246.409 38.232 0 1 0-504.303714 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wodeshoucang" unicode="&#59017;" d="M1019.733333 512c-8.533333 25.6-34.133333 46.933333-59.733333 51.2l-268.8 42.666667L580.266667 853.333333c-12.8 25.6-38.4 42.666667-68.266667 42.666667s-55.466667-17.066667-68.266667-42.666667L328.533333 605.866667l-264.533333-42.666667C34.133333 558.933333 12.8 541.866667 4.266667 512c-8.533333-25.6 0-55.466667 17.066666-76.8l196.266667-200.533333L170.666667-42.666667c-4.266667-29.866667 8.533333-55.466667 29.866666-72.533333 12.8-8.533333 29.866667-12.8 42.666667-12.8 12.8 0 25.6 4.266667 34.133333 8.533333l230.4 123.733334 230.4-123.733334c12.8-4.266667 25.6-8.533333 34.133334-8.533333 17.066667 0 29.866667 4.266667 42.666666 12.8 21.333333 17.066667 34.133333 46.933333 29.866667 72.533333l-46.933333 277.333334 196.266666 200.533333c29.866667 25.6 34.133333 51.2 25.6 76.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ziyuan" unicode="&#58919;" d="M512 470.646154a226.855385 226.855385 0 1 1 205.193846-322.953846 36.233846 36.233846 0 1 1-65.378461 30.326154 154.781538 154.781538 0 0 0-294.99077 65.378461A154.781538 154.781538 0 0 0 512 398.572308a157.538462 157.538462 0 0 0 140.603077-90.19077 36.233846 36.233846 0 0 1 65.378461 30.326154A228.036923 228.036923 0 0 1 512 470.646154zM512 604.553846a351.704615 351.704615 0 1 1 351.310769-351.310769A351.704615 351.704615 0 0 1 512 604.553846z m279.236923-351.310769A279.236923 279.236923 0 1 0 512 532.48a279.630769 279.630769 0 0 0 279.236923-279.236923zM801.083077 866.461538H222.916923a62.227692 62.227692 0 0 1-62.227692-62.227692v-142.178461a114.215385 114.215385 0 0 1 39.384615-78.769231L250.486154 541.538462a36.233846 36.233846 0 1 1 45.686154 54.744615l-50.412308 39.384615a48.049231 48.049231 0 0 0-12.996923 24.418462V794.387692h558.473846v-132.332307a30.326154 30.326154 0 0 0-12.996923-24.418462l-50.412308-39.384615A36.233846 36.233846 0 0 1 773.513846 541.538462l50.806154 39.384615a101.612308 101.612308 0 0 1 39.384615 78.769231V804.233846A62.227692 62.227692 0 0 1 801.083077 866.461538z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="gouwuche" unicode="&#58887;" d="M289 14.8c-55.9 0-101.4 45.5-101.4 101.4 0 55.9 45.5 101.4 101.4 101.4s101.4-45.5 101.4-101.4c0-55.9-45.5-101.4-101.4-101.4z m0 161.6c-33.2 0-60.2-27-60.2-60.1 0-33.2 27-60.1 60.2-60.1s60.2 27 60.2 60.1c-0.1 33.1-27.1 60.1-60.2 60.1zM566.2 14.8c-55.9 0-101.4 45.5-101.4 101.4 0 55.9 45.5 101.4 101.4 101.4s101.4-45.5 101.4-101.4c0-55.9-45.5-101.4-101.4-101.4z m0 161.6c-33.2 0-60.2-27-60.2-60.1 0-33.2 27-60.1 60.2-60.1s60.2 27 60.2 60.1c-0.1 33.1-27.1 60.1-60.2 60.1zM648.4 255.2H198.3L86.9 645.4h567.2l45.7 107.7h163.5c40.7 0 73.8-33.4 73.8-74.5 0-41-33.1-74.3-73.8-74.3-5.1 0-47.7-0.1-70.2-0.2L648.4 255.2z m-419 41.3h391.4l144.7 348.9h13.7s77.1 0.2 84 0.2c17.9 0 32.6 14.8 32.6 33 0 18-14.9 33.2-32.6 33.2H727l-45.7-107.7H141.6l87.8-307.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="yiguanbigongdanshu" unicode="&#59025;" d="M576 832H256a64.19 64.19 0 0 1-64-64v-768a64.19 64.19 0 0 1 64-64h512a64.19 64.19 0 0 1 64 64V576z m94.39-687.53l-45.25-45.25L512 212.35 398.86 99.22l-45.25 45.25 113.14 113.14-113.14 113.14L398.86 416 512 302.86 625.14 416l45.25-45.25-113.14-113.14zM576 576V768l192-192z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="shouhoukefu" unicode="&#58901;" d="M824.2 535.3C809 590.2 744.7 768 512.1 768c-230.8 0-297-177.8-310.2-232.7-43.5-17-104-62.4-104-151.3 0-87 60.5-136.2 102.2-155.1 5.7-34.1 22.7-109.7 96.5-155.1 53-34.1 117.3-41.6 160.8-43.5 9.5-18.9 28.4-30.3 49.2-30.3 32.2 0 56.8 24.6 56.8 56.8 0 30.3-24.6 56.8-56.8 56.8-22.7 0-41.6-13.2-51.1-34.1-37.8 1.9-90.8 9.5-134.3 35.9-70 43.5-73.8 128.6-73.8 132.4V512.6c3.8 22.7 45.4 204.3 264.8 204.3S773.3 533.4 777 512.6v-266.7c0-7.6 3.8-15.1 9.5-20.8 3.8-3.8 9.5-5.7 15.1-5.7 1.9 0 5.7 0 7.6 1.9 41.6 13.2 119.2 62.4 119.2 160.8-0.2 90.8-62.6 136.2-104.2 153.2zM198 287.5c-22.7 17-51.1 45.4-51.1 96.5s28.4 79.5 51.1 92.7v-189.2z m630 0V476.7c22.7-15.1 51.1-43.5 51.1-92.7s-28.4-79.5-51.1-96.5z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wodeyuyue" unicode="&#58903;" d="M868.864 529.92h-808.96v-61.44h808.96v61.44zM261.632 614.912c-16.896 0-30.72 13.824-30.72 30.72V791.552c0 16.896 13.824 30.72 30.72 30.72s30.72-13.824 30.72-30.72v-145.92c0-16.896-13.824-30.72-30.72-30.72zM161.792 353.28c0 16.896 13.824 30.72 30.72 30.72h145.92c16.896 0 30.72-13.824 30.72-30.72s-13.824-30.72-30.72-30.72H192.512c-16.896 0-30.72 13.824-30.72 30.72zM747.52 292.864c16.896 0 30.72-13.824 30.72-30.72V184.32c0-16.896-13.824-30.72-30.72-30.72s-30.72 13.824-30.72 30.72v78.336c0 16.896 13.824 30.208 30.72 30.208zM858.624 180.736c0-16.896-13.824-30.72-30.72-30.72h-78.336c-16.896 0-30.72 13.824-30.72 30.72s13.824 30.72 30.72 30.72h78.336c16.896 0 30.72-13.824 30.72-30.72zM161.792 189.44c0 16.896 13.824 30.72 30.72 30.72h145.92c16.896 0 30.72-13.824 30.72-30.72s-13.824-30.72-30.72-30.72H192.512c-16.896 0-30.72 13.824-30.72 30.72zM666.112 614.912c-16.896 0-30.72 13.824-30.72 30.72V791.552c0 16.896 13.824 30.72 30.72 30.72s30.72-13.824 30.72-30.72v-145.92c0-16.896-13.824-30.72-30.72-30.72zM458.752 22.528m-30.72 0a30.72 30.72 0 1 1 61.44 0 30.72 30.72 0 1 1-61.44 0ZM752.64 354.304c93.184 0 168.96-75.776 168.96-168.96s-75.776-168.96-168.96-168.96-168.96 75.776-168.96 168.96 75.776 168.96 168.96 168.96m0 61.44c-127.488 0-230.4-102.912-230.4-230.4s102.912-230.4 230.4-230.4 230.4 102.912 230.4 230.4-102.912 230.4-230.4 230.4zM460.8 53.248H175.104c-37.376 0-68.608 30.72-68.608 68.608V647.68c0 37.376 30.72 68.608 68.608 68.608h578.048c37.376 0 68.608-30.72 68.608-68.608v-177.664h60.416V645.12c0 72.704-58.88 131.584-131.584 131.584H178.176C105.472 776.704 46.08 717.824 46.08 645.12v-520.704c0-72.704 58.88-131.584 131.584-131.584H460.8v60.416z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="buqiajuan" unicode="&#59038;" d="M941.511111 486.4l25.6 2.844444V671.288889c0 48.355556-36.977778 85.333333-85.333333 85.333333H142.222222c-48.355556 0-85.333333-36.977778-85.333333-85.333333v-184.888889l19.911111-5.688889c39.822222-14.222222 65.422222-51.2 65.422222-93.866667 0-42.666667-25.6-79.644444-65.422222-93.866666l-19.911111-5.688889v-184.888889c0-48.355556 36.977778-85.333333 85.333333-85.333333h739.555556c48.355556 0 85.333333 36.977778 85.333333 85.333333v182.044444l-25.6 2.844445c-51.2 5.688889-88.177778 48.355556-88.177778 99.555555s36.977778 93.866667 88.177778 99.555556zM910.222222 236.088889v-133.688889c0-17.066667-11.377778-28.444444-28.444444-28.444444H142.222222c-17.066667 0-28.444444 11.377778-28.444444 28.444444v145.066667c51.2 25.6 85.333333 79.644444 85.333333 139.377777s-34.133333 113.777778-85.333333 139.377778V671.288889c0 17.066667 11.377778 28.444444 28.444444 28.444444h739.555556c17.066667 0 28.444444-11.377778 28.444444-28.444444v-133.688889c-65.422222-19.911111-113.777778-79.644444-113.777778-150.755556s48.355556-130.844444 113.777778-150.755555zM696.888889 415.288889h-113.777778c-17.066667 0-28.444444-11.377778-28.444444-28.444445s11.377778-28.444444 28.444444-28.444444h113.777778c17.066667 0 28.444444 11.377778 28.444444 28.444444s-11.377778 28.444444-28.444444 28.444445zM440.888889 415.288889h-113.777778c-17.066667 0-28.444444-11.377778-28.444444-28.444445s11.377778-28.444444 28.444444-28.444444h113.777778c17.066667 0 28.444444 11.377778 28.444444 28.444444s-11.377778 28.444444-28.444444 28.444445z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="kuaidi-" unicode="&#58897;" d="M292.6799 72.3c-2.32-2.57-2.41-2.77-1.81-2.13s1.1 1.29 1.66 1.93zM750.5899 54.08l0.37 0.19c-1.62-0.59-2.51-0.94-2.91-1.11l1.35 0.46zM1024.0099 154.61c-0.54 12.16-9.79 22.19-22.3 22.29l-63.15 0.51-100.62 0.81-23.06 0.19c-12 0.1-22.39-10.29-22.3-22.3 0.05-6.16 0-12.31-0.37-18.46-0.3-5.54-1.3-11.11-1.46-16.63 0.21 7.2 0 0.29-0.31-1.73-0.4-2.42-0.84-4.83-1.34-7.24-0.91-4.45-2-8.88-3.31-13.24q-1.6-5.4-3.67-10.66c-0.08-0.17-0.17-0.35-0.26-0.57q-1.26-2.72-2.65-5.37c-1.49-2.8-3.1-5.54-4.85-8.18-0.66-1-1.36-2-2.06-2.95l-0.68-0.84a80.58 80.58 0 0 0-5.6-5.94c-0.88-0.84-1.79-1.65-2.71-2.46-1.9-0.61-4.53-3.29-6.18-4.28-2-1.2-4.05-2.29-6.15-3.29l1.67 0.61c-0.68-0.25-1.36-0.52-2-0.8-1.3-0.61-3.57-1.36-2.51-0.91-1.64-0.56-3.29-1.08-5-1.54-1.84-0.49-3.69-0.93-5.55-1.3-0.61-0.12-1.21-0.22-1.81-0.32a88.6 88.6 0 0 0-14.75-0.27l-1.71 0.17a108.17 108.17 0 0 0-13.52 3.09c-1.51 0.47-3 1-4.5 1.55l0.88-0.46c-0.4 0.21-0.81 0.39-1.22 0.58l-0.24 0.09a16.3 16.3 0 0 0-2.16 1 76.59 76.59 0 0 0-8.78 5.18 7.57 7.57 0 0 0-1.27 0.9l-0.17 0.15a10.81 10.81 0 0 1-1.4 1l0.79-0.45c-0.9 0.79-1.8 1.57-2.67 2.39-2.64 2.51-4.77 5.49-7.34 8l0.92-0.91a15.4 15.4 0 0 0-1.14 1.42q-1.25 1.83-2.4 3.71a95.38 95.38 0 0 0-5 9.23c-0.24 0.49-0.46 1-0.68 1.48-0.4 1-0.81 2.06-1.18 3.1q-1.77 4.92-3.13 10t-2.36 10.18c-0.3 1.52-0.57 3-0.82 4.57l-0.21 1.34c-0.57 5.14-1 10.28-1.17 15.46a128.6 128.6 0 0 0 0.3 16.07c1.14 12-11.14 22.3-22.3 22.3H338.7299c-12.8 0-21.28-10.26-22.3-22.3-0.27-3.27-0.58-6.53-0.95-9.78-0.11-1-0.24-2-0.37-3v-0.27c-0.92-5.67-1.87-11.31-3.13-16.91a174.93 174.93 0 0 0-7.76-25.74l0.49 1c-0.27-0.57-0.52-1.16-0.77-1.74l-0.11-0.27c-0.07-0.14-0.13-0.29-0.19-0.43-0.79-1.72-1.6-3.43-2.46-5.12a115.18 115.18 0 0 0-5.47-9.6c-0.88-1.39-1.79-2.75-2.74-4.1l-0.25-0.33 0.66 0.73-0.81-0.93c-0.55-0.7-1.26-1.5-1.66-1.93-1.25-1.47-2.49-2.95-3.86-4.34q-2.79-2.83-5.83-5.39c-0.7-0.5-1.39-1-2.11-1.47-1.9-1.27-3.87-2.46-5.89-3.54-1.71-0.92-6.14-2.59-5.63-2.43a62.73 62.73 0 0 0-6.26-1.87c-1-0.24-2-0.44-3.06-0.63l2.13 0.18c-0.7-0.06-1.4-0.16-2.09-0.23h-0.42c-0.38-0.07-0.76-0.15-1.15-0.21-1.81-0.33-4.61-0.33 0.12 0.14-2.33-0.11-4.63 0-7 0-3.24 0-6.46-0.38-9.72-0.29-1.3 0-2.6 0.11-3.89 0.21l0.79-0.23a7.89 7.89 0 0 1-1.3 0.27l-0.69 0.06a7.54 7.54 0 0 0-1.47 0.28 68.25 68.25 0 0 0-9.32 2.53l-1 0.39c-1.39 0.71-2.81 1.37-4.18 2.14-1.57 0.88-3.35 1.81-5 2.87l-0.52 0.48c-0.64 0.58-1.33 1.1-2 1.67q-2 1.69-3.78 3.52c-2.13 2.11-4.09 4.36-6 6.66-1.14 1.63-2.29 3.26-3.37 4.93a130.08 130.08 0 0 0-9 16.63c0 0.1-0.1 0.22-0.15 0.34 0.12-0.31 0.24-0.63 0.37-1-0.58 1.58-1.26 3.12-1.86 4.69q-1.6 4.23-3 8.53a220.54 220.54 0 0 0-8 34c-0.1 0.62-0.19 1.23-0.28 1.84-0.14 1.22-0.29 2.43-0.41 3.65s-0.27 2.7-0.35 4.06c-0.72 12-9.63 22.3-22.3 22.3H44.6199v278l40.29 35 74.64 64.91 9.64 8.39h147.24v-105.77c0-11.66 10.26-22.84 22.3-22.3s22.3 9.8 22.3 22.3V578 718.43h602.13c8.46 0 16.94-0.15 25.4 0h1.08c11.66 0 22.84 10.25 22.3 22.29s-9.8 22.3-22.3 22.3H365.2099c-8.46 0-16.94 0.15-25.39 0h-1.09a22.62 22.62 0 0 1-22.3-22.3V601.8H163.6599a27.77 27.77 0 0 1-18.52-6.56c-1.25-1-2.45-2.12-3.67-3.19l-56.78-49.37-65.74-57.16c-4.07-3.55-8.62-6.9-12.39-10.78C-0.5401 467.43 0.0099 459.5 0.0099 450.66v-302.08a22.62 22.62 0 0 1 22.3-22.3h111.19c6.27-40.17 23.47-81.13 56.43-104.87 19.17-13.81 42.6-16.79 65.57-15.75 21.59 1 41.26 9.71 57.65 23.61 28.06 23.81 40 61 45.33 97H616.0099a203 203 0 0 1 4.53-30.87c7.22-32.51 26.22-64.35 57.24-79a109.27 109.27 0 0 1 30.75-9.69c1.45-0.21 3.89-0.54 5.53-0.75s3-0.44 4.53-0.6a80.76 80.76 0 0 1 14.75-0.22c24 1.82 46.58 10.8 64.16 27.62 27 25.86 36.7 64.08 39 100.87l41.45-0.33 100.63-0.82 23-0.18c11.78-0.09 22.95 10.33 22.43 22.31z m-810.4-95.75a17.18 17.18 0 0 0-2.56 2.08c-0.11 0.06 1.64-1.34 2.56-2.08z m55-5.51l3.2 1.13z m494 7.85l-1.31-1.08c-2.17-1.78-0.15-0.01 1.26 1.08zM678.6399 72c1.5-1.68 3.12-3.1 0 0zM235.7299 50.3h0.51c-3.89 1.12-3.87 0.73-2.67 0.38h0.12c0.66-0.2 1.32-0.27 2.04-0.38zM258.2299 50.5l-1.41-0.14 1 0.07zM689.2399 61.33c0.18-0.13 0.37-0.24 0.54-0.37 0.94-0.51 1.14-0.26-2 1.59l0.61-0.54c0.25-0.24 0.55-0.48 0.85-0.68zM304.0999 92.63l0.08 0.21c-2-4.26-1.07-2.48-0.39-1 0 0.09 0.07 0.18 0.11 0.27s0.11 0.37 0.2 0.52zM701.0099 54.64l0.34-0.12c-2.63 1.33-3.11 1.5-2.74 1.26l0.84-0.43c0.46-0.25 0.98-0.48 1.56-0.71zM989.6399 473.73H686.7899c-11.67 0-22.84-10.26-22.3-22.3s9.8-22.3 22.3-22.3h302.85c11.66 0 22.84 10.26 22.3 22.3s-9.8 22.3-22.3 22.3z"  horiz-adv-x="1024" />
+
+    
+
+
+  </font>
+</defs></svg>
diff --git a/static/iconfont/iconfont.ttf b/static/iconfont/iconfont.ttf
new file mode 100644
index 0000000..6b0942c
Binary files /dev/null and b/static/iconfont/iconfont.ttf differ
diff --git a/static/iconfont/iconfont.woff b/static/iconfont/iconfont.woff
new file mode 100644
index 0000000..298b9d3
Binary files /dev/null and b/static/iconfont/iconfont.woff differ
diff --git a/static/iconfont/iconfont.woff2 b/static/iconfont/iconfont.woff2
new file mode 100644
index 0000000..8712068
Binary files /dev/null and b/static/iconfont/iconfont.woff2 differ
diff --git a/static/image/icon_back_.png b/static/image/icon_back_.png
new file mode 100644
index 0000000..78904d0
Binary files /dev/null and b/static/image/icon_back_.png differ
diff --git a/static/image/icon_confirm.png b/static/image/icon_confirm.png
new file mode 100644
index 0000000..c026cb2
Binary files /dev/null and b/static/image/icon_confirm.png differ
diff --git a/static/image/icon_hot_default.png b/static/image/icon_hot_default.png
new file mode 100644
index 0000000..912a993
Binary files /dev/null and b/static/image/icon_hot_default.png differ
diff --git a/static/image/icon_hot_pressed.png b/static/image/icon_hot_pressed.png
new file mode 100644
index 0000000..88b7f38
Binary files /dev/null and b/static/image/icon_hot_pressed.png differ
diff --git a/static/image/icon_new_default.png b/static/image/icon_new_default.png
new file mode 100644
index 0000000..f48bf61
Binary files /dev/null and b/static/image/icon_new_default.png differ
diff --git a/static/image/icon_new_pressed.png b/static/image/icon_new_pressed.png
new file mode 100644
index 0000000..a8a660e
Binary files /dev/null and b/static/image/icon_new_pressed.png differ
diff --git a/static/image/icon_nextstep.png b/static/image/icon_nextstep.png
new file mode 100644
index 0000000..0273d39
Binary files /dev/null and b/static/image/icon_nextstep.png differ
diff --git a/static/image/icon_sticker_buttom_tailoring.png b/static/image/icon_sticker_buttom_tailoring.png
new file mode 100644
index 0000000..7d16db1
Binary files /dev/null and b/static/image/icon_sticker_buttom_tailoring.png differ
diff --git a/static/image/icon_sticker_left_tailoring.png b/static/image/icon_sticker_left_tailoring.png
new file mode 100644
index 0000000..ebb60f6
Binary files /dev/null and b/static/image/icon_sticker_left_tailoring.png differ
diff --git a/static/image/icon_sticker_right_tailoring.png b/static/image/icon_sticker_right_tailoring.png
new file mode 100644
index 0000000..a16365c
Binary files /dev/null and b/static/image/icon_sticker_right_tailoring.png differ
diff --git a/static/image/icon_sticker_top_tailoring.png b/static/image/icon_sticker_top_tailoring.png
new file mode 100644
index 0000000..1f60130
Binary files /dev/null and b/static/image/icon_sticker_top_tailoring.png differ
diff --git a/static/image/remind_picture.png b/static/image/remind_picture.png
new file mode 100644
index 0000000..7019e68
Binary files /dev/null and b/static/image/remind_picture.png differ
diff --git a/static/img/a.png b/static/img/a.png
new file mode 100644
index 0000000..34649fa
Binary files /dev/null and b/static/img/a.png differ
diff --git a/static/img/b.png b/static/img/b.png
new file mode 100644
index 0000000..00c7252
Binary files /dev/null and b/static/img/b.png differ
diff --git a/static/img/c.png b/static/img/c.png
new file mode 100644
index 0000000..fe064b7
Binary files /dev/null and b/static/img/c.png differ
diff --git a/static/img/d.png b/static/img/d.png
new file mode 100644
index 0000000..d25d293
Binary files /dev/null and b/static/img/d.png differ
diff --git a/static/img/icon_close_image.png b/static/img/icon_close_image.png
new file mode 100644
index 0000000..e3497b3
Binary files /dev/null and b/static/img/icon_close_image.png differ
diff --git a/static/img/icon_line_up_back.png b/static/img/icon_line_up_back.png
new file mode 100644
index 0000000..c9e45ce
Binary files /dev/null and b/static/img/icon_line_up_back.png differ
diff --git a/static/img/icon_qiehuan.png b/static/img/icon_qiehuan.png
new file mode 100644
index 0000000..79e1705
Binary files /dev/null and b/static/img/icon_qiehuan.png differ
diff --git a/static/img/icon_qiehuan_on.png b/static/img/icon_qiehuan_on.png
new file mode 100644
index 0000000..5290630
Binary files /dev/null and b/static/img/icon_qiehuan_on.png differ
diff --git a/static/img/shua.png b/static/img/shua.png
new file mode 100644
index 0000000..e4abe27
Binary files /dev/null and b/static/img/shua.png differ
diff --git a/static/location.png b/static/location.png
new file mode 100644
index 0000000..7b4b802
Binary files /dev/null and b/static/location.png differ
diff --git a/static/logo.jpg b/static/logo.jpg
new file mode 100644
index 0000000..c88accc
Binary files /dev/null and b/static/logo.jpg differ
diff --git a/static/main/dingdan@3x.png b/static/main/dingdan@3x.png
new file mode 100644
index 0000000..4668831
Binary files /dev/null and b/static/main/dingdan@3x.png differ
diff --git a/static/main/huayihua@3x.png b/static/main/huayihua@3x.png
new file mode 100644
index 0000000..00c1d63
Binary files /dev/null and b/static/main/huayihua@3x.png differ
diff --git a/static/main/wo@3x.png b/static/main/wo@3x.png
new file mode 100644
index 0000000..d4aa312
Binary files /dev/null and b/static/main/wo@3x.png differ
diff --git a/static/mine/Pick-up.png b/static/mine/Pick-up.png
new file mode 100644
index 0000000..8994263
Binary files /dev/null and b/static/mine/Pick-up.png differ
diff --git a/static/mine/icon_back.png b/static/mine/icon_back.png
new file mode 100644
index 0000000..3b7863e
Binary files /dev/null and b/static/mine/icon_back.png differ
diff --git a/static/mine/icon_confirm.png b/static/mine/icon_confirm.png
new file mode 100644
index 0000000..02431c8
Binary files /dev/null and b/static/mine/icon_confirm.png differ
diff --git a/static/mine/icon_diy.png b/static/mine/icon_diy.png
new file mode 100644
index 0000000..966fdd4
Binary files /dev/null and b/static/mine/icon_diy.png differ
diff --git a/static/mine/icon_five.png b/static/mine/icon_five.png
new file mode 100644
index 0000000..e3f60ab
Binary files /dev/null and b/static/mine/icon_five.png differ
diff --git a/static/mine/icon_four.png b/static/mine/icon_four.png
new file mode 100644
index 0000000..88fb5c7
Binary files /dev/null and b/static/mine/icon_four.png differ
diff --git a/static/mine/icon_guanbi.png b/static/mine/icon_guanbi.png
new file mode 100644
index 0000000..07c0dc0
Binary files /dev/null and b/static/mine/icon_guanbi.png differ
diff --git a/static/mine/icon_nextstep.png b/static/mine/icon_nextstep.png
new file mode 100644
index 0000000..8d3b05b
Binary files /dev/null and b/static/mine/icon_nextstep.png differ
diff --git a/static/mine/icon_one.png b/static/mine/icon_one.png
new file mode 100644
index 0000000..3edfd95
Binary files /dev/null and b/static/mine/icon_one.png differ
diff --git a/static/mine/icon_saoyisao.png b/static/mine/icon_saoyisao.png
new file mode 100644
index 0000000..d8e2823
Binary files /dev/null and b/static/mine/icon_saoyisao.png differ
diff --git a/static/mine/icon_three.png b/static/mine/icon_three.png
new file mode 100644
index 0000000..7c0eb7e
Binary files /dev/null and b/static/mine/icon_three.png differ
diff --git a/static/mine/icon_two.png b/static/mine/icon_two.png
new file mode 100644
index 0000000..f4abadb
Binary files /dev/null and b/static/mine/icon_two.png differ
diff --git a/static/mine/qy.png b/static/mine/qy.png
new file mode 100644
index 0000000..15c5824
Binary files /dev/null and b/static/mine/qy.png differ
diff --git a/static/mineimage/icon_five.png b/static/mineimage/icon_five.png
new file mode 100644
index 0000000..d10c4b0
Binary files /dev/null and b/static/mineimage/icon_five.png differ
diff --git a/static/mineimage/icon_four.png b/static/mineimage/icon_four.png
new file mode 100644
index 0000000..f0d58cc
Binary files /dev/null and b/static/mineimage/icon_four.png differ
diff --git a/static/mineimage/icon_one.png b/static/mineimage/icon_one.png
new file mode 100644
index 0000000..d0cd87d
Binary files /dev/null and b/static/mineimage/icon_one.png differ
diff --git a/static/mineimage/icon_six.png b/static/mineimage/icon_six.png
new file mode 100644
index 0000000..596f44c
Binary files /dev/null and b/static/mineimage/icon_six.png differ
diff --git a/static/mineimage/icon_three.png b/static/mineimage/icon_three.png
new file mode 100644
index 0000000..9605003
Binary files /dev/null and b/static/mineimage/icon_three.png differ
diff --git a/static/mineimage/icon_two.png b/static/mineimage/icon_two.png
new file mode 100644
index 0000000..e96fe66
Binary files /dev/null and b/static/mineimage/icon_two.png differ
diff --git a/static/phone.png b/static/phone.png
new file mode 100644
index 0000000..a3192eb
Binary files /dev/null and b/static/phone.png differ
diff --git a/static/png/close.png b/static/png/close.png
new file mode 100644
index 0000000..b90c92f
Binary files /dev/null and b/static/png/close.png differ
diff --git a/static/png/close_s.png b/static/png/close_s.png
new file mode 100644
index 0000000..ad580af
Binary files /dev/null and b/static/png/close_s.png differ
diff --git a/static/png/icon_confirm.png b/static/png/icon_confirm.png
new file mode 100644
index 0000000..c793753
Binary files /dev/null and b/static/png/icon_confirm.png differ
diff --git a/static/png/tool_clear.png b/static/png/tool_clear.png
new file mode 100644
index 0000000..5a3571d
Binary files /dev/null and b/static/png/tool_clear.png differ
diff --git a/static/png/tool_clear_s.png b/static/png/tool_clear_s.png
new file mode 100644
index 0000000..c95d1d2
Binary files /dev/null and b/static/png/tool_clear_s.png differ
diff --git a/static/png/tool_color.png b/static/png/tool_color.png
new file mode 100644
index 0000000..91b3497
Binary files /dev/null and b/static/png/tool_color.png differ
diff --git a/static/png/tool_color_s.png b/static/png/tool_color_s.png
new file mode 100644
index 0000000..8a77977
Binary files /dev/null and b/static/png/tool_color_s.png differ
diff --git a/static/png/tool_eraser.png b/static/png/tool_eraser.png
new file mode 100644
index 0000000..3bff53f
Binary files /dev/null and b/static/png/tool_eraser.png differ
diff --git a/static/png/tool_pen.png b/static/png/tool_pen.png
new file mode 100644
index 0000000..7e55e13
Binary files /dev/null and b/static/png/tool_pen.png differ
diff --git a/static/png/tool_pen_s.png b/static/png/tool_pen_s.png
new file mode 100644
index 0000000..641d968
Binary files /dev/null and b/static/png/tool_pen_s.png differ
diff --git a/static/qiehuan.png b/static/qiehuan.png
new file mode 100644
index 0000000..7d1c7dc
Binary files /dev/null and b/static/qiehuan.png differ
diff --git a/static/qiehuanke.png b/static/qiehuanke.png
new file mode 100644
index 0000000..00a3f13
Binary files /dev/null and b/static/qiehuanke.png differ
diff --git a/static/randomwallpaper.png b/static/randomwallpaper.png
new file mode 100644
index 0000000..b15d4a3
Binary files /dev/null and b/static/randomwallpaper.png differ
diff --git a/static/recommend/house.png b/static/recommend/house.png
new file mode 100644
index 0000000..bad0222
Binary files /dev/null and b/static/recommend/house.png differ
diff --git a/static/recommend/icon_back.png b/static/recommend/icon_back.png
new file mode 100644
index 0000000..6f96b07
Binary files /dev/null and b/static/recommend/icon_back.png differ
diff --git a/static/recommend/icon_close.png b/static/recommend/icon_close.png
new file mode 100644
index 0000000..3d3fe87
Binary files /dev/null and b/static/recommend/icon_close.png differ
diff --git a/static/recommend/icon_closes.png b/static/recommend/icon_closes.png
new file mode 100644
index 0000000..db875ab
Binary files /dev/null and b/static/recommend/icon_closes.png differ
diff --git a/static/recommend/icon_search.png b/static/recommend/icon_search.png
new file mode 100644
index 0000000..52d3161
Binary files /dev/null and b/static/recommend/icon_search.png differ
diff --git a/static/sigh.png b/static/sigh.png
new file mode 100644
index 0000000..24d9f02
Binary files /dev/null and b/static/sigh.png differ
diff --git a/static/tuya.png b/static/tuya.png
new file mode 100644
index 0000000..c08e169
Binary files /dev/null and b/static/tuya.png differ
diff --git a/static/two.jpg b/static/two.jpg
new file mode 100644
index 0000000..e653402
Binary files /dev/null and b/static/two.jpg differ
diff --git a/static/xingxing.png b/static/xingxing.png
new file mode 100644
index 0000000..cb0ed6e
Binary files /dev/null and b/static/xingxing.png differ
diff --git a/store/index.js b/store/index.js
new file mode 100644
index 0000000..d5f230f
--- /dev/null
+++ b/store/index.js
@@ -0,0 +1,16 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+import appUser from './modules/appUser'
+import goodscate from './modules/goodscate.js'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+	modules: {
+		appUser,
+		goodscate
+	}
+})
+
+export default store
\ No newline at end of file
diff --git a/store/modules/appUser.js b/store/modules/appUser.js
new file mode 100644
index 0000000..dc0eada
--- /dev/null
+++ b/store/modules/appUser.js
@@ -0,0 +1,115 @@
+const user = {
+	state: {
+		appUser: {
+			token: null, // 登录会话token
+			tokenHead: null, // 登录会话token头
+			openid: null, // 微信用户OPENID
+			userid: null, // 系统用户ID
+			userInfo: {}, // 用户信息
+			currentTime: null, // 当前时间
+		},
+		wxInfo: {}, // 微信信息
+		wxJssdkUser: {
+			code: null, // 微信用户code
+			openid: null, // 微信用户OPENID
+			appid: null, // 微信号APPID
+			ticket: null // ticket
+		},
+		refleshStatus: false // 刷新状态
+	},
+
+	getters: {
+		appUser: state => state.appUser,
+		wxInfo: state => state.wxInfo,
+		userInfo: state => state.appUser.userInfo,
+		wxJssdkUser: state => state.appUser.userInfo,
+		refleshStatus: state => state.refleshStatus
+	},
+
+	mutations: {
+		SET_APP_USER: (state, appUser) => {
+			state.appUser.token = appUser.token
+			state.appUser.tokenHead = appUser.tokenHead
+			state.appUser.openid = appUser.openid
+			state.appUser.userid = appUser.userid
+			state.appUser.currentTime = appUser.currentTime
+		},
+		SET_WX_INFO: (state, wxInfo) => {
+			state.wxInfo = wxInfo
+		},
+		SET_USER_INFO: (state, userInfo) => {
+			state.appUser.userInfo = userInfo
+		},
+		SET_TOKEN: (state, token) => {
+			state.appUser.token = token
+		},
+		SET_WX_JSSDK_USER: (state, jssdkUser) => {
+			state.wxJssdkUser.code = jssdkUser.code
+			state.wxJssdkUser.openid = jssdkUser.openid
+			state.wxJssdkUser.appid = jssdkUser.appid
+			state.wxJssdkUser.ticket = jssdkUser.ticket
+		},
+		SET_REFLESH_STATUS: (state, refleshStatus) => {
+			state.refleshStatus = refleshStatus
+		}
+	},
+
+	actions: {
+		setAppUser: ({
+			commit
+		}, appUser) => {
+			commit('SET_APP_USER', appUser)
+		},
+		resetAppUser: ({
+			commit
+		}) => {
+			let appUser = {
+				token: null, // 登录会话token
+				tokenHead: null, // 登录会话token头
+				openid: null, // 微信用户OPENID
+				userid: null, // 系统用户ID
+				userInfo: {}, // 用户信息
+				currentTime: null, // 当前时间
+			}
+			commit('SET_APP_USER', appUser)
+		},
+		resetWxJssdkUser: ({
+			commit
+		}) => {
+			let wxJssdkUser = {
+				code: null, // 微信用户code
+				openid: null, // 微信用户OPENID
+				appid: null, // 微信号APPID
+				ticket: null // ticket
+			}
+			commit('SET_WX_JSSDK_USER', wxJssdkUser)
+		},
+		setWxInfo: ({
+			commit
+		}, wxInfo) => {
+			commit('SET_WX_INFO', wxInfo)
+		},
+		setUserInfo: ({
+			commit
+		}, userInfo) => {
+			commit('SET_USER_INFO', userInfo)
+		},
+		setToken: ({
+			commit
+		}, token) => {
+			commit('SET_TOKEN', token)
+		},
+		setWxJssdkUser: ({
+			commit
+		}, jssdkUser) => {
+			commit('SET_WX_JSSDK_USER', jssdkUser)
+		},
+		setRefleshStatus: ({
+			commit
+		}, refleshStatus) => {
+			commit('SET_REFLESH_STATUS', refleshStatus)
+		}
+	}
+}
+
+export default user
\ No newline at end of file
diff --git a/store/modules/goodscate.js b/store/modules/goodscate.js
new file mode 100644
index 0000000..69cbfbf
--- /dev/null
+++ b/store/modules/goodscate.js
@@ -0,0 +1,46 @@
+const goodsCate = {
+  state: {
+    goodsCateList: [],	// 分类列表
+	cate: {}		 ,  // 作品绘制参数
+	snapshot:[],        // diy操作步骤图	
+	stock:[],           // 设备信息库存信息
+  },
+
+  getters: {
+    goodsCateList: state => state.goodsCateList || [],
+	cate: state => state.cate || {},
+	snapshot: state => state.snapshot || [],
+	stock: state => state.stock || [],
+  },
+
+  mutations: {
+    SET_GOODS_CATE_LIST: (state, goodsCateList) => {
+      state.goodsCateList = goodsCateList
+    },
+	SET_CATE: (state, cate) => {
+	  state.cate = cate
+	},
+	SET_SNAPSHOT: (state, snapshot) => {
+	  state.snapshot = snapshot
+	},
+	SET_STOCK: (state, stock) => {
+	  state.stock = stock
+	},
+  },
+
+  actions: {
+    setGoodsCateList: ({ commit }, goodsCateList) => {
+      commit('SET_GOODS_CATE_LIST', goodsCateList)
+    },
+	setCate: ({ commit }, cate) => {
+	  commit('SET_CATE', cate)
+	},
+	setSnapshot: ({ commit }, snapshot) => {
+	  commit('SET_SNAPSHOT', snapshot)
+	},
+	setStock: ({ commit }, stock) => {
+	  commit('SET_STOCK', stock)
+	},
+  }
+}
+export default goodsCate
\ No newline at end of file
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..9a6702a
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,80 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+$uni-bg-color-primary: #007aff;
+$uni-bg-color-success: #4cd964;
+$uni-bg-color-warning: #f0ad4e;
+$uni-bg-color-error: #dd524d;
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:24upx;
+$uni-font-size-base:28upx;
+$uni-font-size-lg:32upx;
+
+/* 图片尺寸 */
+$uni-img-size-sm:40upx;
+$uni-img-size-base:52upx;
+$uni-img-size-lg:80upx;
+
+/* Border Radius */
+$uni-border-radius-sm: 4upx;
+$uni-border-radius-base: 6upx;
+$uni-border-radius-lg: 12upx;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 10px;
+$uni-spacing-row-base: 20upx;
+$uni-spacing-row-lg: 30upx;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 8upx;
+$uni-spacing-col-base: 16upx;
+$uni-spacing-col-lg: 24upx;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:40upx;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:36upx;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:30upx;
\ No newline at end of file
diff --git a/util/AppContext.js b/util/AppContext.js
new file mode 100644
index 0000000..c7669e9
--- /dev/null
+++ b/util/AppContext.js
@@ -0,0 +1,345 @@
+import Cache from '../cache'
+import $Qs from 'qs'
+import $Enums from './Enums'
+import $nothing from './nothing.js'
+import $store from '../store'
+import {
+	mapGetters,
+	mapActions
+} from 'vuex'
+
+const initEnv = {
+	initConfig: ({
+		store
+	}) => {},
+	initCacheData: ({
+		store
+	}) => {
+		store.dispatch('setAppUser', Cache.getSync(Cache.$Keys.app.APP_USER));
+		store.dispatch('setWxInfo', Cache.getSync(Cache.$Keys.app.WX_INFO));
+		store.dispatch('setUserInfo', Cache.getSync(Cache.$Keys.app.USER_INFO));
+	}
+}
+
+const $AppContext = {
+	_initStatus: false, // 初始化状态
+	$vm: null, // 当前页面VM对象
+	$router: null,
+	$store: null,
+	$cache: Cache,
+	$Qs,
+	$Enums,
+	/**
+	 * 导航对象(不可直接使用,使用getNavigate获取页面级导航对象)
+	 */
+	$Navigate: {
+		path: null,
+		params: null,
+		isTab: false,
+		isBack: false,
+		isCancel: false,
+		reLaunch: false,
+		from: null
+	},
+	/**
+	 * 获取当前页面导航对象
+	 */
+	getNavigate: () => Object.assign(this.$AppContext.getCurrentPage().data.$Navigate || {}, {
+		/**
+		 * 返回并且非取消(系统按键返回)
+		 */
+		isBackNoCancel: () => (this.$AppContext.getCurrentPage().data.$Navigate || {}).isBack && !(this.$AppContext.getCurrentPage()
+			.data.$Navigate || {}).isCancel
+	}),
+	/**
+	 * 获取当前页面对象
+	 */
+	getCurrentPage: () => getCurrentPages()._last(),
+	/**
+	 * 获取前一个页面对象
+	 */
+	getPreviousPage: () => getCurrentPages()[getCurrentPages().length - 2] || {},
+	/**
+	 * 获取当前页面参数
+	 */
+	getParams: () => this.$AppContext.getNavigate().params || {},
+	/**
+	 * 设置导航栏颜色
+	 */
+	setNavigationBarColor: ({
+		frontColor,
+		backgroundColor
+	} = {}) => {
+		frontColor = $nothing._ifNull(frontColor, '#ffffff')
+		backgroundColor = $nothing._ifNull(backgroundColor, '#5cadff')
+		wx.setNavigationBarColor({
+			frontColor,
+			backgroundColor
+		})
+		Cache.setSync(Cache.$Keys.app.NAVIGATION_BAR_FRONT_COLOR, frontColor)
+		Cache.setSync(Cache.$Keys.app.NAVIGATION_BAR_BACKGROUND_COLOR, backgroundColor)
+	},
+	showTabBarRedDot: (params = {}) => {
+		wx.showTabBarRedDot(params)
+	},
+	hideTabBarRedDot: (params = {}) => {
+		wx.hideTabBarRedDot(params)
+	},
+	setTabBarBadge: (params = {}) => {
+		wx.setTabBarBadge(params)
+	},
+	removeTabBarBadge: (params = {}) => {
+		wx.removeTabBarBadge(params)
+	},
+	/**
+	 * 获取缓存的导航栏颜色
+	 */
+	getCacheNavigationBarColor: () => {
+		let frontColor = Cache.getSync(Cache.$Keys.app.NAVIGATION_BAR_FRONT_COLOR)
+		let backgroundColor = Cache.getSync(Cache.$Keys.app.NAVIGATION_BAR_BACKGROUND_COLOR)
+		return {
+			frontColor,
+			backgroundColor
+		}
+	},
+	/**
+	 * main.js vue实例化的 created 中 使用 AppContext.use(vue) 初始化 $vm、$router、$store
+	 * @param vm
+	 */
+	use: (vm) => {
+		vm.$AppContext.$router = vm.$router
+		vm.$AppContext.$store = vm.$store
+		vm.$AppContext.$store.mapGetters = mapGetters
+		vm.$AppContext.$store.mapActions = mapActions
+	},
+	/**
+	 * main.js vue实例化的 created 中调用
+	 * @param vm
+	 */
+	initialize: (vm) => {
+		if (!vm.$AppContext._initStatus) {
+			vm.$AppContext._initStatus = true
+			vm.$AppContext.use(vm)
+			initEnv.initConfig({ store: vm.$AppContext.$store })
+			initEnv.initCacheData({ store: vm.$AppContext.$store })
+		}
+	},
+	/* 
+	 * 判断用户登录状态是否过期,重新登录
+	 * @param vm
+	 */
+	checkLogin: () => {
+		if (!$store.getters.appUser.currentTime || $nothing._isNull($store.getters.appUser.token)
+			|| ($store.getters.appUser.currentTime && new Date().getTime() - $store.getters.appUser.currentTime >= 86400000)) return false
+		else return true
+		// return false
+	},
+	logout: (vm) => {
+		vm.$AppContext.$store.dispatch('resetAppUser')
+		vm.$AppContext.$store.dispatch('setWxInfo', {})
+		vm.$AppContext.$store.dispatch('resetAppUser')
+		Cache.removeSync(Cache.$Keys.app.APP_USER)
+		Cache.removeSync(Cache.$Keys.app.WX_INFO)
+		Cache.removeSync(Cache.$Keys.app.USER_INFO)
+	},
+	/**
+	 * 导航跳转页面
+	 * @param {*} options
+	 */
+	navigateTo: ({
+		path = null,
+		isTab = false,
+		reLaunch = false,
+		params = {},
+		onComplete = (res) => {},
+		onAbort = (res) => {},
+		onSuccess = (res) => {},
+		userCallBack = (res) => {}
+	} = {}) => {
+		this.$AppContext.$Navigate = {
+			path,
+			params,
+			isTab,
+			isBack: false,
+			isCancel: false,
+			reLaunch,
+			from: this.$AppContext.getCurrentPage().route,
+			userCallBack
+		}
+		console.log('### navigateTo: ' + this.$AppContext.$Navigate.from)
+		console.warn($nothing._copy(this.$AppContext.$Navigate))
+		this.$AppContext.$router.push({
+			path,
+			isTab,
+			reLaunch
+		}, onComplete, onAbort, onSuccess)
+	},
+	/**
+	 * 导航跳转Tab页
+	 * @param {*} options
+	 */
+	navigateToTab: ({
+		path = null,
+		reLaunch = false,
+		params = {},
+		onComplete = (res) => {},
+		onAbort = (res) => {},
+		onSuccess = (res) => {},
+		userCallBack = (res) => {}
+	} = {}) => {
+		this.$AppContext.navigateTo({
+			path,
+			isTab: true,
+			reLaunch,
+			params,
+			onComplete,
+			onAbort,
+			onSuccess,
+			userCallBack
+		})
+	},
+	/**
+	 * 导航替换
+	 * @param {*} options
+	 */
+	replaceTo: ({
+		path = null,
+		params = null,
+		onComplete = (res) => {},
+		onAbort = (res) => {},
+		onSuccess = (res) => {},
+		userCallBack = (res) => {}
+	} = {}) => {
+		this.$AppContext.$Navigate = {
+			path,
+			params,
+			isTab: false,
+			isBack: true,
+			isReplace: true,
+			isCancel: false,
+			reLaunch: false,
+			// from: this.$AppContext.getCurrentPage().route,
+			from: this.$AppContext.getPreviousPage().route,
+			userCallBack
+		}
+		console.log('### replaceTo: ' + this.$AppContext.$Navigate.from)
+		console.warn($nothing._copy(this.$AppContext.$Navigate))
+		this.$AppContext.$router.replace({
+			path
+		}, onComplete, onAbort, onSuccess)
+	},
+	/**
+	 * 导航返回
+	 * @param {*} options
+	 */
+	navigateBack: ({
+		params = null,
+		isTab = false
+	} = {}) => {
+		this.$AppContext.$Navigate = {
+			path: this.$AppContext.getPreviousPage().route,
+			params,
+			isTab,
+			isBack: true,
+			isCancel: false,
+			reLaunch: false,
+			from: getCurrentPages()[getCurrentPages().length - 3] ? getCurrentPages()[getCurrentPages().length - 3].route : null,
+			backFrom: this.$AppContext.getCurrentPage().route
+		}
+		console.log('### navigateBack: ' + this.$AppContext.$Navigate.backFrom)
+		console.warn($nothing._copy(this.$AppContext.$Navigate))
+		this.$AppContext.$router.back()
+	},
+	navigateGo: ({
+		params = null,
+		isTab = false
+	} = {}) => {
+		this.$AppContext.$Navigate = {
+			path: this.$AppContext.getPreviousPage().route,
+			params,
+			isTab,
+			isBack: true,
+			isCancel: false,
+			reLaunch: false,
+			from: getCurrentPages()[getCurrentPages().length - 3] ? getCurrentPages()[getCurrentPages().length - 3].route : null,
+			backFrom: this.$AppContext.getCurrentPage().route
+		}
+		console.log('### navigateGo: ' + this.$AppContext.$Navigate.backFrom)
+		console.warn($nothing._copy(this.$AppContext.$Navigate))
+		this.$AppContext.$router.back()
+	},
+	/**
+	 * 页面显示处理
+	 * @param vm
+	 */
+	pageOnShow: (vm) => {
+		this.$AppContext.$vm = vm
+		// 将导航对象设置到当前页对象
+		this.$AppContext.getCurrentPage().setData({
+			$Navigate: $nothing._copy(this.$AppContext.$Navigate)
+		})
+		// 还原导航对象
+		this.$AppContext.$Navigate = {
+			path: null,
+			params: null,
+			isTab: false,
+			isBack: false,
+			isCancel: false,
+			reLaunch: false,
+			from: null
+		}
+		// BACK后跳转处理
+		if (this.$AppContext.getNavigate().isBack && this.$AppContext.getNavigate().backNavigate) {
+			let backNavigate = this.$AppContext.getNavigate().backNavigate
+			if (backNavigate.type === 'BACK') {
+				this.$AppContext.navigateBack(backNavigate.options)
+			} else if (backNavigate.type === 'REPLACE') {
+				this.$AppContext.replaceTo(backNavigate.options)
+			} else if (backNavigate.type === 'TAB') {
+				this.$AppContext.navigateToTab(backNavigate.options)
+			} else {
+				this.$AppContext.navigateTo(backNavigate.options)
+			}
+		}
+	},
+	/**
+	 * 页面卸载处理
+	 */
+	pageOnUnload: ({
+		backNavigate = null,
+		params = null
+	} = {}) => {
+		// 是否取消操作(系统按键返回)
+		if (!this.$AppContext.$Navigate.isBack) {
+			this.$AppContext.$Navigate = {
+				path: this.$AppContext.getPreviousPage().route,
+				params: null,
+				isTab: false,
+				isBack: true,
+				isCancel: true,
+				reLaunch: false,
+				from: getCurrentPages()[getCurrentPages().length - 3] ? getCurrentPages()[getCurrentPages().length - 3].route : null,
+				backFrom: this.$AppContext.getCurrentPage().route
+			}
+			console.log('### sysBack: ' + this.$AppContext.$Navigate.backFrom)
+			console.warn($nothing._copy(this.$AppContext.$Navigate))
+		}
+		// 如传递参数,则进行合并
+		if (params) {
+			if (this.$AppContext.$Navigate.params) {
+				Object.assign(this.$AppContext.$Navigate.params, params)
+			} else this.$AppContext.$Navigate.params = params
+		}
+		this.$AppContext.$Navigate.backNavigate = backNavigate
+	}
+}
+
+if (typeof wx !== 'undefined' && !wx.miniProgram) {
+  // 小程序环境
+  wx.$AppContext = $AppContext
+} else {
+  window.$AppContext = $AppContext
+  Object.assign(window, $AppContext)
+}
+
+export default $AppContext
diff --git a/util/Enums.js b/util/Enums.js
new file mode 100644
index 0000000..9d130c7
--- /dev/null
+++ b/util/Enums.js
@@ -0,0 +1,80 @@
+/**
+ * 数据方向
+ */
+const DATA_DIRECTION = {
+  UP: 'UP',
+  DOWN: 'DOWN'
+}
+
+/**
+ * 数据排序
+ */
+const DATA_ORDER_BY = {
+  ASC: 'ASC',
+  DESC: 'DESC'
+}
+
+/**
+ * 字符串样式
+ */
+const StringStyle = {
+  UPPER: 'UPPER', // 大写
+  LOWER: 'LOWER'  // 小写
+}
+
+/**
+ * 数据类型
+ */
+const DataType = {
+  JSON: 'Json',
+  ARRAY: 'Array',
+  DATE: 'Date',
+  STRING: 'String',
+  NUMBER: 'Number',
+  file:'file'
+}
+
+/**
+ * HTTP请求Header类型
+ */
+const ContentType = {
+  FORM: 'application/x-www-form-urlencoded',
+  FORM_UTF8: 'application/x-www-form-urlencoded;charset=utf-8',
+  JSON: 'application/json',
+  JSON_UTF8: 'application/json;charset=utf-8',
+  MULTIPART_FORM: 'mutipart/form-data'
+}
+
+/**
+ * 订单状态
+ * 0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
+ */
+const OrderStatus = {
+	UNPAY: 0,
+	UNDELIVER: 1,
+	DELIVER: 2,
+	FINISH: 3,
+	CLOSED: 4,
+	INVALID: 5
+}
+
+export default {
+  DATA_DIRECTION,
+  DATA_ORDER_BY,
+  StringStyle,
+  DataType,
+  ContentType,
+  // 公共枚举值
+  TRUE: true,
+  FALSE: false,
+  STR_TRUE: '1',
+  STR_FALSE: '0',
+  N_TRUE: 1,
+  N_FALSE: 0,
+  YES: 1,
+  NO: 0,
+  STR_YES: '1',
+  STR_NO: '0',
+  ZERO: 0,
+	OrderStatus
+}
diff --git a/util/Env.js b/util/Env.js
new file mode 100644
index 0000000..a0332e6
--- /dev/null
+++ b/util/Env.js
@@ -0,0 +1,28 @@
+const accountInfo = wx.getAccountInfoSync();
+if(!accountInfo.miniProgram.envVersion){
+  // console.error("获取运行环境失败!");
+}
+const baseApi = {
+  //开发版
+  develop: "https://tprint.refinecolor.com",
+  //develop: "https://tprint.colorpark.cn",
+  //体验版
+  trial: "https://tprint.refinecolor.com",
+  //trial: "https://tprint.colorpark.cn",
+  //正式版
+  release: "https://tprint.colorpark.cn",
+};
+const baseURL = baseApi[accountInfo.miniProgram.envVersion]
+const Env = {
+	getDevBaseURL: () => baseURL, //开发版
+	getBaseURL: () => baseURL, //上线版
+	getmachineId: () => '100022',  //'100022',//'100022' /* '100022', *///体验机器编码
+	getmalltext: () => "色彩公园手机壳",
+	getAppID: () => "wxdca8810ccd426633",
+	getcompany: () => "深圳市瑞丰彩科技有限公司",
+	//跳转-色彩公园小程序
+	getappId: () => "wx55b5b6d95c648041",
+	//getenvVersion: () => "trial",
+	getenvVersion: () => "release",	
+}
+export default Env
diff --git a/util/base.js b/util/base.js
new file mode 100644
index 0000000..ccbf9a1
--- /dev/null
+++ b/util/base.js
@@ -0,0 +1,37 @@
+export default {
+    typefacedata:[],// 字体列表
+	isclick:true ,// 防止重复点击
+	Userres:null,//用户登录信息
+	appInformationOld:null,// 记录手机信息
+	appInformation:null,// 记录手机信息
+	productfind:null,// 记录设备手机型号
+	terminal:2,//渠道终端,1:平板, 2:手机,3:抖音
+	promoter_id:0,// 推广的员的编号
+	Distribution:0,// 是否开启配送
+	latitude:null,//用户坐标
+	longitude:null,//用户坐标
+	address:'',//获取用户抖音地址
+	setsn:{},//记录用户操作信息
+	machine_id:0,//用户进入设备id
+	coupon_flag_desc:'',//提示,如:当前贴图为“森之谷”IP图,需提前领取代金券方可使用,如未领券请前往XXX领券。
+	//记录手机壳尺寸信息
+	mobilePhoneCaseSize:null,
+	teststate:false,//开启测试模式
+	lockInventory:null,//锁库存储存信息
+	titleHeight:null,//导航条高度
+	surfaceData:{
+		surface_type:0, //材质类型 0:默认 1:自带壳 2:定制壳
+		surface_id: 0,//材质对应的编号,没有的话就为0或者不传
+		surface_color: null,//材质颜色
+		surfaceName:null,//材质名称
+		surface_color_series_id:0, //选择的色系编号,没有的话就不传或者为0
+		surface_color_id:0 ,//选择的颜色编号,没有的话就不传或者为0
+		surface_color_series_id_text:null,
+		surface_color_id_text:null,
+		switchBrandState:0,
+	},
+	goodsTemporaryId:null,//临时id
+	goodsOldId:null,//旧id
+	partner_id:null,// 代理Id
+	goods_feature_id:null, //属性
+}
\ No newline at end of file
diff --git a/util/http.js b/util/http.js
new file mode 100644
index 0000000..f2f9993
--- /dev/null
+++ b/util/http.js
@@ -0,0 +1,86 @@
+import Env from '@/util/Env.js'
+import store from '../store'
+const baseUrl = Env.getBaseURL();
+
+const http = ({ url = '', param = {}, ...other } = {}) => {
+  // wx.showLoading({
+  //   title: '啊嘞,色彩正在绘制'
+  // });
+  let timeStart = Date.now();
+  return new Promise((resolve, reject) => {
+    wx.request({
+      url: getUrl(url),
+      data: param,
+      header:{
+        'content-type': 'application/json', // 默认值,另一种是"content-type" : "application/x-www-form-urlencoded"
+		'token':store.getters.appUser.token
+      },
+      ...other,
+      complete(res) {
+        wx.hideLoading();
+        //console.log(`耗时${Date.now()} - timeStart`);
+        if(res.statusCode >= 200 && res.statusCode < 300){
+          resolve(res.data);
+        }else{
+          reject(res);
+        }
+      }
+    })
+  })
+}
+
+const getUrl = (url) => {
+  if(url.indexOf('://') == -1){
+    url = baseUrl + url;
+  }
+  return url;
+}
+
+const get = (url, param = {}) => {
+  return http({
+    url,
+    param
+  });
+}
+
+const post = (url, param = {}) => {
+  return http({
+    url,
+    param,
+    method: 'post'
+  });
+}
+
+const put = (url, param = {}) => {
+  return http({
+    url,
+    param,
+    method: 'put'
+  });
+}
+
+const del =  (url, param ={}) => {
+  return http({
+    url,
+    param,
+    method: 'delete'
+  });
+}
+
+module.exports = {
+  baseUrl,
+  get,
+  post,
+  put,
+  del
+}
+
+// http.get('https://ccdcapi.alipay.com/validateAndCacheCardInfo.json',{
+// 	_input_charset:'utf-8',
+// 	cardNo:'6227003320240034988',
+// 	cardBinCheck:true
+// }).then(result => {
+// 	console.log(result.bank)
+// }).catch(err => {
+// 	uni.showToast({ title: err.msg, icon: 'none' });
+// })
\ No newline at end of file
diff --git a/util/loadFont.js b/util/loadFont.js
new file mode 100644
index 0000000..8bfdcc4
--- /dev/null
+++ b/util/loadFont.js
@@ -0,0 +1,54 @@
+let loadFont = function(textlist,list) {
+	// var num = 0
+	// const source = {
+	// 	100: 'url("http://tprint.refinecolor.com/text/CangErXiaoWanZi.ttf")',
+	// 	1: 'url("https://tprint.refinecolor.com/text/Qiantu_rabbit.ttf")',
+	// 	2: 'url("https://tprint.refinecolor.com/text/Stand_cool_black.ttf")',
+	// 	3: 'url("https://tprint.refinecolor.com/text/Standing_cool_happy_body.ttf")',
+	// 	4: 'url("https://tprint.refinecolor.com/text/ZhankuQingkeButterBody.ttf")',
+	// 	5: 'url("https://tprint.refinecolor.com/text/Font_horizon_method_stick_body.ttf")',
+	// }
+	uni.showLoading({
+		title: '加载字体...',
+		mask: true,
+	});
+	wx.loadFontFace({
+		global:true,
+		family: textlist.key,
+		source: 'url(' + textlist.remark + ')',
+		desc: {
+			weight: 100
+		},
+		success: function(message) {
+			// console.log('load font-family success:', message)
+			textlist.textlong = true
+		},
+		fail: function(message) {
+			textlist.textlong = false
+			// console.log('load font-family fail: ', message)
+		},
+		complete(res) {
+			uni.hideLoading();
+			// wx.showToast({title: '字体下载完成',icon: 'success',duration: 2000});
+			// console.log('complete', res)
+			textlist.long = true
+			// list.forEach(item=>{
+			// 	if(item.long == true){
+			// 		num++
+			// 	}
+			// })
+			// uni.showLoading({
+			// 	title: num + '/' + list.length + '字体加载中...',
+			// 	mask: true,
+			// });
+			// if(num == 6){
+			// 	uni.hideLoading();
+			// 	wx.showToast({title: '字体加载完成',icon: 'success',duration: 2000});
+			// }
+			// num = 0
+		}
+	})
+	
+}
+
+export default loadFont
diff --git a/util/louvre.js b/util/louvre.js
new file mode 100644
index 0000000..422e938
--- /dev/null
+++ b/util/louvre.js
@@ -0,0 +1,368 @@
+/**
+ * @author itorr<https://github.com/itorr>
+ * @date 2022-06-01
+ * @Description One Last Image
+ */
+const randRange = (a, b) => Math.floor(Math.random() * (b - a) + a);
+const inputImageEl = document.querySelector('#input');
+let width = 640;
+let height = 480;
+let scale = width / height;
+let lastConfigString = null;
+const canvas = document.createElement('canvas');
+const ctx = canvas.getContext('2d');
+const canvasShade = document.createElement('canvas');
+const canvasShadeMin = document.createElement('canvas');
+const canvasMin = document.createElement('canvas');
+const pencilTextureCanvas = document.createElement('canvas');
+const louvre = async ({img, outputCanvas, config, callback}) => {
+	console.log(config)
+	config.kuma = false;
+	config.watermark = false;
+	config.hajimei = false;
+	if (!img || !config) return;
+	const configString = [JSON.stringify(config),img.src,].join('-');
+	if (lastConfigString === configString) return;
+	lastConfigString = configString;
+	const oriWidth = img.naturalWidth;
+	const oriHeight = img.naturalHeight;
+	let oriScale = oriWidth / oriHeight;
+	let _width  = Math.round( oriWidth   / config.zoom );
+	let _height = Math.round( oriHeight  / config.zoom );
+	const maxWidth = 1920;
+	if(_width > maxWidth){
+		_height = _height * maxWidth / _width
+		_width = maxWidth
+	}
+	let cutLeft = 0;
+	let cutTop = 0;
+	let calcWidth = oriWidth;
+	let calcHeight = oriHeight;
+	if(config.cover){
+		if(oriScale > 1){
+			cutLeft = (oriScale - 1) * oriHeight / 2;
+			cutLeft = Math.round(cutLeft);
+			calcWidth = oriHeight;
+			_width = _height;
+		}else{
+			cutTop =  (1 - oriScale) * oriHeight / 2;
+			cutTop = Math.round(cutTop);
+			calcHeight = oriWidth;
+			_height = _width;
+		}
+	}
+	let setLeft = 0;
+	let setTop = 0;
+	let setWidth = _width;
+	let setHeight = _height;
+	canvas.width = _width;
+	canvas.height = _height;
+	ctx.drawImage(
+		img,
+		cutLeft, cutTop,
+		calcWidth, calcHeight,
+		setLeft, setTop,
+		setWidth, setHeight
+	);
+	let pixel = ctx.getImageData(0, 0, _width, _height);
+	let pixelData = pixel.data;
+	for (let i = 0; i < pixelData.length; i += 4) {
+		const r = pixelData[i];
+		const g = pixelData[i + 1];
+		const b = pixelData[i + 2];
+		let y = r * .299000 + g * .587000 + b * .114000;
+		y = Math.floor(y);
+		pixelData[i] = y;
+		pixelData[i + 1] = y;
+		pixelData[i + 2] = y;
+	}
+	let shadePixel;
+	const { 
+		shadeLimit = 80,
+		shadeLight = 40 
+	} = config;
+	let pencilTexturePixel;
+	if(config.shade){
+		pencilTextureCanvas.width = _width;
+		pencilTextureCanvas.height = _height;
+		const pencilTextureCtx = pencilTextureCanvas.getContext('2d');
+		const pencilSetWidthHeight = Math.max(_width,_height);
+		pencilTextureCtx.drawImage(
+			pencilTextureEl,
+			0,0,
+			1200,1200,
+			0,0,
+			pencilSetWidthHeight,pencilSetWidthHeight
+		);
+		pencilTexturePixel = pencilTextureCtx.getImageData(0,0,_width,_height);
+		//处理暗面
+		shadePixel = ctx.createImageData(_width, _height);
+		for (let i = 0; i < pixelData.length; i += 4) {
+			let y = pixelData[i];
+			y = y > shadeLimit ? 0 : 255; 
+			shadePixel.data[i    ] = y;
+			shadePixel.data[i + 1] = 128;
+			shadePixel.data[i + 2] = 128;
+			shadePixel.data[i + 3] = Math.floor(Math.random() * 255)//Math.ceil( y + Math.random() * 40 - 20);
+		}
+		const ctxShade = canvasShade.getContext('2d');
+		const ctxShadeMin = canvasShadeMin.getContext('2d');
+		canvasShade.width = _width;
+		canvasShade.height = _height;
+		ctxShade.putImageData(shadePixel, 0, 0);
+		const shadeZoom = 4;
+		canvasShadeMin.width = Math.floor(_width/shadeZoom);
+		canvasShadeMin.height = Math.floor(_height/shadeZoom);
+		ctxShadeMin.drawImage(
+			canvasShade,
+			0,0,
+			canvasShadeMin.width,canvasShadeMin.height
+		);
+		ctxShade.clearRect(0,0,_width,_height)
+		ctxShade.drawImage(
+			canvasShadeMin,
+			0,0,
+			_width,_height
+		);
+		shadePixel = ctxShade.getImageData(0,0,_width,_height);
+		for (let i = 0; i < shadePixel.data.length; i += 4) {
+			let y = shadePixel.data[i];
+			y = Math.round((255-pencilTexturePixel.data[i]) / 255 * y / 255 * shadeLight); //((255 - pencilTexturePixel.data[i]) + Math.random() * 40 - 20);
+			shadePixel.data[i] = y;
+		}
+	}
+	const { 
+		light = 0,
+	} = config;
+	if(light){
+		for (let i = 0; i < pixelData.length; i += 4) {
+			let y = pixelData[i];
+			y = y + y * (light/100);
+			pixelData[i    ] = y;
+			pixelData[i + 1] = y;
+			pixelData[i + 2] = y;
+		}
+	}
+	if(config.denoise){
+		pixel = convoluteY(
+			pixel,
+			[
+				1/9, 1/9, 1/9,
+				1/9, 1/9, 1/9,
+				1/9, 1/9, 1/9
+			],
+			ctx
+		);
+	}
+	const convoluteMatrix = config.Convolutes[config.convoluteName];
+	let pixel1 = convoluteMatrix ? convoluteY(
+		pixel,
+		convoluteMatrix,
+		ctx
+	) : pixel;
+	if(convoluteMatrix && config.convolute1Diff){
+		let pixel2 = config.convoluteName2 ? convoluteY(
+			pixel,
+			config.Convolutes[config.convoluteName2],
+			ctx
+		) : pixel;
+		for (let i = 0; i < pixel2.data.length; i +=4) {
+			let r = 128 + pixel2.data[i  ] - pixel1.data[i  ];
+			pixel2.data[i  ] = r;
+			pixel2.data[i+1] = r;
+			pixel2.data[i+2] = r;
+			pixel2.data[i+3] = 255;
+		}
+		pixel = pixel2;
+	}else{
+		//不对比
+		pixel = pixel1;
+	}
+	pixelData = pixel.data;
+	if(convoluteMatrix)
+	if(config.lightCut || config.darkCut){
+		const scale = 255 / (255 - config.lightCut - config.darkCut);
+		for (let i = 0; i < pixelData.length; i += 4) {
+			let y = pixelData[i];
+			y = (y - config.darkCut) * scale;
+			y = Math.max(0,y);
+			pixelData[i+0 ] = y
+			pixelData[i+1 ] = y
+			pixelData[i+2 ] = y
+			pixelData[i+3 ] = 255
+		}
+	}
+	if(config.kuma){
+		const hStart = 30;
+		const hEnd = -184;
+		const gradient = ctx.createLinearGradient(0,0, _width,_height);
+		gradient.addColorStop(0, '#fbba30');
+		gradient.addColorStop(0.4, '#fc7235');
+		gradient.addColorStop(.6, '#fc354e');
+		gradient.addColorStop(.7, '#cf36df');
+		gradient.addColorStop(.8, '#37b5d9');
+		gradient.addColorStop(1, '#3eb6da');
+		ctx.fillStyle = gradient;
+		ctx.fillRect(0, 0, _width, _height);
+		let gradientPixel = ctx.getImageData(0, 0, _width, _height);
+		for (let i = 0; i < pixelData.length; i += 4) {
+			let y = pixelData[i];
+			let p = Math.floor(i / 4);
+			let _h = Math.floor(p/_width);
+			let _w = p % _width;
+			pixelData[i+0 ] = gradientPixel.data[i + 0];
+			pixelData[i+1 ] = gradientPixel.data[i + 1];
+			pixelData[i+2 ] = gradientPixel.data[i + 2];
+			y = 255 - y;
+			if(config.shade){
+				y = Math.max(
+					y,
+					shadePixel.data[i]
+				);
+			}
+			pixelData[i+3 ] = y
+		}
+	}
+	ctx.putImageData(pixel, 0, 0);
+	const ctxMin = canvasMin.getContext('2d');
+	canvasMin.width = Math.floor(_width/1.4);
+	canvasMin.height = Math.floor(_height/1.3);
+	ctxMin.clearRect(0,0,canvasMin.width,canvasMin.height)
+	ctxMin.drawImage(
+		canvas,
+		0,0,
+		canvasMin.width,canvasMin.height
+	);
+	ctx.clearRect(0,0,_width,_height)
+	ctx.drawImage(
+		canvasMin,
+		0,0,
+		canvasMin.width,canvasMin.height,
+		0,0,_width,_height
+	);
+	if(config.watermark){
+		const watermarkImageWidth = watermarkImageEl.naturalWidth;
+		const watermarkImageHeight = watermarkImageEl.naturalHeight / 2;
+		let setWidth = _width * 0.3;
+		let setHeight = setWidth / watermarkImageWidth * watermarkImageHeight;
+		if( _width / _height  > 1.1 ){
+			setHeight = _height * 0.15;
+			setWidth = setHeight / watermarkImageHeight * watermarkImageWidth;
+		}
+		let cutTop = 0;
+		if(config.hajimei){
+			cutTop = watermarkImageHeight;
+		}
+		let setLeft = _width - setWidth - setHeight * 0.2;
+		let setTop = _height - setHeight - setHeight * 0.16;
+		ctx.drawImage(
+			watermarkImageEl,
+			0,cutTop,
+			watermarkImageWidth,watermarkImageHeight,
+			setLeft, setTop,
+			setWidth, setHeight
+		);
+	}
+	const outputCtx = outputCanvas.getContext('2d');
+	outputCanvas.width = _width;
+	outputCanvas.height = _height;
+	outputCtx.fillStyle = '#FFF';
+	outputCtx.fillRect(0,0,_width,_height);
+	outputCtx.drawImage(canvas,0,0,_width,_height);
+	console.timeEnd('louvre');
+};
+
+let loadImage = (url,onOver)=>{
+	const el = new Image();
+	el.onload = _=>onOver(el);
+	el.src = url;
+};
+
+let loadImagePromise = async url=>{
+	return new Promise(function(resolve, reject){
+		setTimeout(function(){
+			const el = new Image();
+			el.onload = _=>resolve(el);
+			el.onerror = e=>reject(e);
+			el.src = url;
+		}, 2000);
+	});
+}
+
+let watermarkImageEl;
+let pencilTextureEl;
+const louvreInit = onOver=>{
+	loadImage('pencil-texture.jpg',el=>{
+		pencilTextureEl = el;
+		loadImage('one-last-image-logo2.png',el=>{
+			watermarkImageEl = el;
+			onOver();
+		});
+	});
+};
+
+let convolute = (pixels, weights, ctx) => {
+	const side = Math.round(Math.sqrt(weights.length));
+	const halfSide = Math.floor(side / 2);
+	const src = pixels.data;
+	const sw = pixels.width;
+	const sh = pixels.height;
+	const w = sw;
+	const h = sh;
+	const output = ctx.createImageData(w, h);
+	const dst = output.data;
+	for (let y = 0; y < h; y++) {
+		for (let x = 0; x < w; x++) {
+			const sy = y;
+			const sx = x;
+			const dstOff = (y * w + x) * 4;
+			let r = 0, g = 0, b = 0;
+			for (let cy = 0; cy < side; cy++) {
+				for (let cx = 0; cx < side; cx++) {
+					const scy = Math.min(sh - 1, Math.max(0, sy + cy - halfSide));
+					const scx = Math.min(sw - 1, Math.max(0, sx + cx - halfSide));
+					const srcOff = (scy * sw + scx) * 4;
+					const wt = weights[cy * side + cx];
+					r += src[srcOff] * wt;
+					g += src[srcOff + 1] * wt;
+					b += src[srcOff + 2] * wt;
+				}
+			}
+			dst[dstOff] = r;
+			dst[dstOff + 1] = g;
+			dst[dstOff + 2] = b;
+			dst[dstOff + 3] = 255;
+		}
+	}
+	return output;
+};
+
+const convoluteY = (pixels, weights, ctx) => {
+	const side = Math.round( Math.sqrt( weights.length ) );
+	const halfSide = Math.floor(side / 2);
+	const src = pixels.data;
+	const w = pixels.width;
+	const h = pixels.height;
+	const output = ctx.createImageData(w, h);
+	const dst = output.data;
+	for (let sy = 0; sy < h; sy++) {
+		for (let sx = 0; sx < w; sx++) {
+			const dstOff = (sy * w + sx) * 4;
+			let r = 0, g = 0, b = 0;
+			for (let cy = 0; cy < side; cy++) {
+				for (let cx = 0; cx < side; cx++) {
+					const scy = Math.min(h - 1, Math.max(0, sy + cy - halfSide));
+					const scx = Math.min(w - 1, Math.max(0, sx + cx - halfSide));
+					const srcOff = (scy * w + scx) * 4;
+					const wt = weights[cy * side + cx];
+					r += src[srcOff] * wt;
+				}
+			}
+			dst[dstOff] = r;
+			dst[dstOff + 1] = r;
+			dst[dstOff + 2] = r;
+			dst[dstOff + 3] = 255;
+		}
+	}
+	return output;
+};
\ No newline at end of file
diff --git a/util/nothing.js b/util/nothing.js
new file mode 100644
index 0000000..2784cfa
--- /dev/null
+++ b/util/nothing.js
@@ -0,0 +1,700 @@
+/**
+ * nothing.js
+ * version: v1.0.1
+ * author: dengs
+ * mail: cbtak@hotmail.com
+ * github: https://github.com/cbtak/nothing
+ * create date: 2017-6-18
+ *
+ * 说明:平时积累常用的一些系统对象扩展、功能函数集
+ * 在程序入口直接引入即可:
+ * import './utils/nothing'
+ *
+ * 浏览器环境:window.nothing 或 window.$n
+ * 小程序环境:wx.nothing 或 wx.$n
+ * import方式:import nothing from './utils/nothing'
+ *
+ * 更新日志:
+ * modify date: 【2018-10-13】更新代码风格(去除“;”号、“"”改为“'”、去除未使用的变量等...),以兼容ESlint校验
+ * modify date: 【2018-10-15】调整部分语法,以兼容小程序
+ */
+const $nt = {
+  /**
+   * 对象拷贝
+   * 示例:
+   * let a = {name:'this is a'}
+   * let b = _copy()
+   */
+  _copy: function (source) {
+    let result = source instanceof Array ? [] : {}
+    // 日期类型直接返回
+    if (source instanceof Date) {
+      return source
+    }
+    for (let key in source) {
+      result[key] = source[key] && typeof source[key] === 'object' ? $nt._copy(source[key]) : source[key]
+    }
+    return result
+  },
+  /**
+   * 验证是否空值
+   * 示例:
+   * let checkMsg = $nt._isNull(var) ? 'var is null' : 'var not null'
+   * @param {*} val
+   */
+  _isNull: function (val) {
+    return val === null || val === '' || val === undefined
+  },
+  /**
+   * 验证是否非空值
+   * 示例:
+   * let checkMsg = _isNotNull(var) ? 'var not null' : 'var is null'
+   * @param {*} val
+   */
+  _isNotNull: function (val) {
+    return val !== null && val !== '' && val !== undefined
+  },
+  /**
+   * 空值处理(类oracle nvl2)
+   * 如果val为空,则返回val1,不为空时,则验证val2是否为空,val2不为空时返回val2,否则返回val
+   * 示例:
+   * let val = _ifNull(val, 'val1', 'val2')
+   * @param {*} val
+   * @param {*} val1
+   * @param {*} val2
+   */
+  _ifNull: function (val, val1, val2) {
+    return $nt._isNull(val) ? val1 : ($nt._isNull(val2) ? val : val2)
+  },
+  /**
+   * 数值舍入处理(可指定小数位数和舍入模式)
+   * @param {*} num       要格式化的数值
+   * @param {*} precision 小数保留位数
+   * @param {*} mode      舍入模式:0:Math.round  1:Math.ceil  -1:Math.floor
+   */
+  _toFixed: function (num, precision, mode) {
+    num = Number(num)
+    precision = Number(precision || 0)
+    mode = [0, 1, -1]._contains(mode) ? mode : 0
+    // 舍入处理
+    num = $nt._caseValue(mode,
+      0, (precision ? Math.round(num * Math.pow(10, precision)) * (1 / Math.pow(10, precision)) : Math.round(num)),
+      1, (precision ? Math.ceil(num * Math.pow(10, precision)) * (1 / Math.pow(10, precision)) : Math.ceil(num)),
+      -1, (precision ? Math.floor(num * Math.pow(10, precision)) * (1 / Math.pow(10, precision)) : Math.floor(num))
+    )
+    return Number(num.toFixed(precision))
+  },
+  /**
+   * 数值格式化
+   * @param {*} num       要格式化的数值
+   * @param {*} params    参数对象
+   * 参数对象说明:
+   * num              要格式化的数值
+   * params.mode      舍入模式:0:Math.round  1:Math.ceil  -1:Math.floor
+   * params.thousands 是否显示千分位
+   * params.precision 保留小数位数
+   * 示例:
+   * _numberFormat(12806.123)                                                返回:12806
+   * _numberFormat(12806.123, {mode: 0, thousands: true, precision: 2})      返回:12,806.12
+   * _numberFormat(12806.123, {mode: 1, precision: 2})                       返回:12806.13
+   * _numberFormat(12806.126, {mode: -1, thousands: false, precision: 2})    返回:12806.12
+   */
+  _numberFormat: function (num, params) {
+    if ($nt._isNull(num)) return num
+    num = Number(num)
+    params = params || {}
+    // 舍入模式:0:Math.round  1:Math.ceil  -1:Math.floor
+    let mode = [0, 1, -1]._contains(params.mode) ? params.mode : 0
+    // 是否显示千分位
+    let thousands = $nt._isNull(params.thousands) ? false : params.thousands
+    // 显示小数位数
+    let precision = $nt._isNull(params.precision) ? 0 : params.precision
+    // 舍入处理
+    num = $nt._caseValue(mode,
+      0, (precision ? Math.round(num * Math.pow(10, precision)) * (1 / Math.pow(10, precision)) : Math.round(num)),
+      1, (precision ? Math.ceil(num * Math.pow(10, precision)) * (1 / Math.pow(10, precision)) : Math.ceil(num)),
+      -1, (precision ? Math.floor(num * Math.pow(10, precision)) * (1 / Math.pow(10, precision)) : Math.floor(num))
+    )
+    // 按小数点分割为数组
+    let tempArr = num.toString().split('.')
+    // 小数点后的数值处理
+    tempArr[1] = tempArr[1] || ''
+    if (precision) {
+      // 截去多余位数
+      tempArr[1] = tempArr[1].substr(0, precision)
+      // 小数位数处理(不够位数补0)
+      tempArr[1] = '.' + tempArr[1] + new Array(precision - tempArr[1].length + 1).join('0')
+    }
+    // 根据是否显示千分位格式化返回
+    // return (thousands ? Number(tempArr[0]).toLocaleString() : tempArr[0]) + (precision ? tempArr[1] : '')
+    return (thousands ? Number(tempArr[0]).replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') : tempArr[0]) + (precision ? tempArr[1] : '')
+  },
+  /**
+   * 获取地址栏参数
+   * 示例:
+   * let userid = _getParam('userid')
+   * @param {*} key
+   */
+  _getParam: function (key) {
+    let reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)', 'i')
+    let r = window.location.search.substr(1).match(reg)
+    return r ? unescape(r[2]) : null
+  },
+  /**
+   * 匹配函数,类似 oracle 中的 decode
+   * 说明:取第一个参数与后续偶数位置的参数进行比较,如匹配则返回当前比较的偶数位置下一个参数作为结果
+   * 如未找到匹配项目,并且参数个数大于3而且为偶数,则取最后一个参数作为默认值返回
+   * 注:参数为动态参数,参数个数最少为3,否则无意义
+   *     偶数位置被比较的参数可以为数组
+   *     比较使用 === 及 indexOf() 严格匹配值
+   * 示例:
+   * 1. _caseValue('A', 'A', value1, 'B', value2) // 返回 value1
+   * 2. _caseValue('A', 'B', value1, 'A', value2) // 返回 value2
+   * 3. _caseValue('A', 'B', value1, 'C', value2, defaultValue) // 返回 defaultValue
+   * 4. _caseValue('A', 'B', value1, ['A','C'], value2, defaultValue) // 返回 value2
+   *
+   * @param {*} args 动态参数
+   */
+  _caseValue: function (...args) {
+    if (!args || args.length < 3) {
+      return null
+    }
+    let caseKey = args[0]
+    for (let i = 1; i < args.length; i++) {
+      if ((i % 2) && i !== args.length - 1 && (args[i] === caseKey || (Array.isArray(args[i]) && args[i].indexOf(caseKey) !== -1))) {
+        return args[i + 1] === undefined ? null : args[i + 1]
+      }
+    }
+    return args.length > 3 && !(args.length % 2) ? args[args.length - 1] : null
+  },
+  /**
+   * 构建树型数据
+   * @param {*} params
+   */
+  _buildTree: function (params) {
+    if (!params.treeArray) {
+      params.treeArray = []
+    }
+    if (params.element === null) {
+      params.elementArray.forEach(function (item, index, array) {
+        if (item[params.parentKey] === params.rootParentValue) {
+          params.treeArray[params.treeArray.length] = item
+        } else {
+          $nt._buildTree({
+            element: item,
+            elementArray: params.elementArray,
+            treeArray: params.treeArray,
+            elementKey: params.elementKey,
+            parentKey: params.parentKey,
+            childKey: params.childKey,
+            rootParentValue: params.rootParentValue
+          })
+        }
+      })
+    } else {
+      params.elementArray.forEach(function (item, index, array) {
+        if (params.element[params.parentKey] === item[params.elementKey]) {
+          item[params.childKey] = item[params.childKey] || []
+          item[params.childKey][item[params.childKey].length] = params.element
+          // params.element.parentElement = item
+        }
+      })
+    }
+  },
+  /**
+   * 验证手机号码
+   * @param {*} mobile
+   */
+  _validateMobile: function (mobile) {
+    return /^[1][3,4,5,7,8][0-9]{9}$/.test(mobile)
+  },
+  /**
+   * 数值型验证
+   * @param {*} val
+   */
+  _validateNumber: function (val) {
+    return /^\d+(\.\d+)?$/.test(val)
+  },
+  /**
+   * 系统对象功能扩展
+   */
+  _extend: function () {
+    /**
+     * 字符串清除左右空格扩展
+     * 示例:
+     * let str = ' this is string '
+     * let trimStr = str._trim()
+     */
+    String.prototype._trim = function () {
+      return this.replace(/(^\s*)|(\s*$)/g, '')
+    }
+    /**
+     * 字符串替换所有
+     * 示例:
+     * let str = ' this is string '
+     * let replaceStr = str.replaceAll('i','')
+     */
+    String.prototype.replaceAll = function (s1, s2) {
+      return this.replace(new RegExp(s1, 'gm'), s2)
+    }
+    /**
+     * 字符串包含检查
+     * @param {*} str
+     */
+    String.prototype._contains = function (str) {
+      return this.indexOf(str) !== -1
+    }
+    /**
+     * 字符串转byte数组
+     */
+    String.prototype._toByte = function () {
+      let bytes = []
+      let len
+      let c
+      len = this.length
+      for (let i = 0; i < len; i++) {
+        c = this.charCodeAt(i)
+        if (c >= 0x010000 && c <= 0x10FFFF) {
+          bytes.push(((c >> 18) & 0x07) | 0xF0)
+          bytes.push(((c >> 12) & 0x3F) | 0x80)
+          bytes.push(((c >> 6) & 0x3F) | 0x80)
+          bytes.push((c & 0x3F) | 0x80)
+        } else if (c >= 0x000800 && c <= 0x00FFFF) {
+          bytes.push(((c >> 12) & 0x0F) | 0xE0)
+          bytes.push(((c >> 6) & 0x3F) | 0x80)
+          bytes.push((c & 0x3F) | 0x80)
+        } else if (c >= 0x000080 && c <= 0x0007FF) {
+          bytes.push(((c >> 6) & 0x1F) | 0xC0)
+          bytes.push((c & 0x3F) | 0x80)
+        } else {
+          bytes.push(c & 0xFF)
+        }
+      }
+      return bytes
+    }
+    /**
+     * byte数组转换字符串
+     * @param {*} bytes
+     */
+    String._fromByte = function (bytes) {
+      if (!Array.isArray(bytes)) return null
+      let str = ''
+      let _arr = bytes
+      for (let i = 0; i < _arr.length; i++) {
+        let one = _arr[i].toString(2)
+        let v = one.match(/^1+?(?=0)/)
+        if (v && one.length === 8) {
+          let bytesLength = v[0].length
+          let store = _arr[i].toString(2).slice(7 - bytesLength)
+          for (let st = 1; st < bytesLength; st++) {
+            store += _arr[st + i].toString(2).slice(2)
+          }
+          str += String.fromCharCode(parseInt(store, 2))
+          i += bytesLength - 1
+        } else {
+          str += String.fromCharCode(_arr[i])
+        }
+      }
+      return str
+    }
+    /**
+     * Number对象扩展数值格式化
+     * @param {*} params 参数对象
+     *
+     * 参数对象说明:
+     * params.mode      舍入模式:0:Math.round  1:Math.ceil  -1:Math.floor
+     * params.thousands 是否显示千分位
+     * params.precision 保留小数位数
+     * 示例:
+     * Number(12806.123)._format()                                              返回:12806
+     * Number(12806.123)._format({mode: 0, thousands: true, precision: 2})      返回:12,806.12
+     * Number(12806.123)._format({mode: 1, precision: 2})                       返回:12806.13
+     * Number(12806.126)._format({mode: -1, thousands: false, precision: 2})    返回:12806.12
+     */
+    Number.prototype._format = function (params) {
+      return $nt._numberFormat(this, params)
+    }
+    /**
+   * 数值舍入处理(可指定小数位数和舍入模式)
+   * @param {*} precision 小数保留位数
+   * @param {*} mode      舍入模式:0:Math.round  1:Math.ceil  -1:Math.floor
+   */
+    Number.prototype._toFixed = function (precision, mode) {
+      return $nt._toFixed(this, precision, mode)
+    }
+    /**
+     * 日期格式化
+     * @param {*} fmt 日期格式
+     */
+    Date.prototype._format = function (fmt) {
+      if (fmt) {
+        fmt = fmt.replace('H', 'h').replace('H', 'h')
+      }
+      let o = {
+        'M+': this.getMonth() + 1, // 月份
+        'd+': this.getDate(), // 日
+        'h+': this.getHours(), // 小时
+        'm+': this.getMinutes(), // 分
+        's+': this.getSeconds(), // 秒
+        'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
+        'S': this.getMilliseconds() // 毫秒
+      }
+      if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
+      for (let k in o) {
+        if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
+      }
+      return fmt
+    }
+    /**
+     * 日期计算
+     * @param {*} interval
+     * @param {*} number
+     */
+    Date.prototype._add = function (interval, number) {
+      // let cloneDate = JSON.parse(JSON.stringify({date : this}))
+      // let d = new Date(cloneDate.date)
+      let d = new Date(this)
+      let k = {
+        'y': 'FullYear',
+        'q': 'Month',
+        'm': 'Month',
+        'w': 'Date',
+        'd': 'Date',
+        'h': 'Hours',
+        'n': 'Minutes',
+        's': 'Seconds',
+        'ms': 'MilliSeconds'
+      }
+      let n = {
+        'q': 3,
+        'w': 7
+      }
+      interval = (interval || '').toLowerCase()
+      d['set' + k[interval]](d['get' + k[interval]]() + ((n[interval] || 1) * number))
+      return d
+    }
+    /**
+     * 日期差异
+     * @param {*} interval
+     * @param {*} objDate2
+     */
+    Date.prototype._diff = function (interval, diffDate) {
+      let d = this
+      let i = {}
+      let t = d.getTime()
+      let t2 = diffDate.getTime()
+      i['y'] = diffDate.getFullYear() - d.getFullYear()
+      i['q'] = i['y'] * 4 + Math.floor(diffDate.getMonth() / 4) - Math.floor(d.getMonth() / 4)
+      i['m'] = i['y'] * 12 + diffDate.getMonth() - d.getMonth()
+      i['ms'] = diffDate.getTime() - d.getTime()
+      i['w'] = Math.floor((t2 + 345600000) / (604800000)) - Math.floor((t + 345600000) / (604800000))
+      i['d'] = Math.floor(t2 / 86400000) - Math.floor(t / 86400000)
+      i['h'] = Math.floor(t2 / 3600000) - Math.floor(t / 3600000)
+      i['n'] = Math.floor(t2 / 60000) - Math.floor(t / 60000)
+      i['s'] = Math.floor(t2 / 1000) - Math.floor(t / 1000)
+      return i[interval]
+    }
+    /**
+     * 数组为空校验
+     * @param {*} array
+     */
+    Array._isEmpty = function (array) {
+      return !array || !array.length
+    }
+    /**
+     * 数组不为空校验
+     * @param {*} array
+     */
+    Array._isNotEmpty = function (array) {
+      return array && array.length
+    }
+    /**
+     * 数组对象扩展-为空校验
+     */
+    Array.prototype._isEmpty = function () {
+      return Array._isEmpty(this)
+    }
+    /**
+     * 数组对象扩展-不为空校验
+     */
+    Array.prototype._isNotEmpty = function () {
+      return Array._isNotEmpty(this)
+    }
+    /**
+     * 数组是否包含元素
+     * @param {*} array
+     * @param {*} element
+     */
+    Array._contains = function (array, element) {
+      return !array && array.indexOf(element) !== -1
+    }
+    /**
+     * 数组对象扩展-是否包含元素
+     * @param {*} element
+     */
+    Array.prototype._contains = function (element) {
+      return this.indexOf(element) !== -1
+    }
+    /**
+     * 数组对象扩展-添加元素(可指定位置)
+     * @param {*} item  元素
+     * @param {*} index 添加位置(可选,为空时添加到数组末尾)
+     */
+    Array.prototype._add = function (item, index) {
+      if ($nt._isNotNull(index)) {
+        this.splice(index, 0, item)
+      } else {
+        this.push(item)
+      }
+    }
+    /**
+     * 数组对象扩展-批量添加元素(可指定位置)
+     * @param {*} items  元素数组
+     * @param {*} index 添加位置(可选,为空时添加到数组末尾)
+     */
+    Array.prototype._addAll = function (items, index) {
+      this.splice($nt._ifNull(index, this.length), 0, ...items)
+    }
+    /**
+     * 数组对象扩展-添加元素到数据第一个位置
+     * @param {*} item 元素
+     */
+    Array.prototype._addFirst = function (item) {
+      this._add(item, 0)
+    }
+    /**
+     * 数组对象扩展-获取数组第一个元素
+     */
+    Array.prototype._first = function () {
+      return this[0]
+    }
+    /**
+     * 数组对象扩展-获取数组最后一个元素
+     */
+    Array.prototype._last = function () {
+      return this[this.length - 1]
+    }
+    /**
+     * 数组对象扩展-汇总数组元素(数值型有效)
+     * @param {*} beginIndex    开始位置
+     * @param {*} endIndex      结束位置
+     */
+    Array.prototype._sum = function (beginIndex, endIndex) {
+      let total = 0
+      beginIndex = $nt._isNull(beginIndex) ? 0 : beginIndex
+      endIndex = $nt._isNull(endIndex) ? this.length : endIndex
+      for (let i = 0; i < this.length; i++) {
+        if (i >= beginIndex && i < endIndex) {
+          total += Number(this[i] || 0)
+        }
+      }
+      return total
+    }
+    /**
+     * 数组对象扩展-汇总数组元素对象指定属性(数值型有效)
+     * @param {*} attribute     属性
+     * @param {*} beginIndex    开始位置
+     * @param {*} endIndex      结束位置
+     */
+    Array.prototype._sumAttr = Array.prototype._sumObjectAttr = function (attribute, beginIndex, endIndex) {
+      let total = 0
+      beginIndex = $nt._isNull(beginIndex) ? 0 : beginIndex
+      endIndex = $nt._isNull(endIndex) ? this.length : endIndex
+      for (let i = 0; i < this.length; i++) {
+        if (i >= beginIndex && i < endIndex) {
+          total += Number(this[i][attribute] || 0)
+        }
+      }
+      return total
+    }
+    /**
+     * 数组对象扩展-移除元素
+     * @param {*} element
+     */
+    // Array.prototype._remove = function (element) {
+    //   this.splice(this.findIndex(item => item === element), 1)
+    //   return this
+    // }
+    Object.defineProperty(Array.prototype, '_remove', {
+      value: function (element) {
+        return this.splice(this.findIndex(item => item === element), 1)
+      }
+    })
+    /**
+     * 数组对象扩展-批量获取属性值
+     * 示例:
+     * let jsonArray = [{a:1,b:1},{a:2,b:2},{a:3,b:3},{a:4,b:4},{a:5,b:5}]
+     * let valueArray = jsonArray._getObjectAttr('a') 或 _getObjectAttr('a')
+     * let valueArray = jsonArray._getObjectAttr('a', 1, 3) 或 _getObjectAttr('a', 1, 3)
+     * @param {*} attribute
+     * @param {*} beginIndex
+     * @param {*} endIndex
+     */
+    Array.prototype._getAttr = Array.prototype._getObjectAttr = Array.prototype._getObjectAttribute = function (attribute, beginIndex, endIndex) {
+      let valArray = []
+      beginIndex = $nt._isNull(beginIndex) ? 0 : beginIndex
+      endIndex = $nt._isNull(endIndex) ? this.length : endIndex
+      for (let i = 0; i < this.length; i++) {
+        if (i >= beginIndex && i < endIndex) {
+          let val = (typeof this[i][attribute] === 'object' && !(this[i][attribute] instanceof Date) ? $nt._copy(this[i][attribute]) : this[i][attribute]) || null
+          valArray.push(val)
+        }
+      }
+      return valArray
+    }
+    /**
+     * 数组对象扩展-批量设置属性值
+     * 示例:
+     * let jsonArray = [{a:1,b:1},{a:2,b:2},{a:3,b:3},{a:4,b:4},{a:5,b:5}]
+     * jsonArray._setObjectAttr('c', '10') 或 _setObjectAttribute('c', '10')
+     * jsonArray._setObjectAttr('c', '10', 1, 3) 或 _setObjectAttribute('c', '10', 1, 3)
+     * @param {*} attribute     属性
+     * @param {*} beginIndex    开始位置
+     * @param {*} endIndex      结束位置
+     */
+    Array.prototype._setObjectAttr = Array.prototype._setObjectAttribute = function (attribute, value, beginIndex, endIndex) {
+      beginIndex = $nt._isNull(beginIndex) ? 0 : beginIndex
+      endIndex = $nt._isNull(endIndex) ? this.length : endIndex
+      for (let i = 0; i < this.length; i++) {
+        if (i >= beginIndex && i < endIndex && typeof this[i] === 'object' && !(this[i] instanceof Date)) {
+          this[i][attribute] = value
+        }
+      }
+      return this
+    }
+    /**
+     * 数组对象扩展-批量设置对象本身属性到指定属性
+     * @param {*} sourceAttribute   源属性
+     * @param {*} targetAttribute   目标属性
+     * @param {*} beginIndex        开始位置
+     * @param {*} endIndex          结束位置
+     */
+    Array.prototype._setObjectAttrToAttr = Array.prototype._setObjectAttributeToAttribute = function (sourceAttribute, targetAttribute, beginIndex, endIndex) {
+      beginIndex = $nt._isNull(beginIndex) ? 0 : beginIndex
+      endIndex = $nt._isNull(endIndex) ? this.length : endIndex
+      for (let i = 0; i < this.length; i++) {
+        if (i >= beginIndex && i < endIndex && typeof this[i] === 'object' && !(this[i] instanceof Date)) {
+          this[i][targetAttribute] = this[i][sourceAttribute]
+        }
+      }
+      return this
+    }
+    /**
+     * JSON.__proto__._serializeArray 目前与VUE.JS不兼容,使用 JSON._serializeArray 代替
+     */
+    JSON._serializeArray = function (json) {
+      let _arr = []
+      let _toArray = function (json, jsonArray, prefix) {
+        for (let key in json) {
+          if (typeof json[key] === 'function') {
+            continue
+          }
+          let newKey = (prefix ? prefix + '.' : '') + key
+          if (typeof json[key] === 'object' && !(json[key] instanceof Array)) {
+            _toArray(json[key], jsonArray, newKey)
+          } else {
+            jsonArray[jsonArray.length] = {
+              name: newKey,
+              value: json[key]
+            }
+          }
+        }
+      }
+      _toArray(json, _arr)
+      return _arr
+    }
+    /**
+     * JSON.__proto__._propertyLength 目前与VUE.JS不兼容,使用 JSON._propertyLength 代替
+     */
+    JSON._propertyLength = function (json) {
+      let length = 0
+      let keys = []
+      for (let key in json) {
+        length++
+        keys.push(key)
+      }
+      return length
+    }
+    /**
+     * 清空JSON对象
+     * @param {*} json
+     */
+    JSON._clear = function (json) {
+      for (let key in json) {
+        delete json[key]
+      }
+    }
+    /**
+     * 移除JSON对象指定属性
+     * @param {*} json
+     * @param {*} key
+     */
+    JSON._removeKey = function (json, key) {
+      delete json[key]
+    }
+    /**
+     * 传入JSON数据对象,构建新JSON对象(attrs指定动态属性集)
+     * @param {*} json
+     * @param {*} attrs
+     */
+    JSON._new = function (json, ...attrs) {
+      let newJSON = {}
+      if (json && attrs && attrs.length) {
+        let tempJSON = $nt._copy(json)
+        for (let i = 0; i < attrs.length; i++) {
+          if (attrs[i]._contains('.')) {
+            let childAttrs = attrs[i].split('.')
+            let childJSON = newJSON[childAttrs[0]] = newJSON[childAttrs[0]] || {}
+            let tempChildJSON = tempJSON[childAttrs[0]] || {}
+            for (let ii = 1; ii < childAttrs.length; ii++) {
+              if (ii === childAttrs.length - 1) {
+                childJSON[childAttrs[ii]] =  $nt._isNotNull(tempChildJSON) ? tempChildJSON[childAttrs[ii]] : null
+              } else {
+                childJSON = childJSON[childAttrs[ii]] = childJSON[childAttrs[ii]] || {}
+                tempChildJSON = $nt._isNotNull(tempChildJSON) ? tempChildJSON[childAttrs[ii]] : null
+              }
+            }
+          } else {
+            newJSON[attrs[i]] = tempJSON[attrs[i]]
+          }
+        }
+      }
+      return newJSON
+    }
+    /**
+     * Storage 对象扩展
+     */
+    if (window && window.Storage) {
+      /**
+       * 扩展 Storage 增加setJSON方法
+       * @param {*} key
+       * @param {*} value
+       */
+      window.Storage.prototype.setJSON = function (key, value) {
+        this.setItem(key, $nt._isNotNull(value) ? JSON.stringify(value) : value)
+      }
+      /**
+       * 扩展 Storage 增加getJSON方法
+       * @param {Object} key
+       */
+      window.Storage.prototype.getJSON = function (key) {
+        let value = this.getItem(key)
+        return $nt._isNotNull(value) ? JSON.parse(value) : null
+      }
+    }
+  }
+}
+/**
+ * 执行系统对象功能扩展
+ */
+$nt._extend()
+
+if (typeof wx !== 'undefined' && !wx.miniProgram) {
+  // 小程序环境
+  wx.nothing = wx.$n = $nt
+} else {
+  window.nothing = window.$n = $nt
+  Object.assign(window, $nt)
+}
+
+export default $nt
diff --git a/util/request.js b/util/request.js
new file mode 100644
index 0000000..0dd5c4c
--- /dev/null
+++ b/util/request.js
@@ -0,0 +1,55 @@
+const Fly = require("flyio/dist/npm/wx") 
+import Env from './Env'
+import $n from './nothing'
+import store from '../store'
+const request = new Fly
+/**
+ * 请求拦截
+ */
+request.interceptors.request.use((config, promise) => {
+  // 超时设置
+   if (config._timeout) config.timeout = 60000;
+  // 从环境变量中取 BASE_URL
+  if (process.env.NODE_ENV === 'development') config.baseURL = Env.getDevBaseURL()
+  else config.baseURL = Env.getBaseURL()
+  // JSON格式化,未指定时,默认true
+  config.parseJson = $n._isNotNull(config.parseJson) ? config.parseJson : true
+  // 如指定_token == true,则在headers中跟上相关token信息
+  if (config._token) config.headers['token'] = store.getters.appUser.token;
+  console.warn('####### API Request: ', config)
+  return config
+})
+/**
+ * 响应拦截
+ */
+request.interceptors.response.use(
+  (response, promise) => {
+    let data = response.data || {status: false, errorMsg: '服务器未响应结果'}
+    console.warn('####### API Response: ', data)
+    if (data.code == 401 || data.code == 403) {
+    	uni.showModal({
+    		title: '',
+    		content: '登录超时,请重新登录!',
+    		showCancel: false,
+    		success: (res) => {
+    			uni.navigateTo({ url: '/pages/login/login' })
+    		}
+    	})
+    } else return promise.resolve(data)
+  },
+  (error, promise) => {
+    let msg = $n._caseValue(error.code, 0, '网络连接异常', 1, '网络连接超时', 401, '请求服务未授权', error.msg)
+    console.error('####### API Response error: ', error)
+    if (error.status == 401) {
+			uni.showModal({
+				title: '',
+				content: '登录超时,请重新登录!',
+				showCancel: false,
+				success: (res) => {
+					uni.navigateTo({ url: '/pages/login/login' })
+				}
+			})
+		} else return promise.reject(msg)
+   }
+)
+export default request
\ No newline at end of file
diff --git a/util/script.js b/util/script.js
new file mode 100644
index 0000000..4053c54
--- /dev/null
+++ b/util/script.js
@@ -0,0 +1,188 @@
+import CryptoJS from 'crypto-js';
+/**
+ * ========================================================================================================================
+ * 以RecognizeBankCard为例。
+ * 这里只是为了小程序端演示流程,所以将代码写在了小程序端
+ * 真正上线不建议将ACCESS_KEY_ID和ACCESS_KEY_SECRET写在小程序端,会有泄漏风险,建议将请求API接口代码写到您的服务端
+ * 请求银行卡识别:https://help.aliyun.com/document_detail/151893.html
+ * ========================================================================================================================
+ */
+// 参数说明:
+// miniProgramType:小程序类型,比如:微信小程序传参数:wx,支付宝传参数:my,钉钉传参数:dd,注意不要传字符串;
+// callback:结果的回调
+// type 1: 人物动漫化 2:人物素描化
+function callRecognizeBankCard(imageURL, miniProgramType, type, callback) {
+	const accessKeyId = "LTAI5tDPiEBZgfqNcWBqaFEc";
+	//AccessKeySecret
+	const accessKeySecret = "amI84BLFbHz6dhOVbuArrERmeemmnx";
+	//这里endpoint为API访问域名,与类目相关,具体类目的API访问域名请参考:https://help.aliyun.com/document_detail/143103.html
+	let endpoint = "facebody.cn-shanghai.aliyuncs.com";
+	//API Action,能力名称,请参考具体算法文档详情页中的Action参数,这里以银行卡识别为例:https://help.aliyun.com/document_detail/151893.html
+	let Action = "GenerateHumanAnimeStyle";
+	//API_HTTP_METHOD推荐使用POST
+	const API_HTTP_METHOD = "POST";
+	//API_VERSION为API版本,与类目相关,具体类目的API版本请参考:https://help.aliyun.com/document_detail/464194.html
+	let API_VERSION = "2019-12-30";
+	const request_ = {};
+	if (type == 2) {
+		Action = "GenerateHumanSketchStyle";
+		request_["ReturnType"] = "full";
+	} else if (type == 3) {
+		Action = "SegmentHDBody";
+		endpoint = "imageseg.cn-shanghai.aliyuncs.com";
+	} else if (type == 4) {
+	    Action = "EnhanceImageColor";
+		endpoint = "imageenhan.cn-shanghai.aliyuncs.com";
+		API_VERSION = "2019-09-30";
+		request_["ImageURL"] = imageURL;
+		request_["Mode"] = "ln17_256";
+		request_["OutputFormat"] = "png";
+	} else {
+		request_["AlgoType"] = "handdrawn";
+	}
+	//系统参数
+	request_["SignatureMethod"] = "HMAC-SHA1";
+	request_["SignatureNonce"] = signNRandom();
+	request_["AccessKeyId"] = accessKeyId;
+	request_["SignatureVersion"] = "1.0";
+	request_["Timestamp"] = getTimestamp();
+	request_["Format"] = "JSON";
+	request_["RegionId"] = "cn-shanghai";
+	request_["Version"] = API_VERSION;
+	request_["ImageURL"] = imageURL;
+	request_["Action"] = Action;
+	callApiRequest(miniProgramType, request_, API_HTTP_METHOD, endpoint, accessKeySecret, callback);
+};
+
+//请求数据
+function callApiRequest(miniProgramType, request_, API_HTTP_METHOD, endpoint, accessKeySecret, callback) {
+	const url = generateUrl(request_, API_HTTP_METHOD, endpoint, accessKeySecret);
+	miniProgramType.request({
+		url: url,
+		method: 'POST',
+		header: {
+			"ContentType": "application/json"
+		},
+		success: (result) => {
+			//获取结果
+			return typeof callback == "function" && callback(result.data)
+		},
+		fail: (error) => {
+			//获取报错信息
+			return typeof callback == "function" && callback(error.data)
+		}
+	})
+};
+
+/**
+ * ========================================================================================================================
+ * 以下代码仅仅为了调用服务端接口计算签名,其逻辑可参考文档:https://help.aliyun.com/document_detail/144904.html
+ * 这里只是为了Web前端演示,所以将代码写在了Web前端
+ * 真正上线不建议将ACCESS_KEY_ID和ACCESS_KEY_SECRET写在Web前端上,会有泄漏风险,建议将请求API接口代码写到您的服务端
+ * ========================================================================================================================
+ */
+//随机数字
+function signNRandom() {
+	const Rand = Math.random()
+	const mineId = Math.round(Rand * 100000000000000)
+	return mineId;
+};
+
+//Timestamp
+function getTimestamp() {
+	let date = new Date();
+	let YYYY = pad2(date.getUTCFullYear());
+	let MM = pad2(date.getUTCMonth() + 1);
+	let DD = pad2(date.getUTCDate());
+	let HH = pad2(date.getUTCHours());
+	let mm = pad2(date.getUTCMinutes());
+	let ss = pad2(date.getUTCSeconds());
+	return `${YYYY}-${MM}-${DD}T${HH}:${mm}:${ss}Z`;
+};
+
+function pad2(num) {
+	if (num < 10) {
+		return '0' + num;
+	}
+	return '' + num;
+};
+
+function ksort(params) {
+	let keys = Object.keys(params).sort();
+	let newParams = {};
+	keys.forEach((key) => {
+		newParams[key] = params[key];
+	});
+	return newParams;
+};
+
+function createHmac(stringToSign, key) {
+	const CrypStringToSign = CryptoJS.HmacSHA1(CryptoJS.enc.Utf8.parse(stringToSign), key);
+	const base64 = CryptoJS.enc.Base64.stringify(CrypStringToSign);
+	return base64;
+};
+
+function encode(str) {
+	var result = encodeURIComponent(str);
+	return result.replace(/!/g, '%21')
+		.replace(/'/g, '%27')
+		.replace(/\(/g, '%28')
+		.replace(/\)/g, '%29')
+		.replace(/\*/g, '%2A');
+};
+
+function sha1(stringToSign, key) {
+	return createHmac(stringToSign, key);
+};
+
+function getSignature(signedParams, method, secret) {
+	var stringToSign = `${method}&${encode('/')}&${encode(signedParams)}`;
+	const key = secret + "&";
+	return sha1(stringToSign, key);
+};
+
+//参数拼接
+function objToParam(param) {
+	if (Object.prototype.toString.call(param) !== '[object Object]') {
+		return '';
+	}
+	let queryParam = '';
+	for (let key in param) {
+		if (param.hasOwnProperty(key)) {
+			let value = param[key];
+			queryParam += toQueryPair(key, value);
+		}
+	}
+	return queryParam;
+};
+
+function toQueryPair(key, value) {
+	if (typeof value == 'undefined') {
+		return `&${key}=`;
+	}
+	return `&${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
+};
+
+function generateUrl(request, httpMethod, endpoint, accessKeySecret) {
+	//参数中key排序
+	const sortParams = ksort(request);
+	//拼成参数
+	const sortQueryStringTmp = objToParam(sortParams);
+	const sortedQueryString = sortQueryStringTmp.substring(1); // 去除第一个多余的&符号
+	//构造待签名的字符串
+	const Signture = getSignature(sortedQueryString, httpMethod, accessKeySecret)
+	//签名最后也要做特殊URL编码
+	request["Signature"] = encodeURIComponent(Signture);
+	//最终生成出合法请求的URL
+	const finalUrl = "https://" + endpoint + "/?Signature=" + encodeURIComponent(Signture) + sortQueryStringTmp;
+	return finalUrl;
+};
+
+//导出方法
+module.exports = {
+	callRecognizeBankCard: callRecognizeBankCard,
+	signNRandom: signNRandom,
+	getTimestamp: getTimestamp,
+	generateUrl: generateUrl,
+	createHmac: createHmac
+}
\ No newline at end of file
diff --git a/util/updata.js b/util/updata.js
new file mode 100644
index 0000000..6c6c5b5
--- /dev/null
+++ b/util/updata.js
@@ -0,0 +1,69 @@
+App({
+  onLaunch: function(options) {
+    this.autoUpdate()
+  },
+  autoUpdate: function() {
+    var self = this
+    // 获取小程序更新机制兼容
+    if (wx.canIUse('getUpdateManager')) {
+      const updateManager = wx.getUpdateManager()
+      //1. 检查小程序是否有新版本发布
+      updateManager.onCheckForUpdate(function(res) {
+        // 请求完新版本信息的回调
+        if (res.hasUpdate) {
+          //检测到新版本,需要更新,给出提示
+          wx.showModal({
+            title: '更新提示',
+            content: '检测到新版本,是否下载新版本并重启小程序?',
+            success: function(res) {
+              if (res.confirm) {
+                //2. 用户确定下载更新小程序,小程序下载及更新静默进行
+                self.downLoadAndUpdate(updateManager)
+              } else if (res.cancel) {
+                //用户点击取消按钮的处理,如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了
+                wx.showModal({
+                  title: '温馨提示~',
+                  content: '本次版本更新涉及到新的功能添加,旧版本无法正常访问的哦~',
+                  showCancel:false,//隐藏取消按钮
+                  confirmText:"确定更新",//只保留确定更新按钮
+                  success: function(res) {
+                    if (res.confirm) {
+                      //下载新版本,并重新应用
+                      self.downLoadAndUpdate(updateManager)
+                    }
+                  }
+                })
+              }
+            }
+          })
+        }
+      })
+    } else {
+      // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
+      wx.showModal({
+        title: '提示',
+        content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
+      })
+    }
+  },
+  /**
+   * 下载小程序新版本并重启应用
+   */
+  downLoadAndUpdate: function (updateManager){
+    var self=this
+    wx.showLoading();
+    //静默下载更新小程序新版本
+    updateManager.onUpdateReady(function () {
+      wx.hideLoading()
+      //新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+      updateManager.applyUpdate()
+    })
+    updateManager.onUpdateFailed(function () {
+      // 新的版本下载失败
+      wx.showModal({
+        title: '已经有新版本了哟~',
+        content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~',
+      })
+    })
+  }
+})
\ No newline at end of file
diff --git a/util/wx-touch-event.js b/util/wx-touch-event.js
new file mode 100644
index 0000000..30abab2
--- /dev/null
+++ b/util/wx-touch-event.js
@@ -0,0 +1,326 @@
+/**
+ * Created by zhengqiguang on 2017/4/30.
+ */
+
+
+class WxTouchEvent {
+    constructor() {
+        this.preV = {x: null, y: null};
+        this.pinchStartLen = null;
+        this.scale = 1;
+        this.isDoubleTap = false;
+    }
+
+    bind(option) {
+        this.element = null;
+        this.rotate = wrapFunc(this.element, option.rotate || noop);
+        this.touchStart = wrapFunc(this.element, option.touchStart || noop);
+        this.multipointStart = wrapFunc(this.element, option.multipointStart || noop);
+        this.multipointEnd = wrapFunc(this.element, option.multipointEnd || noop);
+        this.pinch = wrapFunc(this.element, option.pinch || noop);
+        this.swipe = wrapFunc(this.element, option.swipe || noop);
+        this.tap = wrapFunc(this.element, option.tap || noop);
+        this.doubleTap = wrapFunc(this.element, option.doubleTap || noop);
+        this.longTap = wrapFunc(this.element, option.longTap || noop);
+        this.singleTap = wrapFunc(this.element, option.singleTap || noop);
+        this.pressMove = wrapFunc(this.element, option.pressMove || noop);
+        this.touchMove = wrapFunc(this.element, option.touchMove || noop);
+        this.touchEnd = wrapFunc(this.element, option.touchEnd || noop);
+        this.touchCancel = wrapFunc(this.element, option.touchCancel || noop);
+        this.delta = null;
+        this.last = null;
+        this.now = null;
+        this.tapTimeout = null;
+        this.singleTapTimeout = null;
+        this.longTapTimeout = null;
+        this.swipeTimeout = null;
+        this.x1 = this.x2 = this.y1 = this.y2 = null;
+        this.preTapPosition = {x: null, y: null};
+    }
+
+    start(evt) {
+        if (!evt.touches) return;
+        this.now = Date.now();
+        this.x1 = evt.touches[0].pageX == null ? evt.touches[0].x : evt.touches[0].pageX;
+        this.y1 = evt.touches[0].pageY == null ? evt.touches[0].y : evt.touches[0].pageY;
+        this.delta = this.now - (this.last || this.now);
+        this.touchStart.dispatch(evt);
+        if (this.preTapPosition.x !== null) {
+            this.isDoubleTap = (this.delta > 0 && this.delta <= 250 && Math.abs(this.preTapPosition.x - this.x1) < 30 && Math.abs(this.preTapPosition.y - this.y1) < 30);
+        }
+        this.preTapPosition.x = this.x1;
+        this.preTapPosition.y = this.y1;
+        this.last = this.now;
+        let preV = this.preV,
+            len = evt.touches.length;
+        if (len > 1) {
+            this._cancelLongTap();
+            this._cancelSingleTap();
+            let otx = evt.touches[1].pageX == null ? evt.touches[1].x : evt.touches[1].pageX;
+            let oty = evt.touches[1].pageY == null ? evt.touches[1].y : evt.touches[1].pageY;
+            let v = { x: otx - this.x1, y: oty - this.y1};
+            preV.x = v.x;
+            preV.y = v.y;
+            this.pinchStartLen = getLen(preV);
+            this.multipointStart.dispatch(evt);
+        }
+        this.longTapTimeout = setTimeout(function () {
+            evt.type = "longTap";
+            this.longTap.dispatch(evt);
+        }.bind(this), 750);
+    }
+
+    move(evt) {
+        if (!evt.touches) return;
+        let preV = this.preV,
+            len = evt.touches.length,
+            currentX = evt.touches[0].pageX == null ? evt.touches[0].x : evt.touches[0].pageX,
+            currentY = evt.touches[0].pageY == null ? evt.touches[0].y : evt.touches[0].pageY;
+        this.isDoubleTap = false;
+        if (len > 1) {
+            let otx = evt.touches[1].pageX == null ? evt.touches[1].x : evt.touches[1].pageX;
+            let oty = evt.touches[1].pageY == null ? evt.touches[1].y : evt.touches[1].pageY;
+            let v = { x: otx - currentX, y: oty - currentY};
+
+            if (preV.x !== null) {
+                if (this.pinchStartLen > 0) {
+                    evt.scale = getLen(v) / this.pinchStartLen;
+                    evt.type = "pinch";
+                    this.pinch.dispatch(evt);
+                }
+
+                evt.angle = getRotateAngle(v, preV);
+                evt.type = "rotate";
+                this.rotate.dispatch(evt);
+            }
+            preV.x = v.x;
+            preV.y = v.y;
+        } else {
+            if (this.x2 !== null) {
+                evt.deltaX = currentX - this.x2;
+                evt.deltaY = currentY - this.y2;
+
+            } else {
+                evt.deltaX = 0;
+                evt.deltaY = 0;
+            }
+            this.pressMove.dispatch(evt);
+        }
+
+        this.touchMove.dispatch(evt);
+
+        this._cancelLongTap();
+        this.x2 = currentX;
+        this.y2 = currentY;
+        if (len > 1) {
+            // evt.preventDefault();
+        }
+    }
+
+    end(evt) {
+        if (!evt.changedTouches) return;
+        this._cancelLongTap();
+        let self = this;
+        if (evt.touches.length < 2) {
+            this.multipointEnd.dispatch(evt);
+        }
+        this.touchEnd.dispatch(evt);
+        //swipe
+        if ((this.x2 && Math.abs(this.x1 - this.x2) > 30) ||
+            (this.y2 && Math.abs(this.y1 - this.y2) > 30)) {
+            evt.direction = this._swipeDirection(this.x1, this.x2, this.y1, this.y2);
+            this.swipeTimeout = setTimeout(function () {
+                evt.type = "swipe";
+                self.swipe.dispatch(evt);
+
+            }, 0)
+        } else {
+            this.tapTimeout = setTimeout(function () {
+                //console.info("tap");
+                evt.type = "tap";
+                self.tap.dispatch(evt);
+                // trigger double tap immediately
+                if (self.isDoubleTap) {
+                    evt.type = "doubleTap";
+                    self.doubleTap.dispatch(evt);
+                    clearTimeout(self.singleTapTimeout);
+                    self.isDoubleTap = false;
+                }
+            }, 0)
+
+            if (!self.isDoubleTap) {
+                self.singleTapTimeout = setTimeout(function () {
+                    self.singleTap.dispatch(evt);
+                }, 250);
+            }
+        }
+
+        this.preV.x = 0;
+        this.preV.y = 0;
+        this.scale = 1;
+        this.pinchStartLen = null;
+        this.x1 = this.x2 = this.y1 = this.y2 = null;
+    }
+
+    cancel(evt) {
+        clearTimeout(this.singleTapTimeout);
+        clearTimeout(this.tapTimeout);
+        clearTimeout(this.longTapTimeout);
+        clearTimeout(this.swipeTimeout);
+        this.touchCancel.dispatch(evt);
+
+      /*  this.element.removeEventListener("touchstart", this.start);
+        this.element.removeEventListener("touchmove", this.move);
+        this.element.removeEventListener("touchend", this.end);
+        this.element.removeEventListener("touchcancel", this.cancel);
+
+        this.rotate.del();
+        this.touchStart.del();
+        this.multipointStart.del();
+        this.multipointEnd.del();
+        this.pinch.del();
+        this.swipe.del();
+        this.tap.del();
+        this.doubleTap.del();
+        this.longTap.del();
+        this.singleTap.del();
+        this.pressMove.del();
+        this.touchMove.del();
+        this.touchEnd.del();
+        this.touchCancel.del(); */
+
+       /* this.preV = this.pinchStartLen = this.scale = this.isDoubleTap = this.delta = this.last = this.now = this.tapTimeout = this.singleTapTimeout = this.longTapTimeout = this.swipeTimeout = this.x1 = this.x2 = this.y1 = this.y2 = this.preTapPosition = this.rotate = this.touchStart = this.multipointStart = this.multipointEnd = this.pinch = this.swipe = this.tap = this.doubleTap = this.longTap = this.singleTap = this.pressMove = this.touchMove = this.touchEnd = this.touchCancel = null;
+
+        return null; */
+
+        //this.touchEnd.dispatch(evt);
+		//this.touchCancel.dispatch(evt);
+		
+    }
+
+
+    _cancelLongTap() {
+        clearTimeout(this.longTapTimeout);
+    }
+
+    _cancelSingleTap() {
+        clearTimeout(this.singleTapTimeout);
+    }
+
+    _swipeDirection(x1, x2, y1, y2) {
+        return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down')
+    }
+
+    on(evt, handler) {
+        if (this[evt]) {
+            this[evt].add(handler);
+        }
+    }
+
+    off(evt, handler) {
+        if (this[evt]) {
+            this[evt].del(handler);
+        }
+    }
+
+    destroy() {
+        if (this.singleTapTimeout) clearTimeout(this.singleTapTimeout);
+        if (this.tapTimeout) clearTimeout(this.tapTimeout);
+        if (this.longTapTimeout) clearTimeout(this.longTapTimeout);
+        if (this.swipeTimeout) clearTimeout(this.swipeTimeout);
+
+        this.element.removeEventListener("touchstart", this.start);
+        this.element.removeEventListener("touchmove", this.move);
+        this.element.removeEventListener("touchend", this.end);
+        this.element.removeEventListener("touchcancel", this.cancel);
+
+        this.rotate.del();
+        this.touchStart.del();
+        this.multipointStart.del();
+        this.multipointEnd.del();
+        this.pinch.del();
+        this.swipe.del();
+        this.tap.del();
+        this.doubleTap.del();
+        this.longTap.del();
+        this.singleTap.del();
+        this.pressMove.del();
+        this.touchMove.del();
+        this.touchEnd.del();
+        this.touchCancel.del();
+
+        this.preV = this.pinchStartLen = this.scale = this.isDoubleTap = this.delta = this.last = this.now = this.tapTimeout = this.singleTapTimeout = this.longTapTimeout = this.swipeTimeout = this.x1 = this.x2 = this.y1 = this.y2 = this.preTapPosition = this.rotate = this.touchStart = this.multipointStart = this.multipointEnd = this.pinch = this.swipe = this.tap = this.doubleTap = this.longTap = this.singleTap = this.pressMove = this.touchMove = this.touchEnd = this.touchCancel = null;
+
+        return null;
+    }
+
+}
+
+let noop = function () {
+};
+
+function getLen(v) {
+    return Math.sqrt(v.x * v.x + v.y * v.y);
+}
+
+function dot(v1, v2) {
+    return v1.x * v2.x + v1.y * v2.y;
+}
+
+function getAngle(v1, v2) {
+    let mr = getLen(v1) * getLen(v2);
+    if (mr === 0) return 0;
+    let r = dot(v1, v2) / mr;
+    if (r > 1) r = 1;
+    return Math.acos(r);
+}
+
+function cross(v1, v2) {
+    return v1.x * v2.y - v2.x * v1.y;
+}
+
+function getRotateAngle(v1, v2) {
+    let angle = getAngle(v1, v2);
+    if (cross(v1, v2) > 0) {
+        angle *= -1;
+    }
+
+    return angle * 180 / Math.PI;
+}
+
+let HandlerAdmin = function (el) {
+    this.handlers = [];
+    this.el = el;
+};
+
+HandlerAdmin.prototype.add = function (handler) {
+    this.handlers.push(handler);
+}
+
+HandlerAdmin.prototype.del = function (handler) {
+    if (!handler) this.handlers = [];
+
+    for (let i = this.handlers.length; i >= 0; i--) {
+        if (this.handlers[i] === handler) {
+            this.handlers.splice(i, 1);
+        }
+    }
+}
+
+HandlerAdmin.prototype.dispatch = function () {
+    for (let i = 0, len = this.handlers.length; i < len; i++) {
+        let handler = this.handlers[i];
+        if (typeof handler === 'function') handler.apply(this.el, arguments);
+    }
+}
+
+function wrapFunc(el, handler) {
+    let handlerAdmin = new HandlerAdmin(el);
+    handlerAdmin.add(handler);
+
+    return handlerAdmin;
+}
+
+
+export default WxTouchEvent;
+