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, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +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(/∀/g, '∀'); + str = str.replace(/∂/g, '∂'); + str = str.replace(/∃/g, '∃'); + str = str.replace(/∅/g, '∅'); + str = str.replace(/∇/g, '∇'); + str = str.replace(/∈/g, '∈'); + str = str.replace(/∉/g, '∉'); + str = str.replace(/∋/g, '∋'); + str = str.replace(/∏/g, '∏'); + str = str.replace(/∑/g, '∑'); + str = str.replace(/−/g, '−'); + str = str.replace(/∗/g, '∗'); + str = str.replace(/√/g, '√'); + str = str.replace(/∝/g, '∝'); + str = str.replace(/∞/g, '∞'); + str = str.replace(/∠/g, '∠'); + str = str.replace(/∧/g, '∧'); + str = str.replace(/∨/g, '∨'); + str = str.replace(/∩/g, '∩'); + str = str.replace(/∪/g, '∪'); + str = str.replace(/∫/g, '∫'); + str = str.replace(/∴/g, '∴'); + str = str.replace(/∼/g, '∼'); + str = str.replace(/≅/g, '≅'); + str = str.replace(/≈/g, '≈'); + str = str.replace(/≠/g, '≠'); + str = str.replace(/≤/g, '≤'); + str = str.replace(/≥/g, '≥'); + str = str.replace(/⊂/g, '⊂'); + str = str.replace(/⊃/g, '⊃'); + str = str.replace(/⊄/g, '⊄'); + str = str.replace(/⊆/g, '⊆'); + str = str.replace(/⊇/g, '⊇'); + str = str.replace(/⊕/g, '⊕'); + str = str.replace(/⊗/g, '⊗'); + str = str.replace(/⊥/g, '⊥'); + str = str.replace(/⋅/g, '⋅'); + return str; +} + +// HTML 支持的希腊字母 +function strGreeceDiscode(str) { + str = str.replace(/Α/g, 'Α'); + str = str.replace(/Β/g, 'Β'); + str = str.replace(/Γ/g, 'Γ'); + str = str.replace(/Δ/g, 'Δ'); + str = str.replace(/Ε/g, 'Ε'); + str = str.replace(/Ζ/g, 'Ζ'); + str = str.replace(/Η/g, 'Η'); + str = str.replace(/Θ/g, 'Θ'); + str = str.replace(/Ι/g, 'Ι'); + str = str.replace(/Κ/g, 'Κ'); + str = str.replace(/Λ/g, 'Λ'); + str = str.replace(/Μ/g, 'Μ'); + str = str.replace(/Ν/g, 'Ν'); + str = str.replace(/Ξ/g, 'Ν'); + str = str.replace(/Ο/g, 'Ο'); + str = str.replace(/Π/g, 'Π'); + str = str.replace(/Ρ/g, 'Ρ'); + str = str.replace(/Σ/g, 'Σ'); + str = str.replace(/Τ/g, 'Τ'); + str = str.replace(/Υ/g, 'Υ'); + str = str.replace(/Φ/g, 'Φ'); + str = str.replace(/Χ/g, 'Χ'); + str = str.replace(/Ψ/g, 'Ψ'); + str = str.replace(/Ω/g, 'Ω'); + + str = str.replace(/α/g, 'α'); + str = str.replace(/β/g, 'β'); + str = str.replace(/γ/g, 'γ'); + str = str.replace(/δ/g, 'δ'); + str = str.replace(/ε/g, 'ε'); + str = str.replace(/ζ/g, 'ζ'); + str = str.replace(/η/g, 'η'); + str = str.replace(/θ/g, 'θ'); + str = str.replace(/ι/g, 'ι'); + str = str.replace(/κ/g, 'κ'); + str = str.replace(/λ/g, 'λ'); + str = str.replace(/μ/g, 'μ'); + str = str.replace(/ν/g, 'ν'); + str = str.replace(/ξ/g, 'ξ'); + str = str.replace(/ο/g, 'ο'); + str = str.replace(/π/g, 'π'); + str = str.replace(/ρ/g, 'ρ'); + str = str.replace(/ς/g, 'ς'); + str = str.replace(/σ/g, 'σ'); + str = str.replace(/τ/g, 'τ'); + str = str.replace(/υ/g, 'υ'); + str = str.replace(/φ/g, 'φ'); + str = str.replace(/χ/g, 'χ'); + str = str.replace(/ψ/g, 'ψ'); + str = str.replace(/ω/g, 'ω'); + str = str.replace(/ϑ/g, 'ϑ'); + str = str.replace(/ϒ/g, 'ϒ'); + str = str.replace(/ϖ/g, 'ϖ'); + str = str.replace(/·/g, '·'); + return str; +} + +function strcharacterDiscode(str) { + // 加入常用解析 + str = str.replace(/ /g, ' '); + str = str.replace(/ /g, ' '); + str = str.replace(/ /g, ' '); + str = str.replace(/"/g, "'"); + str = str.replace(/&/g, '&'); + str = str.replace(/</g, '<'); + str = str.replace(/>/g, '>'); + str = str.replace(/•/g, '•'); + + return str; +} + +// HTML 支持的其他实体 +function strOtherDiscode(str) { + str = str.replace(/Œ/g, 'Œ'); + str = str.replace(/œ/g, 'œ'); + str = str.replace(/Š/g, 'Š'); + str = str.replace(/š/g, 'š'); + str = str.replace(/Ÿ/g, 'Ÿ'); + str = str.replace(/ƒ/g, 'ƒ'); + str = str.replace(/ˆ/g, 'ˆ'); + str = str.replace(/˜/g, '˜'); + str = str.replace(/ /g, ''); + str = str.replace(/ /g, ''); + str = str.replace(/ /g, ''); + str = str.replace(/‌/g, ''); + str = str.replace(/‍/g, ''); + str = str.replace(/‎/g, ''); + str = str.replace(/‏/g, ''); + str = str.replace(/–/g, '–'); + str = str.replace(/—/g, '—'); + str = str.replace(/‘/g, '‘'); + str = str.replace(/’/g, '’'); + str = str.replace(/‚/g, '‚'); + str = str.replace(/“/g, '“'); + str = str.replace(/”/g, '”'); + str = str.replace(/„/g, '„'); + str = str.replace(/†/g, '†'); + str = str.replace(/‡/g, '‡'); + str = str.replace(/•/g, '•'); + str = str.replace(/…/g, '…'); + str = str.replace(/‰/g, '‰'); + str = str.replace(/′/g, '′'); + str = str.replace(/″/g, '″'); + str = str.replace(/‹/g, '‹'); + str = str.replace(/›/g, '›'); + str = str.replace(/‾/g, '‾'); + str = str.replace(/€/g, '€'); + str = str.replace(/™/g, '™'); + + str = str.replace(/←/g, '←'); + str = str.replace(/↑/g, '↑'); + str = str.replace(/→/g, '→'); + str = str.replace(/↓/g, '↓'); + str = str.replace(/↔/g, '↔'); + str = str.replace(/↵/g, '↵'); + str = str.replace(/⌈/g, '⌈'); + str = str.replace(/⌉/g, '⌉'); + + str = str.replace(/⌊/g, '⌊'); + str = str.replace(/⌋/g, '⌋'); + str = str.replace(/◊/g, '◊'); + str = str.replace(/♠/g, '♠'); + str = str.replace(/♣/g, '♣'); + str = str.replace(/♥/g, '♥'); + + str = str.replace(/♦/g, '♦'); + str = str.replace(/'/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,AAEAAAANAIAAAwBQRkZUTWQXEOUAAAs4AAAAHEdERUYAKQANAAALGAAAAB5PUy8yf6c9DgAAAVgAAABgY21hcAIIjDUAAAHQAAABWmdhc3D//wADAAALEAAAAAhnbHlmx7qRyAAAAzwAAAPgaGVhZO6RKKsAAADcAAAANmhoZWEB+QDhAAABFAAAACRobXR4AzQAEwAAAbgAAAAWbG9jYQHkAtIAAAMsAAAAEG1heHAAEABxAAABOAAAACBuYW1lDuy7EgAABxwAAAOhcG9zdPeJpK0AAArAAAAAUAABAAAAAQAAXQVinV8PPPUACwEAAAAAALKSIf4AAAAA2+DH3gAI//cA9wDbAAAACAACAAAAAAAAAAEAAADc/9wAJAEAAAAAAAD3AAEAAAAAAAAAAAAAAAAAAAAEAAEAAAAHAG8ACAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABAEAAZAABAAAAIAAgAAAABAAgACAAAAAgAALAEAAAAIBBgEDAQEBAQGAAAK/EAAAAAAAABIAAAAAICAgIABAUWyCcgDc/9wAJADcACQABAABAAAAAABuAJwAAAAgAAEBAAAAAAAAAAEAAAABAAALABoACAAaAAAAAAADAAAAAwAAABwAAQAAAAAAVAADAAEAAAAcAAQAOAAAAAoACAACAAJRbFbtX2mCcv//AABRbFbtX2mCcv//rpepF6CcfZQAAQAAAAAAAAAAAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAOIBkAHwAAMAC///APQA1wAbACcAMQAANzYWBwYHBhY+ATcuATYXFhcWBiYnBgcGByY3NjcWBwYHBicmNzY3NhcuATYeAgYmJ2oMDRMaBhMVHiwoCw4GCg4KBgsDAygbIBQlERYhCA4aJRYLAw0YKhA/DBYOEC4hCiIHbxIEGCoLHgUFBwcYEAgLEh0SBQ0KBwQFAgEiJ3gKFCAdDQgNDhMpDCEOIAEZMhUJGQcAAAUAGv/4AOUA2AAVACEANwBNAFgAADcyBxQHNhcWBwYnBgcmJyY3NjcyFzYXBgcGBxYHFjc2NTQHBiMGJxYHDgEmNzY3LgI2FxY+ARYHBhcWNzYnJjcWFxYHBicmJyY3NjIGNxYGLgEOAScmNzahRAIJBwEBHElDAwoPAQQFAQoIA0IpJScSCQUBVjwJMAwQDgYCAwYcCQoZAhUYAggJJC8PAS8EAQQeEAkKCAkFAgwLEhQCAgQGCQMEFgIOGx0KBAERGtg6RE4BBgYDBgwJAwcXYUAUAgoUCQMKBAUvew0KVTsyXQMBAQUKFjIGDisYAQUHAwIGAwkOGQwXEwYGFAwDARgPBwYCAxQPFBIKUAUQCgQICAUHBwkAAAAACAAI//oA9wDbAAoAFQAgACsANgBeAGYAbgAANz4CFgcGBwYmNhc+AhYHBgcGJjY3PgIWBwYHBiY2JzIWBi4BDgEmPgEXFgcGBwYjJjc+AQc0Nw4CJjY3NBcyBzIeAQYuAQcGFx4BBiYnFBUWByYnJjcGBwYmNicWFxQnJicmFxYXFCcmJyawIRIHBwcaIBQKDRAkFQgHBx8hFgkOEA8QBwcHGQ0UCw89FxMEEhwuFAMRJTYKAwEIBgsJAwELLQEUEwwEHhoHBQIUGhUHCBgcAwMbDgMOGgUHBgIBARwUBgkqCQQJCggEAywFCAkIBARhIRkKCAglGxQJCjsgGQkICSMaEQkIohASCggIIAoTCQk4CAoGAwkKDAcKJQYODA4OBg8MGmAEEAIFBgwKAhUCEwQKDAgIARIGEAcIBg4YExsEAx4SHBIqEA5AWAYSCgcNBw0BBhIKBw0HDQAAAgAa//cA5gDYADIAOgAANzYXFgYHHgEGBzYOASInBh4BPgEmNhYOAScuATYyBgcWMyY3DgEmPgE3PgEmBw4BJj4BFzI3PgEmBwZuKRYVChQjEAkKFQI6QzECEExQBQwMDhBHMTgMDA8MATAfAwMsKgQqHS0SFTAaEiQKESkaGhoOBhkuA8wFBAUcCAIWIQ0EDAcHGCsRCRMPCiEWCQcKWSMWDQYlFwIKDAgCAwcYAwQTCgkXE30DEh8MAx8AAAAAAAAWAQ4AAQAAAAAAAAA5AHQAAQAAAAAAAQANAMwAAQAAAAAAAgAHAOoAAQAAAAAAAwANARAAAQAAAAAABAANATwAAQAAAAAABQAMAWQAAQAAAAAABgARAZUAAQAAAAAABwAdAeUAAQAAAAAACAAWAjUAAQAAAAAACQAHAl4AAQAAAAAACwAOAoQAAwABBAkAAAByAAAAAwABBAkAAQAcAK4AAwABBAkAAgAOANoAAwABBAkAAwAcAPIAAwABBAkABAAcAR4AAwABBAkABQAYAUoAAwABBAkABgAiAXEAAwABBAkABwA8AacAAwABBAkACAAwAgMAAwABBAkACQAQAkwAAwABBAkACwAcAmYAQwBvAHAAeQByAGkAZwBoAHQAKABjACkAIABTAGgAYQBuAGcAaABhAGkAIABZAGkAcQBpACAASQBuAGYAbwByAG0AYQB0AGkAbwBuACAAVABlAGMAaABuAG8AbABvAGcAeQAgAEMAbwAuACwATAB0AGQAAENvcHlyaWdodChjKSBTaGFuZ2hhaSBZaXFpIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgQ28uLEx0ZAAAWwBXAE8AUwCJAMYAdQBMAGwA1QBoAM0ATwBTAABbV09TrnVMbM1o6k9TAABSAGUAZwB1AGwAYQByAABSZWd1bGFyAABbAFcATwBTAIkAxgB1AEwAbADVAGgAzQBPAFMAAFtXT1OudUxszWjqT1MAAFsAVwBPAFMAiQDGAHUATABsANUAaADNAE8AUwAAW1dPU651TGzNaOpPUwAAVgBlAHIAcwBpAG8AbgAgADEALgAwADAAAFZlcnNpb24gMS4wMAAAWgBUAFMASgAtAEIAYQBnAHUAZQB0AHQAZQBGAG8AbgB0AABaVFNKLUJhZ3VldHRlRm9udAAAVAByAGEAZABlAG0AYQByAGsAIABvAGYAIABpAGUAawBpAGUA/wAIAE4ASQBUAC8AWwBXAF4AkwD/AAkAAFRyYWRlbWFyayBvZiBpZWtpZdgITklUL1tXXtgJAABOAAoAbQB3AE4ASQBUAC8ATwDhAGAAbwB5ANEAYgCAAGcACQCWAFAAUQBsAFMA+AAATgptd05JVC9Ph2BveYRiZwlQUWxTvwAATgBJAFQALwBbAFcAXgCTAABOSVQvW1deAAB3AHcAdwAuADEANwBmAG8AbgB0AC4AYwBvAG0AAHd3dy4xN2ZvbnQuY29tAAAAAAACAAAAAAAA/8QADAAAAAEAAAAAAAAAAAAAAAAAAAAAAAcAAAABAAIBAgEDAQQBBQd1bmk1MTZDB3VuaTU2RUQHdW5pNUY2OQd1bmk4MjcyAAAAAf//AAIAAQAAAAwAAAAWAAAAAgABAAMABgABAAQAAAACAAAAAAAAAAEAAAAA1aQnCAAAAACykiH+AAAAANvgx94=') 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,d09GMgABAAAAAAbUAAsAAAAADQQAAAaFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCEcAqKIIgNATYCJAM4Cx4ABCAFhG0HgVcbCgsjEWaEU0b2lwf0EMsl5gVjdl2kvBUqZ8RggaiESuHMT/vq+w5zMLK2p520x3yfD+b1vbRpB/wAuCfwBAFZe8oDz7H8F2V3nn7N1eRb20bRRmuwUT3v/v/z/O577zsq046ArVAN7GTOrJKBSqcZwDuoGFCraQDw/PLevyDzUBv4nGc7nMsHHJGiqLmifDsgh/6aD1zpuvTy5CenxaSaGoMxmHT7P8dSLxMsv/1rsHunEB2LKIuk41ECDagicQe6keAO8zxMSCqH9W/z+UAASvaKAoP73FJUoISLYK9p7GhCRS2MGoSE3Ccq9g39J5OhlDw4Bl8AMCn9e/IDwakAOEII4kKF09Ja0feN6q2XrBQHd8aQwSCMlwSwOwjgAb6AAjlVpg+C5E2+QpSXwdRUAKwlW3d6p5ieObIgFsKiWDLLYqVs4duFb+cUpY5aD4fRiDRhLXWn/80DQkZDiRKI5NR4HAUVkCjQrWbq+mYNMFWIQICZIMiAOZjNHkdEUAILQqDAQhAEYFEIIrBkBDmwLAQ1sFIEHthCBA5e9kRQwNs5Q6ACANp4qC2wgsw8vxbhrb2sxeMICIJnNycJJJBQM0tfMtDSrKZ9NF56h0bFEmKyfPuZwQfGHRpysDx73XLjTr9z9+w3bzpO3qy/rLDCw9VcvUi2X3hrz722Zl9Z8m8mO5Om6W6/mjJMsbmOBIyrKVyFKdgax2B6IrBoPou50VOdskUHUZUMFhKLFDO2uQTC6mnqhim7hIxssmPR7hrE6gyKq0c1jm2cwYBnWpHP2woFey5nzWZHVyFKruFrnAwUVZ6WFKOXmiyJ3GpRabAlecDbiEkjV2r1FEVqPs0VCu9uok1mgoHJkk/0U1ShUL+Qt9FWp6BIvM0lmuxuOSMYLIxs3Zs7z2UtVZNRUjYt94vV0bo6LPEI81FiqStoypn0boR8auP5toEyIUNp5d2I+NTRWpVD3A3SJBQhM73Mu/5guW8hP04rIU1KNc12y8aZTq9n1ypu1uoVWpAsx68M2XS0zw3v22HVNkcwbV2Ni5oHqQ/SLqRecP46Bp8c43fZ5X95ypT/m9il3phjO8ecEgYMtDSHjMHbGHJ5ewj0qq7jnchRsi2j98tlFvBrDqzJ76JSw+S5Q50mOx+snHkd7Ne649yOIaEdoYeu+cB3fuoFXAgObg+ZhpfhYPAyEHz0+gArrlHe8+d9zwvvFcVQ74TaewZERyIEifnByKAfSFL/fI35pWo1PSMNsTGyl/3Uy4Tt9P9LCTqO2YgW3u7o61fecc6GcdbxcZPlHluT51LD4aFMiqpdc1uLilsal5qmtrc81d9Udtt9h+vYOKA+6o0ZkwgXevaHy9mvpK2kv7fLMbW+pq/TUv2LgWL1T0tuwMeQdcR3atu6umVOanrVPod9/vlrnTrwOewOn9CAaQa+WSR136fmi88Q96ErFHNfPrX4BIPfh9zc7Abz/jY+Fjc19dw09D+P6N2EFxYfzaebPlhM36z5QnwAgyzQXNfl+rjYvgYQuwk+J6JEoqb2oEXnF7ouDOwtr7fwdzvHxMsdjahbJbakYjBYexv+OcR+DmiWN/jSI/7okyEjbzV9VDAKazgDAEiH+pO+U7o2I6GkOgD4Nv4HZyniX4C0rH9H6joA8Gd4JKw01TMA0g2yjhRALPWPYkn8Lx8mtOUwfkiSf3TrwbvfXxyvi/0tV/0PZ907pUmnfaTBA/wKAOQ4cLb8xCyOk+jVJiLa8NkecvjPYVXD4rogAK0UKIVPWBBKWQb8tPLG7ufymjm78Zv2mpXAkbEDnpwrkVJ9QaASCiK5BFDyMT5YxcQiECSsAOBtE4DQ2wOO1iHg6V0SKfUOBOb+QKQPAaVyZHJMlXHXwa0bp4DVXGRrgZJqHcR4K+v9qowvwVVtqehTuRZrRRLGzdYHVSs3xg7twqTMWmhHlbiHi6myJNE4ypXk0DI3syjSqjcKJVWdLTdOAau5kK0FlFTreGbeav3+qzK+BGcY9qL9qVyLSxcSodiB+OCunYZdy8B2YVJMDVrQu55UCfeUVKVsIqFRr5UrySHbo6GZiWg67eoO5/dWj/oiIhbxPS9JVlRNN0zLdlzPj8FB9uO5RwuUHkvrcWMx91GSaqPY8AsnOULN5JPDrCmQ1KxpzYONVbVpsM6AihMOVwgl7C6R7dzBMtBYlqPM5xQ59tLkbIW12VgPtQnadghoN3m79I7HD3U6AAA=') 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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; +