commit bd749bb6c9b8444a35fc7f963609784e74667c49
Author: liuning <807852472@qq.com>
Date: Tue May 12 01:32:55 2026 +0800
过滤器小程序
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..14ea590
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+# Windows
+[Dd]esktop.ini
+Thumbs.db
+$RECYCLE.BIN/
+
+# macOS
+.DS_Store
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+
+# Node.js
+node_modules/
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..8c2b732
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,17 @@
+
+
+
diff --git a/common/js/localdata.js b/common/js/localdata.js
new file mode 100644
index 0000000..f39c1ba
--- /dev/null
+++ b/common/js/localdata.js
@@ -0,0 +1,28 @@
+export default {
+ users: {
+ yanan: {
+ pass: 'yanan123',
+ id: 1,
+ user: 'yanan',
+ name: 'yanan',
+ dept: '系统控制',
+ title: '管理员',
+ mobile: '13288888888'
+ }
+ },
+ devices: [
+ [],
+ [
+ {
+ id: 1,
+ name:'北桥沟',
+ addr:'陕西省延安市宝塔区北桥沟'
+ },
+ {
+ id: 2,
+ name:'黄蒿洼',
+ addr:'陕西省延安市宝塔区黄蒿洼路'
+ }
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/common/js/myapp.js b/common/js/myapp.js
new file mode 100644
index 0000000..449dcdc
--- /dev/null
+++ b/common/js/myapp.js
@@ -0,0 +1,97 @@
+const API_HOST = 'https://filter.api.opmonitor.com'
+export default {
+ apiHost: API_HOST,
+ dateTimeStr: function() {
+ let d = new Date()
+ let a = []
+ a.push('' + d.getFullYear())
+ a.push(('' + (d.getMonth() + 1)).padStart(2, '0'))
+ a.push(('' + d.getDate()).padStart(2, '0'))
+ a.push(('' + d.getHours()).padStart(2, '0'))
+ a.push(('' + d.getMinutes()).padStart(2, '0'))
+ a.push(('' + d.getSeconds()).padStart(2, '0'))
+ return `${a[0]}-${a[1]}-${a[2]} ${a[3]}:${a[4]}:${a[5]}`
+ },
+ tabBar: [
+ {
+ pagePath: '/packagePage/pages/ctrllist/ctrllist',
+ text: '医院',
+ iconPath: API_HOST + '/miniapp/static/tabnav1a.png',
+ selectedIconPath: API_HOST + '/miniapp/static/tabnav1.png'
+ },
+ {
+ pagePath: '/packagePage/pages/positionindex/positionindex',
+ text: '点位',
+ iconPath: API_HOST + '/miniapp/static/extend_gray.png',
+ selectedIconPath: API_HOST + '/miniapp/static/extend_active.png'
+ },
+ {
+ pagePath: '/packagePage/pages/record/record',
+ text: '记录',
+ iconPath: API_HOST + '/miniapp/static/code_gray.png',
+ selectedIconPath: API_HOST + '/miniapp/static/code_active.png'
+ },
+ {
+ pagePath: '/packagePage/pages/ctrldevice/ctrldevice',
+ text: '更换',
+ iconPath: API_HOST + '/miniapp/static/thor_gray.png',
+ selectedIconPath: API_HOST + '/miniapp/static/thor_active.png'
+ }
+ ],
+ // tabbar 切换
+ tabbarSwitch: function(e) {
+ uni.reLaunch({
+ url: e.pagePath
+ })
+ },
+ // check login
+ checkLogin: function() {
+ let info = uni.getStorageSync('user')
+ if (typeof(info) == 'object' && info.account != undefined) {
+ return info
+ } else {
+ uni.reLaunch({
+ url: '/packagePage/pages/auth/auth'
+ })
+ }
+ },
+ // toast
+ showHint: function(msg = 'hello', sec = 2000) {
+ uni.showToast({
+ title: msg,
+ duration: sec,
+ icon: 'none',
+ mask: true
+ })
+ },
+ // request
+ request: function(uri, callback, reqData = {}, reqMethod = 'GET') {
+ let params = {
+ url:API_HOST + uri,
+ method: reqMethod,
+ data: reqData,
+ success: callback,
+ fail:function() {
+ uni.showToast({
+ title: '加载失败',
+ duration: 2000,
+ icon: 'none',
+ mask: true
+ })
+ },
+ complete: function() {
+ uni.hideLoading()
+ }
+ }
+ if (reqMethod == 'POST') {
+ params.header = {
+ 'content-type': 'application/x-www-form-urlencoded'
+ }
+ }
+ uni.showLoading({
+ title: '加载中',
+ mask: true
+ })
+ uni.request(params)
+ }
+}
\ No newline at end of file
diff --git a/components/qiun-title-bar/qiun-title-bar.vue b/components/qiun-title-bar/qiun-title-bar.vue
new file mode 100644
index 0000000..f235f17
--- /dev/null
+++ b/components/qiun-title-bar/qiun-title-bar.vue
@@ -0,0 +1,51 @@
+
+
+
+ {{title}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/thorui/tui-badge/tui-badge.vue b/components/thorui/tui-badge/tui-badge.vue
new file mode 100644
index 0000000..208aaa6
--- /dev/null
+++ b/components/thorui/tui-badge/tui-badge.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-bottom-navigation/tui-bottom-navigation.vue b/components/thorui/tui-bottom-navigation/tui-bottom-navigation.vue
new file mode 100644
index 0000000..2e269c5
--- /dev/null
+++ b/components/thorui/tui-bottom-navigation/tui-bottom-navigation.vue
@@ -0,0 +1,388 @@
+
+
+
+
+
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-bottom-popup/tui-bottom-popup.vue b/components/thorui/tui-bottom-popup/tui-bottom-popup.vue
new file mode 100644
index 0000000..97b676c
--- /dev/null
+++ b/components/thorui/tui-bottom-popup/tui-bottom-popup.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-button/tui-button.vue b/components/thorui/tui-button/tui-button.vue
new file mode 100644
index 0000000..160560b
--- /dev/null
+++ b/components/thorui/tui-button/tui-button.vue
@@ -0,0 +1,520 @@
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-card/tui-card.vue b/components/thorui/tui-card/tui-card.vue
new file mode 100644
index 0000000..62a4454
--- /dev/null
+++ b/components/thorui/tui-card/tui-card.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-cascade-selection/tui-cascade-selection.vue b/components/thorui/tui-cascade-selection/tui-cascade-selection.vue
new file mode 100644
index 0000000..2f084df
--- /dev/null
+++ b/components/thorui/tui-cascade-selection/tui-cascade-selection.vue
@@ -0,0 +1,513 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ subItem.text }}
+
+ {{ subItem.subText }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-datetime/tui-datetime.vue b/components/thorui/tui-datetime/tui-datetime.vue
new file mode 100644
index 0000000..9b30017
--- /dev/null
+++ b/components/thorui/tui-datetime/tui-datetime.vue
@@ -0,0 +1,548 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-grid-item/tui-grid-item.vue b/components/thorui/tui-grid-item/tui-grid-item.vue
new file mode 100644
index 0000000..2fdde18
--- /dev/null
+++ b/components/thorui/tui-grid-item/tui-grid-item.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-grid/tui-grid.vue b/components/thorui/tui-grid/tui-grid.vue
new file mode 100644
index 0000000..f4f189a
--- /dev/null
+++ b/components/thorui/tui-grid/tui-grid.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-icon/tui-icon.js b/components/thorui/tui-icon/tui-icon.js
new file mode 100644
index 0000000..36549d2
--- /dev/null
+++ b/components/thorui/tui-icon/tui-icon.js
@@ -0,0 +1,190 @@
+export default {
+ "about": "\ue772",
+ "about-fill": "\ue771",
+ "add": "\ue770",
+ "add-fill": "\ue76f",
+ "addmessage": "\ue76e",
+ "addressbook": "\ue76d",
+ "agree": "\ue76c",
+ "agree-fill": "\ue76b",
+ "alarm": "\ue76a",
+ "alarm-fill": "\ue769",
+ "alipay": "\ue768",
+ "android": "\ue767",
+ "applets": "\ue766",
+ "arrowdown": "\ue765",
+ "arrowleft": "\ue764",
+ "arrowright": "\ue763",
+ "arrowup": "\ue762",
+ "attestation": "\ue761",
+ "back": "\ue760",
+ "bag": "\ue75f",
+ "bag-fill": "\ue75e",
+ "balloon": "\ue75d",
+ "bankcard": "\ue75c",
+ "bankcard-fill": "\ue75b",
+ "bottom": "\ue75a",
+ "calendar": "\ue759",
+ "camera": "\ue758",
+ "camera-fill": "\ue757",
+ "camera-add": "\ue756",
+ "card": "\ue755",
+ "card-fill": "\ue754",
+ "cart": "\ue753",
+ "cart-fill": "\ue752",
+ "category": "\ue751",
+ "category-fill": "\ue750",
+ "check": "\ue74f",
+ "circle": "\ue74e",
+ "circle-fill": "\ue74d",
+ "circle-selected": "\ue74c",
+ "clock": "\ue74b",
+ "clock-fill": "\ue74a",
+ "close": "\ue749",
+ "close-fill": "\ue748",
+ "community": "\ue747",
+ "community-fill": "\ue746",
+ "computer": "\ue745",
+ "computer-fill": "\ue744",
+ "coupon": "\ue743",
+ "delete": "\ue742",
+ "deletekey": "\ue741",
+ "dingtalk": "\ue740",
+ "dissatisfied": "\ue73f",
+ "down": "\ue73e",
+ "download": "\ue73d",
+ "edit": "\ue73c",
+ "ellipsis": "\ue73b",
+ "enlarge": "\ue73a",
+ "evaluate": "\ue739",
+ "exchange": "\ue738",
+ "explain": "\ue737",
+ "explain-fill": "\ue736",
+ "explore": "\ue735",
+ "explore-fill": "\ue734",
+ "eye": "\ue733",
+ "feedback": "\ue732",
+ "fingerprint": "\ue730",
+ "friendadd": "\ue72f",
+ "friendadd-fill": "\ue72e",
+ "gps": "\ue72d",
+ "histogram": "\ue72c",
+ "home": "\ue72b",
+ "home-fill": "\ue72a",
+ "house": "\ue729",
+ "imface": "\ue728",
+ "imkeyboard": "\ue727",
+ "immore": "\ue726",
+ "imvoice": "\ue725",
+ "ios": "\ue724",
+ "kefu": "\ue723",
+ "label": "\ue722",
+ "label-fill": "\ue721",
+ "like": "\ue720",
+ "like-fill": "\ue71f",
+ "link": "\ue71e",
+ "listview": "\ue71d",
+ "loading": "\ue71c",
+ "location": "\ue71b",
+ "mail": "\ue71a",
+ "mail-fill": "\ue719",
+ "manage": "\ue718",
+ "manage-fill": "\ue717",
+ "member": "\ue716",
+ "member-fill": "\ue715",
+ "message": "\ue714",
+ "message-fill": "\ue713",
+ "mobile": "\ue712",
+ "moments": "\ue711",
+ "more": "\ue710",
+ "more-fill": "\ue70f",
+ "narrow": "\ue70e",
+ "news": "\ue70d",
+ "news-fill": "\ue70c",
+ "nodata": "\ue70b",
+ "notice": "\ue699",
+ "notice-fill": "\ue698",
+ "offline": "\ue697",
+ "offline-fill": "\ue696",
+ "oppose": "\ue695",
+ "oppose-fill": "\ue694",
+ "order": "\ue693",
+ "partake": "\ue692",
+ "people": "\ue691",
+ "people-fill": "\ue690",
+ "pic": "\ue68f",
+ "pic-fill": "\ue68e",
+ "picture": "\ue68d",
+ "pie": "\ue68c",
+ "plus": "\ue689",
+ "polygonal": "\ue688",
+ "position": "\ue686",
+ "pwd": "\ue685",
+ "qq": "\ue684",
+ "qrcode": "\ue682",
+ "redpacket": "\ue681",
+ "redpacket-fill": "\ue680",
+ "reduce": "\ue67f",
+ "refresh": "\ue67e",
+ "revoke": "\ue67d",
+ "satisfied": "\ue67c",
+ "screen": "\ue67b",
+ "search": "\ue67a",
+ "search-2": "\ue679",
+ "send": "\ue678",
+ "service": "\ue677",
+ "service-fill": "\ue676",
+ "setup": "\ue675",
+ "setup-fill": "\ue674",
+ "share": "\ue673",
+ "share-fill": "\ue672",
+ "shield": "\ue671",
+ "shop": "\ue670",
+ "shop-fill": "\ue66f",
+ "shut": "\ue66e",
+ "signin": "\ue66d",
+ "sina": "\ue66c",
+ "skin": "\ue66b",
+ "soso": "\ue669",
+ "square": "\ue668",
+ "square-fill": "\ue667",
+ "square-selected": "\ue666",
+ "star": "\ue665",
+ "star-fill": "\ue664",
+ "strategy": "\ue663",
+ "sweep": "\ue662",
+ "time": "\ue661",
+ "time-fill": "\ue660",
+ "todown": "\ue65f",
+ "toleft": "\ue65e",
+ "tool": "\ue65d",
+ "top": "\ue65c",
+ "toright": "\ue65b",
+ "towardsleft": "\ue65a",
+ "towardsright": "\ue659",
+ "towardsright-fill": "\ue658",
+ "transport": "\ue657",
+ "transport-fill": "\ue656",
+ "turningdown": "\ue654",
+ "turningleft": "\ue653",
+ "turningright": "\ue652",
+ "turningup": "\ue651",
+ "unreceive": "\ue650",
+ "seen": "\ue7d2",
+ "unseen": "\ue7d1",
+ "up": "\ue64e",
+ "upload": "\ue64c",
+ "video": "\ue64b",
+ "voice": "\ue649",
+ "voice-fill": "\ue648",
+ "voipphone": "\ue647",
+ "wallet": "\ue646",
+ "warning": "\ue645",
+ "wealth": "\ue644",
+ "wealth-fill": "\ue643",
+ "weather": "\ue642",
+ "wechat": "\ue641",
+ "wifi": "\ue640",
+ "play": "\ue7d5",
+ "suspend": "\ue7d4"
+}
diff --git a/components/thorui/tui-icon/tui-icon.vue b/components/thorui/tui-icon/tui-icon.vue
new file mode 100644
index 0000000..ec9c955
--- /dev/null
+++ b/components/thorui/tui-icon/tui-icon.vue
@@ -0,0 +1,81 @@
+
+ {{ icons[name] }}
+
+
+
+
+
+
diff --git a/components/thorui/tui-list-cell/tui-list-cell.vue b/components/thorui/tui-list-cell/tui-list-cell.vue
new file mode 100644
index 0000000..c2fc8b7
--- /dev/null
+++ b/components/thorui/tui-list-cell/tui-list-cell.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-list-view/tui-list-view.vue b/components/thorui/tui-list-view/tui-list-view.vue
new file mode 100644
index 0000000..d14ebdb
--- /dev/null
+++ b/components/thorui/tui-list-view/tui-list-view.vue
@@ -0,0 +1,97 @@
+
+
+ {{title}}
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-loadmore/tui-loadmore.vue b/components/thorui/tui-loadmore/tui-loadmore.vue
new file mode 100644
index 0000000..4c9ab65
--- /dev/null
+++ b/components/thorui/tui-loadmore/tui-loadmore.vue
@@ -0,0 +1,161 @@
+
+
+
+ {{text}}
+
+
+
+
+
+
diff --git a/components/thorui/tui-navigation-bar/tui-navigation-bar.vue b/components/thorui/tui-navigation-bar/tui-navigation-bar.vue
new file mode 100644
index 0000000..63f7ceb
--- /dev/null
+++ b/components/thorui/tui-navigation-bar/tui-navigation-bar.vue
@@ -0,0 +1,187 @@
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-nomore/tui-nomore.vue b/components/thorui/tui-nomore/tui-nomore.vue
new file mode 100644
index 0000000..cbc9d61
--- /dev/null
+++ b/components/thorui/tui-nomore/tui-nomore.vue
@@ -0,0 +1,115 @@
+
+
+
+ {{isDot?dotText:text}}
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-section/tui-section.vue b/components/thorui/tui-section/tui-section.vue
new file mode 100644
index 0000000..ad928b8
--- /dev/null
+++ b/components/thorui/tui-section/tui-section.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+ {{title}}
+
+
+
+ {{descr}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/thorui/tui-sticky/tui-sticky.vue b/components/thorui/tui-sticky/tui-sticky.vue
new file mode 100644
index 0000000..a7e8e91
--- /dev/null
+++ b/components/thorui/tui-sticky/tui-sticky.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-tabbar/tui-tabbar.vue b/components/thorui/tui-tabbar/tui-tabbar.vue
new file mode 100644
index 0000000..6f7d587
--- /dev/null
+++ b/components/thorui/tui-tabbar/tui-tabbar.vue
@@ -0,0 +1,280 @@
+
+
+
+
+
+
+
+ {{ item.isDot ? '' : item.num }}
+
+
+ {{ item.text }}
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-tabs/tui-tabs.vue b/components/thorui/tui-tabs/tui-tabs.vue
new file mode 100644
index 0000000..6f4097d
--- /dev/null
+++ b/components/thorui/tui-tabs/tui-tabs.vue
@@ -0,0 +1,319 @@
+
+
+
+
+ {{ item.name }}
+
+ {{ item.isDot ? '' : item.num }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-tag/tui-tag.vue b/components/thorui/tui-tag/tui-tag.vue
new file mode 100644
index 0000000..2cdf38b
--- /dev/null
+++ b/components/thorui/tui-tag/tui-tag.vue
@@ -0,0 +1,355 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-time-axis/tui-time-axis.vue b/components/thorui/tui-time-axis/tui-time-axis.vue
new file mode 100644
index 0000000..dc346c0
--- /dev/null
+++ b/components/thorui/tui-time-axis/tui-time-axis.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-timeaxis-item/tui-timeaxis-item.vue b/components/thorui/tui-timeaxis-item/tui-timeaxis-item.vue
new file mode 100644
index 0000000..154b8f6
--- /dev/null
+++ b/components/thorui/tui-timeaxis-item/tui-timeaxis-item.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/thorui/tui-toast/tui-toast.vue b/components/thorui/tui-toast/tui-toast.vue
new file mode 100644
index 0000000..31b6f8f
--- /dev/null
+++ b/components/thorui/tui-toast/tui-toast.vue
@@ -0,0 +1,121 @@
+
+
+
+ {{title}}
+ {{content}}
+
+
+
+
+
+
diff --git a/components/thorui/tui-upload/tui-upload.vue b/components/thorui/tui-upload/tui-upload.vue
new file mode 100644
index 0000000..a77ec15
--- /dev/null
+++ b/components/thorui/tui-upload/tui-upload.vue
@@ -0,0 +1,609 @@
+
+
+
+
+
+
+
+
+
+ {{statusArr[index]==2?'上传中...':'上传失败'}}
+ 重新上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c3ff205
--- /dev/null
+++ b/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..afc6b08
--- /dev/null
+++ b/main.js
@@ -0,0 +1,21 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+ ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+ const app = createSSRApp(App)
+ return {
+ app
+ }
+}
+// #endif
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..7721056
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,79 @@
+{
+ "name" : "过滤器更换系统",
+ "appid" : "__UNI__B0629EA",
+ "description" : "",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ /* 5+App特有相关 */
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 模块配置 */
+ "modules" : {},
+ /* 应用发布信息 */
+ "distribute" : {
+ /* android打包配置 */
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ /* ios打包配置 */
+ "ios" : {
+ "dSYMs" : false
+ },
+ /* SDK配置 */
+ "sdkConfigs" : {
+ "ad" : {}
+ }
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "wxfe4ce767203ac661",
+ "setting" : {
+ "urlCheck" : false,
+ "es6" : true,
+ "postcss" : true,
+ "minified" : true
+ },
+ "usingComponents" : true
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics" : {
+ "enable" : false
+ },
+ "vueVersion" : "2"
+}
diff --git a/packagePage/pages/auth/auth.vue b/packagePage/pages/auth/auth.vue
new file mode 100644
index 0000000..92f6772
--- /dev/null
+++ b/packagePage/pages/auth/auth.vue
@@ -0,0 +1,96 @@
+
+
+
+ 过滤器更换助手
+
+
+
+
+
+ 系统账号,需联系工程师开通!
+
+
+
+
+
+
+
diff --git a/packagePage/pages/ctrldevice/ctrldevice.vue b/packagePage/pages/ctrldevice/ctrldevice.vue
new file mode 100644
index 0000000..736c06b
--- /dev/null
+++ b/packagePage/pages/ctrldevice/ctrldevice.vue
@@ -0,0 +1,315 @@
+
+
+
+ 扫描过滤器上二维码快速录
+
+
+
+
+
+
+
+ 上传
+
+
+
+
+
+
+
+
+
+ {{deviceInfo.position}}
+ {{position}}
+
+
+ #尺寸规格:
+ #尺寸规格:{{deviceInfo.specification}} {{deviceInfo.type}}
+
+
+ 保存
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/ctrllist/ctrllist.vue b/packagePage/pages/ctrllist/ctrllist.vue
new file mode 100644
index 0000000..4b032c4
--- /dev/null
+++ b/packagePage/pages/ctrllist/ctrllist.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+
+ {{item.hospital}}
+ {{item.address}}
+
+
+
+ {{item.created_at}}
+ 安装中
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/my/my.vue b/packagePage/pages/my/my.vue
new file mode 100644
index 0000000..a597688
--- /dev/null
+++ b/packagePage/pages/my/my.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+ {{name}}
+ {{title}}
+
+
+ 安全退出
+
+
+
+
+
+
+
+
+ 安装日志
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/overview/overview.vue b/packagePage/pages/overview/overview.vue
new file mode 100644
index 0000000..225250b
--- /dev/null
+++ b/packagePage/pages/overview/overview.vue
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+ 闸门调控次数
+ {{total_gate_count}}
+
+
+ 本月 {{current_gate_count}}
+ 总计 {{total_gate_count}}
+
+
+
+ 水泵调控次数
+ {{total_pump_count}}
+
+
+ 本月 {{current_pump_count}}
+ 总计 {{total_pump_count}}
+
+
+
+
+
+
+
+
+
+ 月
+ 年
+
+
+
+
+
+
+
+
+ 月
+ 年
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/position/position.vue b/packagePage/pages/position/position.vue
new file mode 100644
index 0000000..b3bc7ed
--- /dev/null
+++ b/packagePage/pages/position/position.vue
@@ -0,0 +1,95 @@
+
+
+
+ 请选择安装点位
+
+
+
+
+
+
+
diff --git a/packagePage/pages/positionindex/positionindex.vue b/packagePage/pages/positionindex/positionindex.vue
new file mode 100644
index 0000000..e182145
--- /dev/null
+++ b/packagePage/pages/positionindex/positionindex.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+ {{item.month}}
+
+ 录入点位次数: {{item.count}}
+
+
+
+
+
+
+
+
+
+
+
+ {{it.courtyard}}
+ {{it.building}}({{it.layer}})
+ 安装位置:{{it.scription}}
+ 安装时间:{{it.created_at}}
+
+
+ {{it.hospital}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/record/record.vue b/packagePage/pages/record/record.vue
new file mode 100644
index 0000000..101b64e
--- /dev/null
+++ b/packagePage/pages/record/record.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+ {{item.hospital}}-{{item.courtyard}}-{{item.building}}-{{item.layer}}-{{item.scription}}-{{item.type}}-{{item.specification}}-{{item.name}} 更换/新装完成!
+
+
+
+
+
+
+
+
+ {{item.hospital}}
+ {{item.time}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/userinfo/userinfo.vue b/packagePage/pages/userinfo/userinfo.vue
new file mode 100644
index 0000000..160ed8f
--- /dev/null
+++ b/packagePage/pages/userinfo/userinfo.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+ 账号
+
+ {{user.account}}
+
+
+
+
+
+
+ 姓名
+
+ {{user.name}}
+
+
+
+
+
+
+ 角色
+
+ {{user.name}}
+
+
+
+
+
+
+ 联系电话
+
+ {{user.mobile}}
+
+
+
+
+
+
+
+
+
+
diff --git a/packagePage/pages/wait/wait.vue b/packagePage/pages/wait/wait.vue
new file mode 100644
index 0000000..db14534
--- /dev/null
+++ b/packagePage/pages/wait/wait.vue
@@ -0,0 +1,43 @@
+
+
+
+ 等待开通...
+
+
+
+
+
+
+
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..ad13f81
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,97 @@
+{
+ "pages": [
+ {
+ "path": "packagePage/pages/ctrldevice/ctrldevice",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "packagePage/pages/positionindex/positionindex",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "pages/index/index",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手"
+ }
+ },
+ {
+ "path": "packagePage/pages/position/position",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ },
+ {
+ "path": "packagePage/pages/record/record",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ }
+ ,{
+ "path": "packagePage/pages/overview/overview",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ }
+ ,{
+ "path": "packagePage/pages/auth/auth",
+ "style":
+ {
+ "navigationBarTitleText": "",
+ "enablePullDownRefresh": false
+ }
+ }
+ , {
+ "path": "packagePage/pages/my/my",
+ "style":
+ {
+ "navigationBarTitleText": "我的",
+ "navigationBarBackgroundColor": "#586ACC",
+ "enablePullDownRefresh": false
+ }
+ }
+ , {
+ "path": "packagePage/pages/ctrllist/ctrllist",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ }
+ , {
+ "path": "packagePage/pages/wait/wait",
+ "style":
+ {
+ "navigationBarTitleText": "过滤器更换助手",
+ "enablePullDownRefresh": false
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "过滤器更换助手",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ },
+ "easycom": {
+ "autoscan": true,
+ "custom": {
+ "tui-(.*)": "@/components/thorui/tui-$1/tui-$1.vue"
+ }
+ },
+ "uniIdRouter": { }
+}
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..76c1ae9
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/project.config.json b/project.config.json
new file mode 100644
index 0000000..1aae245
--- /dev/null
+++ b/project.config.json
@@ -0,0 +1,68 @@
+{
+ "description": "项目配置文件",
+ "packOptions": {
+ "ignore": []
+ },
+ "setting": {
+ "bundle": false,
+ "userConfirmedBundleSwitch": false,
+ "urlCheck": true,
+ "scopeDataCheck": false,
+ "coverView": true,
+ "es6": true,
+ "postcss": true,
+ "compileHotReLoad": false,
+ "lazyloadPlaceholderEnable": false,
+ "preloadBackgroundData": false,
+ "minified": true,
+ "autoAudits": false,
+ "newFeature": false,
+ "uglifyFileName": false,
+ "uploadWithSourceMap": true,
+ "useIsolateContext": true,
+ "nodeModules": false,
+ "enhance": true,
+ "useMultiFrameRuntime": true,
+ "useApiHook": true,
+ "useApiHostProcess": true,
+ "showShadowRootInWxmlPanel": true,
+ "packNpmManually": false,
+ "enableEngineNative": false,
+ "packNpmRelationList": [],
+ "minifyWXSS": true,
+ "showES6CompileOption": false
+ },
+ "compileType": "miniprogram",
+ "libVersion": "2.25.3",
+ "appid": "wx7aa32eb2d4ea80e1",
+ "projectname": "%E9%97%B8%E9%97%A8%E6%99%BA%E6%8E%A7",
+ "debugOptions": {
+ "hidedInDevtools": []
+ },
+ "scripts": {},
+ "staticServerOptions": {
+ "baseURL": "",
+ "servePath": ""
+ },
+ "isGameTourist": false,
+ "condition": {
+ "search": {
+ "list": []
+ },
+ "conversation": {
+ "list": []
+ },
+ "game": {
+ "list": []
+ },
+ "plugin": {
+ "list": []
+ },
+ "gamePlugin": {
+ "list": []
+ },
+ "miniprogram": {
+ "list": []
+ }
+ }
+}
\ No newline at end of file
diff --git a/static/fonts/thorui.ttf b/static/fonts/thorui.ttf
new file mode 100644
index 0000000..ec78419
Binary files /dev/null and b/static/fonts/thorui.ttf differ
diff --git a/static/style/thorui.css b/static/style/thorui.css
new file mode 100644
index 0000000..050ed25
--- /dev/null
+++ b/static/style/thorui.css
@@ -0,0 +1,2487 @@
+/* Thor UI 基础组件 样式*/
+
+/*!
+ * =====================================================
+ * Thor UI v1.5.0 (https://www.thorui.cn/)
+ * =====================================================
+ */
+@font-face {
+ font-family: 'thoruiFont';
+ src: url('~@/static/fonts/thorui.ttf') format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+
+.tui-mask {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.4);
+ z-index: 999;
+}
+
+.tui-ellipsis {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.tui-ellipsis-2 {
+ display: -webkit-box;
+ overflow: hidden;
+ white-space: normal !important;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.tui-opcity {
+ opacity: 0.5;
+}
+
+.tui-scale-small {
+ transform: scale(0.9);
+ transform-origin: center center;
+}
+
+.tui-height-full {
+ height: 100%;
+}
+
+.tui-width-full {
+ width: 100%;
+}
+
+.tui-ptop-zero {
+ padding-top: 0;
+}
+
+.tui-pbottom-zero {
+ padding-bottom: 0;
+}
+
+.tui-pleft-zero {
+ padding-left: 0;
+}
+
+.tui-pright-zero {
+ padding-right: 0;
+}
+
+
+/* color start*/
+
+.tui-color-primary {
+ color: #5677fc;
+}
+
+.tui-color-success {
+ color: #19be6b;
+}
+
+.tui-color-warning {
+ color: #ff7900;
+}
+
+.tui-color-error {
+ color: #EB0909;
+}
+
+.tui-color-blue {
+ color: #007AFF;
+}
+
+.tui-color-blue {
+ color: #007AFF;
+}
+
+.tui-color-white {
+ color: #ffffff;
+}
+
+.tui-color-pink {
+ color: #f74d54;
+}
+
+.tui-primary {
+ background-color: #5677fc !important;
+ color: #fff;
+}
+
+.tui-light-primary {
+ background-color: #5c8dff !important;
+ color: #fff;
+}
+
+.tui-dark-primary {
+ background-color: #4a67d6 !important;
+ color: #fff;
+}
+
+.tui-dLight-primary {
+ background-color: #4e77d9 !important;
+ color: #fff;
+}
+
+.tui-danger {
+ background-color: #ed3f14 !important;
+ color: #fff;
+}
+
+.tui-warning {
+ background-color: #ff7900 !important;
+ color: #fff;
+}
+
+.tui-blue {
+ background-color: #007AFF !important;
+ color: #fff;
+}
+
+.tui-green {
+ background-color: #19be6b !important;
+ color: #fff;
+}
+
+.tui-black {
+ background-color: #000 !important;
+ color: #fff;
+}
+
+.tui-white {
+ background-color: #fff !important;
+ color: #333 !important;
+}
+
+.tui-translucent {
+ background-color: rgba(0, 0, 0, 0.7);
+}
+
+.tui-light-black {
+ background-color: #333 !important;
+}
+
+.tui-gray {
+ background-color: #80848f;
+}
+
+.tui-phcolor-gray {
+ background-color: #ccc !important;
+}
+
+.tui-divider-gray {
+ background-color: #eaeef1 !important;
+}
+
+.tui-btn-gray {
+ background-color: #ededed !important;
+ color: #999 !important;
+}
+
+.tui-hover-gray {
+ background-color: #f7f7f9 !important;
+}
+
+.tui-bg-gray {
+ background-color: #fafafa !important;
+}
+
+.tui-light-blue {
+ background-color: #ecf6fd;
+ color: #4dabeb !important;
+}
+
+.tui-light-brownish {
+ background-color: #fcebef;
+ color: #8a5966 !important;
+}
+
+.tui-light-orange {
+ background-color: #fef5eb;
+ color: #faa851 !important;
+}
+
+.tui-light-green {
+ background-color: #e8f6e8;
+ color: #44cf85 !important;
+}
+
+/* color end*/
+
+
+/* flex start */
+
+.tui-flex {
+ display: -webkit-flex;
+ display: flex;
+}
+
+.tui-flex-1 {
+ flex: 1;
+}
+
+.tui-align-center {
+ justify-content: center;
+}
+
+.tui-align-left {
+ justify-content: flex-start !important;
+}
+
+.tui-align-right {
+ justify-content: flex-end !important;
+}
+
+.tui-align-between {
+ justify-content: space-between !important;
+}
+
+.tui-align-around {
+ justify-content: space-around !important;
+}
+
+.tui-vertical-center {
+ align-items: center;
+}
+
+.tui-vertical-top {
+ align-items: flex-start;
+}
+
+.tui-vertical-bottom {
+ align-items: flex-end;
+}
+
+.tui-center {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.tui-line-feed {
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+
+.tui-col-12 {
+ width: 100%;
+}
+
+.tui-col-11 {
+ width: 91.66666667%;
+}
+
+.tui-col-10 {
+ width: 83.33333333%;
+}
+
+.tui-col-9 {
+ width: 75%;
+}
+
+.tui-col-8 {
+ width: 66.66666667%;
+}
+
+.tui-col-7 {
+ width: 58.33333333%;
+}
+
+.tui-col-6 {
+ width: 50%;
+}
+
+.tui-col-5 {
+ width: 41.66666667%;
+}
+
+.tui-col-4 {
+ width: 33.33333333%;
+}
+
+.tui-col-3 {
+ width: 25%;
+}
+
+.tui-col-2 {
+ width: 16.66666667%;
+}
+
+.tui-col-1 {
+ width: 8.33333333%;
+}
+
+/* flex end */
+
+
+/* icon start */
+.tui-icon {
+ font-family: 'thoruiFont' !important;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ text-align: center;
+ text-decoration: none;
+ font-size: 32px;
+ color: #999;
+}
+
+.tui-icon-about:before {
+ content: '\e772';
+}
+
+.tui-icon-about-fill:before {
+ content: '\e771';
+}
+
+.tui-icon-add:before {
+ content: '\e770';
+}
+
+.tui-icon-add-fill:before {
+ content: '\e76f';
+}
+
+.tui-icon-addmessage:before {
+ content: '\e76e';
+}
+
+.tui-icon-addressbook:before {
+ content: '\e76d';
+}
+
+.tui-icon-agree:before {
+ content: '\e76c';
+}
+
+.tui-icon-agree-fill:before {
+ content: '\e76b';
+}
+
+.tui-icon-alarm:before {
+ content: '\e76a';
+}
+
+.tui-icon-alarm-fill:before {
+ content: '\e769';
+}
+
+.tui-icon-alipay:before {
+ content: '\e768';
+}
+
+.tui-icon-android:before {
+ content: '\e767';
+}
+
+.tui-icon-applets:before {
+ content: '\e766';
+}
+
+.tui-icon-arrowdown:before {
+ content: '\e765';
+}
+
+.tui-icon-arrowleft:before {
+ content: '\e764';
+}
+
+.tui-icon-arrowright:before {
+ content: '\e763';
+}
+
+.tui-icon-arrowup:before {
+ content: '\e762';
+}
+
+.tui-icon-attestation:before {
+ content: '\e761';
+}
+
+.tui-icon-back:before {
+ content: '\e760';
+}
+
+.tui-icon-bag:before {
+ content: '\e75f';
+}
+
+.tui-icon-bag-fill:before {
+ content: '\e75e';
+}
+
+.tui-icon-balloon:before {
+ content: '\e75d';
+}
+
+.tui-icon-bankcard:before {
+ content: '\e75c';
+}
+
+.tui-icon-bankcard-fill:before {
+ content: '\e75b';
+}
+
+.tui-icon-bottom:before {
+ content: '\e75a';
+}
+
+.tui-icon-calendar:before {
+ content: '\e759';
+}
+
+.tui-icon-camera:before {
+ content: '\e758';
+}
+
+.tui-icon-camera-fill:before {
+ content: '\e757';
+}
+
+.tui-icon-camera-add:before {
+ content: '\e756';
+}
+
+.tui-icon-card:before {
+ content: '\e755';
+}
+
+.tui-icon-card-fill:before {
+ content: '\e754';
+}
+
+.tui-icon-cart:before {
+ content: '\e753';
+}
+
+.tui-icon-cart-fill:before {
+ content: '\e752';
+}
+
+.tui-icon-category:before {
+ content: '\e751';
+}
+
+.tui-icon-category-fill:before {
+ content: '\e750';
+}
+
+.tui-icon-check:before {
+ content: '\e74f';
+}
+
+.tui-icon-circle:before {
+ content: '\e74e';
+}
+
+.tui-icon-circle-fill:before {
+ content: '\e74d';
+}
+
+.tui-icon-circle-selected:before {
+ content: '\e74c';
+}
+
+.tui-icon-clock:before {
+ content: '\e74b';
+}
+
+.tui-icon-clock-fill:before {
+ content: '\e74a';
+}
+
+.tui-icon-close:before {
+ content: '\e749';
+}
+
+.tui-icon-close-fill:before {
+ content: '\e748';
+}
+
+.tui-icon-community:before {
+ content: '\e747';
+}
+
+.tui-icon-community-fill:before {
+ content: '\e746';
+}
+
+.tui-icon-computer:before {
+ content: '\e745';
+}
+
+.tui-icon-computer-fill:before {
+ content: '\e744';
+}
+
+.tui-icon-coupon:before {
+ content: '\e743';
+}
+
+.tui-icon-delete:before {
+ content: '\e742';
+}
+
+.tui-icon-deletekey:before {
+ content: '\e741';
+}
+
+.tui-icon-dingtalk:before {
+ content: '\e740';
+}
+
+.tui-icon-dissatisfied:before {
+ content: '\e73f';
+}
+
+.tui-icon-down:before {
+ content: '\e73e';
+}
+
+.tui-icon-download:before {
+ content: '\e73d';
+}
+
+.tui-icon-edit:before {
+ content: '\e73c';
+}
+
+.tui-icon-ellipsis:before {
+ content: '\e73b';
+}
+
+.tui-icon-enlarge:before {
+ content: '\e73a';
+}
+
+.tui-icon-evaluate:before {
+ content: '\e739';
+}
+
+.tui-icon-exchange:before {
+ content: '\e738';
+}
+
+.tui-icon-explain:before {
+ content: '\e737';
+}
+
+.tui-icon-explain-fill:before {
+ content: '\e736';
+}
+
+.tui-icon-explore:before {
+ content: '\e735';
+}
+
+.tui-icon-explore-fill:before {
+ content: '\e734';
+}
+
+.tui-icon-eye:before {
+ content: '\e733';
+}
+
+.tui-icon-feedback:before {
+ content: '\e732';
+}
+
+.tui-icon-fingerprint:before {
+ content: '\e730';
+}
+
+.tui-icon-friendadd:before {
+ content: '\e72f';
+}
+
+.tui-icon-friendadd-fill:before {
+ content: '\e72e';
+}
+
+.tui-icon-gps:before {
+ content: '\e72d';
+}
+
+.tui-icon-histogram:before {
+ content: '\e72c';
+}
+
+.tui-icon-home:before {
+ content: '\e72b';
+}
+
+.tui-icon-home-fill:before {
+ content: '\e72a';
+}
+
+.tui-icon-house:before {
+ content: '\e729';
+}
+
+.tui-icon-imface:before {
+ content: '\e728';
+}
+
+.tui-icon-imkeyboard:before {
+ content: '\e727';
+}
+
+.tui-icon-immore:before {
+ content: '\e726';
+}
+
+.tui-icon-imvoice:before {
+ content: '\e725';
+}
+
+.tui-icon-ios:before {
+ content: '\e724';
+}
+
+.tui-icon-kefu:before {
+ content: '\e723';
+}
+
+.tui-icon-label:before {
+ content: '\e722';
+}
+
+.tui-icon-label-fill:before {
+ content: '\e721';
+}
+
+.tui-icon-like:before {
+ content: '\e720';
+}
+
+.tui-icon-like-fill:before {
+ content: '\e71f';
+}
+
+.tui-icon-link:before {
+ content: '\e71e';
+}
+
+.tui-icon-listview:before {
+ content: '\e71d';
+}
+
+.tui-icon-loading:before {
+ content: '\e71c';
+}
+
+.tui-icon-location:before {
+ content: '\e71b';
+}
+
+.tui-icon-mail:before {
+ content: '\e71a';
+}
+
+.tui-icon-mail-fill:before {
+ content: '\e719';
+}
+
+.tui-icon-manage:before {
+ content: '\e718';
+}
+
+.tui-icon-manage-fill:before {
+ content: '\e717';
+}
+
+.tui-icon-member:before {
+ content: '\e716';
+}
+
+.tui-icon-member-fill:before {
+ content: '\e715';
+}
+
+.tui-icon-message:before {
+ content: '\e714';
+}
+
+.tui-icon-message-fill:before {
+ content: '\e713';
+}
+
+.tui-icon-mobile:before {
+ content: '\e712';
+}
+
+.tui-icon-moments:before {
+ content: '\e711';
+}
+
+.tui-icon-more:before {
+ content: '\e710';
+}
+
+.tui-icon-more-fill:before {
+ content: '\e70f';
+}
+
+.tui-icon-narrow:before {
+ content: '\e70e';
+}
+
+.tui-icon-news:before {
+ content: '\e70d';
+}
+
+.tui-icon-news-fill:before {
+ content: '\e70c';
+}
+
+.tui-icon-nodata:before {
+ content: '\e70b';
+}
+
+.tui-icon-notice:before {
+ content: '\e699';
+}
+
+.tui-icon-notice-fill:before {
+ content: '\e698';
+}
+
+.tui-icon-offline:before {
+ content: '\e697';
+}
+
+.tui-icon-offline-fill:before {
+ content: '\e696';
+}
+
+.tui-icon-oppose:before {
+ content: '\e695';
+}
+
+.tui-icon-oppose-fill:before {
+ content: '\e694';
+}
+
+.tui-icon-order:before {
+ content: '\e693';
+}
+
+.tui-icon-partake:before {
+ content: '\e692';
+}
+
+.tui-icon-people:before {
+ content: '\e691';
+}
+
+.tui-icon-people-fill:before {
+ content: '\e690';
+}
+
+.tui-icon-pic:before {
+ content: '\e68f';
+}
+
+.tui-icon-pic-fill:before {
+ content: '\e68e';
+}
+
+.tui-icon-picture:before {
+ content: '\e68d';
+}
+
+.tui-icon-pie:before {
+ content: '\e68c';
+}
+
+.tui-icon-play:before {
+ content: '\e68b';
+}
+
+.tui-icon-plus:before {
+ content: '\e689';
+}
+
+.tui-icon-polygonal:before {
+ content: '\e688';
+}
+
+.tui-icon-position:before {
+ content: '\e687';
+}
+
+.tui-icon-position-fill:before {
+ content: '\e686';
+}
+
+.tui-icon-pwd:before {
+ content: '\e685';
+}
+
+.tui-icon-qq:before {
+ content: '\e684';
+}
+
+.tui-icon-qrcode:before {
+ content: '\e682';
+}
+
+.tui-icon-redpacket:before {
+ content: '\e681';
+}
+
+.tui-icon-redpacket-fill:before {
+ content: '\e680';
+}
+
+.tui-icon-reduce:before {
+ content: '\e67f';
+}
+
+.tui-icon-refresh:before {
+ content: '\e67e';
+}
+
+.tui-icon-revoke:before {
+ content: '\e67d';
+}
+
+.tui-icon-satisfied:before {
+ content: '\e67c';
+}
+
+.tui-icon-screen:before {
+ content: '\e67b';
+}
+
+.tui-icon-search:before {
+ content: '\e67a';
+}
+
+.tui-icon-search-2:before {
+ content: '\e679';
+}
+
+.tui-icon-send:before {
+ content: '\e678';
+}
+
+.tui-icon-service:before {
+ content: '\e677';
+}
+
+.tui-icon-service-fill:before {
+ content: '\e676';
+}
+
+.tui-icon-setup:before {
+ content: '\e675';
+}
+
+.tui-icon-setup-fill:before {
+ content: '\e674';
+}
+
+.tui-icon-share:before {
+ content: '\e673';
+}
+
+.tui-icon-share-fill:before {
+ content: '\e672';
+}
+
+.tui-icon-shield:before {
+ content: '\e671';
+}
+
+.tui-icon-shop:before {
+ content: '\e670';
+}
+
+.tui-icon-shop-fill:before {
+ content: '\e66f';
+}
+
+.tui-icon-shut:before {
+ content: '\e66e';
+}
+
+.tui-icon-signin:before {
+ content: '\e66d';
+}
+
+.tui-icon-sina:before {
+ content: '\e66c';
+}
+
+.tui-icon-skin:before {
+ content: '\e66b';
+}
+
+.tui-icon-soso:before {
+ content: '\e669';
+}
+
+.tui-icon-square:before {
+ content: '\e668';
+}
+
+.tui-icon-square-fill:before {
+ content: '\e667';
+}
+
+.tui-icon-square-selected:before {
+ content: '\e666';
+}
+
+.tui-icon-star:before {
+ content: '\e665';
+}
+
+.tui-icon-star-fill:before {
+ content: '\e664';
+}
+
+.tui-icon-strategy:before {
+ content: '\e663';
+}
+
+.tui-icon-sweep:before {
+ content: '\e662';
+}
+
+.tui-icon-time:before {
+ content: '\e661';
+}
+
+.tui-icon-time-fill:before {
+ content: '\e660';
+}
+
+.tui-icon-todown:before {
+ content: '\e65f';
+}
+
+.tui-icon-toleft:before {
+ content: '\e65e';
+}
+
+.tui-icon-tool:before {
+ content: '\e65d';
+}
+
+.tui-icon-top:before {
+ content: '\e65c';
+}
+
+.tui-icon-toright:before {
+ content: '\e65b';
+}
+
+.tui-icon-towardsleft:before {
+ content: '\e65a';
+}
+
+.tui-icon-towardsright:before {
+ content: '\e659';
+}
+
+.tui-icon-towardsright-fill:before {
+ content: '\e658';
+}
+
+.tui-icon-transport:before {
+ content: '\e657';
+}
+
+.tui-icon-transport-fill:before {
+ content: '\e656';
+}
+
+.tui-icon-turningdown:before {
+ content: '\e654';
+}
+
+.tui-icon-turningleft:before {
+ content: '\e653';
+}
+
+.tui-icon-turningright:before {
+ content: '\e652';
+}
+
+.tui-icon-turningup:before {
+ content: '\e651';
+}
+
+.tui-icon-unreceive:before {
+ content: '\e650';
+}
+
+.tui-icon-unseen:before {
+ content: '\e64f';
+}
+
+.tui-icon-up:before {
+ content: '\e64e';
+}
+
+.tui-icon-upload:before {
+ content: '\e64c';
+}
+
+.tui-icon-video:before {
+ content: '\e64b';
+}
+
+.tui-icon-voice:before {
+ content: '\e649';
+}
+
+.tui-icon-voice-fill:before {
+ content: '\e648';
+}
+
+.tui-icon-voipphone:before {
+ content: '\e647';
+}
+
+.tui-icon-wallet:before {
+ content: '\e646';
+}
+
+.tui-icon-warning:before {
+ content: '\e645';
+}
+
+.tui-icon-wealth:before {
+ content: '\e644';
+}
+
+.tui-icon-wealth-fill:before {
+ content: '\e643';
+}
+
+.tui-icon-weather:before {
+ content: '\e642';
+}
+
+.tui-icon-wechat:before {
+ content: '\e641';
+}
+
+.tui-icon-wifi:before {
+ content: '\e640';
+}
+
+/* icon end */
+
+/*Button start*/
+.tui-btn-primary {
+ background: #5677fc !important;
+ color: #fff;
+}
+
+.tui-shadow-primary {
+ box-shadow: 0 10rpx 14rpx 0 rgba(86, 119, 252, 0.2);
+}
+
+.tui-btn-danger {
+ background: #eb0909 !important;
+ color: #fff;
+}
+
+.tui-shadow-danger {
+ box-shadow: 0 10rpx 14rpx 0 rgba(235, 9, 9, 0.2);
+}
+
+.tui-btn-warning {
+ background: #fc872d !important;
+ color: #fff;
+}
+
+.tui-shadow-warning {
+ box-shadow: 0 10rpx 14rpx 0 rgba(252, 135, 45, 0.2);
+}
+
+.tui-btn-green {
+ background: #35b06a !important;
+ color: #fff;
+}
+
+.tui-shadow-green {
+ box-shadow: 0 10rpx 14rpx 0 rgba(53, 176, 106, 0.2);
+}
+
+.tui-btn-blue {
+ background: #007AFF !important;
+ color: #fff;
+}
+
+.tui-shadow-blue {
+ box-shadow: 0 10rpx 14rpx 0 rgba(0, 122, 255, 0.2);
+}
+
+.tui-btn-white {
+ background: #fff !important;
+ color: #333 !important;
+}
+
+.tui-btn-gray {
+ background: #bfbfbf !important;
+ color: #fff !important;
+}
+
+.tui-btn-black {
+ background: #333 !important;
+ color: #fff !important;
+}
+
+.tui-shadow-gray {
+ box-shadow: 0 10rpx 14rpx 0 rgba(191, 191, 191, 0.2);
+}
+
+.tui-hover-gray {
+ background: #f7f7f9 !important;
+}
+
+.tui-black-hover {
+ background: #555 !important;
+ color: #e5e5e5 !important;
+}
+
+/* button start
+ * 宽高通过覆盖样式改变
+**/
+
+.tui-btn {
+ width: 100%;
+ height: 96rpx;
+ line-height: 96rpx;
+ font-size: 32rpx;
+ position: relative;
+ border: 0 !important;
+ border-radius: 6rpx;
+ padding-left: 0;
+ padding-right: 0;
+ overflow: visible;
+}
+
+.tui-btn-base {
+ width: auto;
+ /* #ifdef MP-ALIPAY */
+ min-width: 200rpx;
+ /* #endif */
+ font-size: 30rpx;
+ height: 70rpx;
+ line-height: 70rpx;
+}
+
+.tui-btn-small {
+ width: auto;
+ /* #ifdef MP-ALIPAY */
+ min-width: 140rpx;
+ /* #endif */
+ font-size: 30rpx;
+ height: 60rpx;
+ line-height: 60rpx;
+}
+
+.tui-btn::after {
+ content: '';
+ position: absolute;
+ width: 200%;
+ height: 200%;
+ transform-origin: 0 0;
+ transform: scale(0.5, 0.5) translateZ(0);
+ box-sizing: border-box;
+ left: 0;
+ top: 0;
+ border-radius: 12rpx;
+ border: 0;
+}
+
+.tui-btn-white::after {
+ border: 1rpx solid #bfbfbf;
+}
+
+.tui-white-hover {
+ background: #e5e5e5 !important;
+ color: #2e2e2e !important;
+}
+
+.tui-dark-disabled {
+ opacity: 0.6 !important;
+ color: #fafbfc !important;
+}
+
+.tui-dark-disabled-outline {
+ opacity: 0.5 !important;
+}
+
+.tui-gray-disabled {
+ background: #f3f3f3 !important;
+ color: #919191 !important;
+ box-shadow: none;
+}
+
+.tui-outline-hover {
+ opacity: 0.5;
+}
+
+.tui-primary-hover {
+ background: #4a67d6 !important;
+ color: #e5e5e5 !important;
+}
+
+.tui-primary-outline::after {
+ border: 1rpx solid #5677fc !important;
+}
+
+.tui-primary-outline {
+ color: #5677fc !important;
+ background: transparent;
+}
+
+.tui-danger-hover {
+ background: #c80808 !important;
+ color: #e5e5e5 !important;
+}
+
+.tui-danger-outline {
+ color: #eb0909 !important;
+ background: transparent;
+}
+
+.tui-danger-outline::after {
+ border: 1rpx solid #eb0909 !important;
+}
+
+.tui-warning-hover {
+ background: #d67326 !important;
+ color: #e5e5e5 !important;
+}
+
+.tui-warning-outline {
+ color: #fc872d !important;
+ background: transparent;
+}
+
+.tui-warning-outline::after {
+ border: 1px solid #fc872d !important;
+}
+
+.tui-green-hover {
+ background: #2d965a !important;
+ color: #e5e5e5 !important;
+}
+
+.tui-green-outline {
+ color: #35b06a !important;
+ background: transparent;
+}
+
+.tui-green-outline::after {
+ border: 1rpx solid #35b06a !important;
+}
+
+.tui-blue-hover {
+ background: #0062CC !important;
+ color: #e5e5e5 !important;
+}
+
+.tui-blue-outline {
+ color: #007AFF !important;
+ background: transparent;
+}
+
+.tui-blue-outline::after {
+ border: 1rpx solid #007AFF !important;
+}
+
+/* #ifndef APP-NVUE */
+.tui-btn-gradual {
+ background: linear-gradient(90deg, rgb(255, 89, 38), rgb(240, 14, 44)) !important;
+ color: #fff !important;
+}
+
+.tui-shadow-gradual {
+ box-shadow: 0 10rpx 14rpx 0 rgba(235, 9, 9, 0.15);
+}
+
+/* #endif */
+
+.tui-gray-hover {
+ background: #a3a3a3 !important;
+ color: #898989;
+}
+
+/* #ifndef APP-NVUE */
+.tui-gradual-hover {
+ background: linear-gradient(90deg, #d74620, #cd1225) !important;
+ color: #fff !important;
+}
+
+/* #endif */
+
+.tui-gray-outline {
+ color: #999 !important;
+ background: transparent !important;
+}
+
+.tui-white-outline {
+ color: #fff !important;
+ background: transparent !important;
+}
+
+.tui-black-outline {
+ background: transparent !important;
+ color: #333 !important;
+}
+
+.tui-gray-outline::after {
+ border: 1rpx solid #ccc !important;
+}
+
+.tui-white-outline::after {
+ border: 1px solid #fff !important;
+}
+
+.tui-black-outline::after {
+ border: 1px solid #333 !important;
+}
+
+/*圆角 */
+
+.tui-fillet {
+ border-radius: 50rpx;
+}
+
+.tui-btn-white.tui-fillet::after {
+ border-radius: 98rpx;
+}
+
+.tui-outline-fillet::after {
+ border-radius: 98rpx;
+}
+
+/*平角*/
+.tui-rightAngle {
+ border-radius: 0;
+}
+
+.tui-btn-white.tui-rightAngle::after {
+ border-radius: 0;
+}
+
+.tui-outline-rightAngle::after {
+ border-radius: 0;
+}
+
+/*Button end*/
+
+/*Tag start*/
+
+.tui-tag {
+ padding: 16rpx 26rpx;
+ font-size: 28rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 6rpx;
+}
+
+.tui-tag-outline {
+ position: relative;
+ background-color: none;
+ color: #5677fc;
+}
+
+.tui-tag-outline::after {
+ content: '';
+ position: absolute;
+ width: 200%;
+ height: 200%;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: scale(0.5, 0.5);
+ transform: scale(0.5, 0.5);
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ left: 0;
+ top: 0;
+ border-radius: 12rpx;
+}
+
+.tui-tag-fillet {
+ border-radius: 50rpx;
+}
+
+.tui-white.tui-tag-fillet::after {
+ border-radius: 80rpx;
+}
+
+.tui-tag-outline-fillet::after {
+ border-radius: 80rpx;
+}
+
+.tui-tag-fillet-left {
+ border-radius: 50rpx 0 0 50rpx;
+}
+
+.tui-tag-fillet-right {
+ border-radius: 0 50rpx 50rpx 0;
+}
+
+.tui-tag-fillet-left.tui-tag-outline::after {
+ border-radius: 100rpx 0 0 100rpx;
+}
+
+.tui-tag-fillet-right.tui-tag-outline::after {
+ border-radius: 0 100rpx 100rpx 0;
+}
+
+/*Tag end*/
+
+/*Badge start*/
+.tui-badge-dot {
+ height: 16rpx;
+ width: 16rpx;
+ border-radius: 50%;
+}
+
+.tui-badge {
+ font-size: 24rpx;
+ height: 36rpx;
+ min-width: 12rpx;
+ padding: 0 12rpx;
+ border-radius: 36rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 10;
+}
+
+.tui-badge-scale {
+ transform-origin: center center;
+}
+
+/*Badge end*/
+
+/*List start*/
+.tui-list-cell {
+ position: relative;
+ width: 100%;
+ padding: 26rpx 30rpx;
+ background-color: #fff;
+ box-sizing: border-box;
+}
+
+.tui-list-radius {
+ border-radius: 6rpx;
+ overflow: hidden;
+}
+
+.tui-cell-hover {
+ background-color: #f1f1f1 !important;
+}
+
+.tui-list-cell::after {
+ content: '';
+ position: absolute;
+ border-bottom: 1rpx solid #eaeef1;
+ -webkit-transform: scaleY(0.5) translateZ(0);
+ transform: scaleY(0.5) translateZ(0);
+ transform-origin: 0 100%;
+ bottom: 0;
+ right: 0;
+ left: 0;
+}
+
+.tui-line-left::after {
+ left: 30rpx !important;
+}
+
+.tui-line-right::after {
+ right: 30rpx !important;
+}
+
+.tui-cell-unlined::after {
+ border-bottom: 0 !important;
+}
+
+.tui-cell-arrow::before {
+ content: ' ';
+ height: 10px;
+ width: 10px;
+ border-width: 2px 2px 0 0;
+ border-color: #c0c0c0;
+ border-style: solid;
+ -webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+ transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+ position: absolute;
+ top: 50%;
+ margin-top: -6px;
+ right: 30rpx;
+}
+
+.tui-arrow-right::before {
+ right: 0 !important;
+}
+
+.tui-arrow-gray::before {
+ border-color: #666666 !important;
+}
+
+.tui-arrow-white::before {
+ border-color: #ffffff !important;
+}
+
+.tui-arrow-warning::before {
+ border-color: #ff7900 !important;
+}
+
+.tui-arrow-success::before {
+ border-color: #19be6b !important;
+}
+
+.tui-arrow-danger::before {
+ border-color: #eb0909 !important;
+}
+
+/*List end*/
+
+/*Card start*/
+.tui-card {
+ margin: 0 30rpx;
+ font-size: 28rpx;
+ background-color: #fff;
+ border-radius: 10rpx;
+ box-shadow: 0 0 10rpx #eee;
+ box-sizing: border-box;
+ overflow: hidden;
+}
+
+.tui-card-full {
+ margin: 0 !important;
+ border-radius: 0 !important;
+}
+
+.tui-card-full::after {
+ border-radius: 0 !important;
+}
+
+.tui-card-border {
+ position: relative;
+ box-shadow: none !important
+}
+
+.tui-card-border::after {
+ content: ' ';
+ position: absolute;
+ height: 200%;
+ width: 200%;
+ border: 1px solid #ddd;
+ transform-origin: 0 0;
+ -webkit-transform-origin: 0 0;
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ left: 0;
+ top: 0;
+ border-radius: 20rpx;
+ box-sizing: border-box;
+ pointer-events: none;
+}
+
+.tui-card-header {
+ width: 100%;
+ padding: 20rpx;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ position: relative;
+ box-sizing: border-box;
+ overflow: hidden;
+ border-top-left-radius: 10rpx;
+ border-top-right-radius: 10rpx;
+}
+
+.tui-card-header::after {
+ content: '';
+ position: absolute;
+ border-bottom: 1rpx solid #eaeef1;
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ bottom: 0;
+ right: 0;
+ left: 0;
+ pointer-events: none;
+}
+
+.tui-header-line::after {
+ border-bottom: 0 !important;
+}
+
+.tui-header-thumb {
+ height: 60rpx;
+ width: 60rpx;
+ vertical-align: middle;
+ margin-right: 20rpx;
+ border-radius: 6rpx;
+}
+
+.tui-thumb-circle {
+ border-radius: 50% !important;
+}
+
+.tui-header-title {
+ display: inline-block;
+ font-size: 30rpx;
+ color: #7a7a7a;
+ vertical-align: middle;
+ max-width: 460rpx;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.tui-header-right {
+ font-size: 24rpx;
+ color: #b2b2b2;
+}
+
+.tui-card-body {
+ font-size: 32rpx;
+ color: #262b3a;
+ box-sizing: border-box;
+}
+
+.tui-card-footer {
+ font-size: 28rpx;
+ color: #596d96;
+ border-bottom-left-radius: 10rpx;
+ border-bottom-right-radius: 10rpx;
+ box-sizing: border-box;
+}
+
+/*Card end*/
+
+/*Grid start*/
+.tui-grids {
+ width: 100%;
+ position: relative;
+ overflow: hidden;
+}
+
+.tui-grids::after {
+ content: " ";
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 1px;
+ border-top: 1px solid #eaeef1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+}
+
+.tui-border-top::after {
+ border-top: 0 !important;
+}
+
+.tui-grid {
+ position: relative;
+ padding: 40rpx 20rpx;
+ box-sizing: border-box;
+ background: #fff;
+ float: left;
+}
+
+.tui-grid-2 {
+ width: 50%;
+}
+
+.tui-grid-3 {
+ width: 33.333333333%;
+}
+
+.tui-grid-4 {
+ width: 25%;
+ padding: 30rpx 20rpx !important;
+}
+
+.tui-grid-5 {
+ width: 20%;
+ padding: 20rpx !important;
+}
+
+.tui-grid-2:nth-of-type(2n)::before {
+ width: 0;
+ border-right: 0;
+}
+
+.tui-grid-3:nth-of-type(3n)::before {
+ width: 0;
+ border-right: 0;
+}
+
+.tui-grid-4:nth-of-type(4n)::before {
+ width: 0;
+ border-right: 0;
+}
+
+.tui-grid-5:nth-of-type(5n)::before {
+ width: 0;
+ border-right: 0;
+}
+
+.tui-grid::before {
+ content: " ";
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 1px;
+ bottom: 0;
+ border-right: 1px solid #eaeef1;
+ -webkit-transform-origin: 100% 0;
+ transform-origin: 100% 0;
+ -webkit-transform: scaleX(0.5);
+ transform: scaleX(0.5);
+}
+
+.tui-grid::after {
+ content: " ";
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ height: 1px;
+ border-bottom: 1px solid #eaeef1;
+ -webkit-transform-origin: 0 100%;
+ transform-origin: 0 100%;
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+}
+
+.tui-grid-bottom::after {
+ height: 0 !important;
+ border-bottom: 0 !important
+}
+
+.tui-grid-bg {
+ position: relative;
+ padding: 0;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.tui-item-hover {
+ background-color: #f7f7f9 !important;
+}
+
+/*Grid end*/
+
+/*Loading start*/
+.tui-loading-init {
+ min-width: 200rpx;
+ min-height: 200rpx;
+ max-width: 500rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 9999;
+ font-size: 26rpx;
+ color: #fff;
+ background-color: rgba(0, 0, 0, 0.7);
+ border-radius: 10rpx;
+}
+
+.tui-loading-center {
+ width: 50rpx;
+ height: 50rpx;
+ border: 3px solid #fff;
+ border-radius: 50%;
+ margin: 0 6px;
+ display: inline-block;
+ vertical-align: middle;
+ clip-path: polygon(0% 0%, 100% 0%, 100% 40%, 0% 40%);
+ animation: rotate 1s linear infinite;
+ margin-bottom: 36rpx;
+}
+
+.tui-loadmore-tips {
+ text-align: center;
+ padding: 0 20rpx;
+ box-sizing: border-box;
+}
+
+@-webkit-keyframes rotate {
+ from {
+ transform: rotatez(0deg);
+ }
+
+ to {
+ transform: rotatez(360deg);
+ }
+}
+
+@keyframes rotate {
+ from {
+ transform: rotatez(0deg);
+ }
+
+ to {
+ transform: rotatez(360deg);
+ }
+}
+
+.tui-loadmore {
+ width: 48%;
+ margin: 1.5em auto;
+ line-height: 1.5em;
+ font-size: 24rpx;
+ text-align: center;
+}
+
+.tui-loading-1 {
+ margin: 0 5px;
+ width: 20px;
+ height: 20px;
+ display: inline-block;
+ vertical-align: middle;
+ -webkit-animation: a 1s steps(12) infinite;
+ animation: a 1s steps(12) infinite;
+ background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
+ background-size: 100%;
+}
+
+@-webkit-keyframes a {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ to {
+ -webkit-transform: rotate(1turn);
+ transform: rotate(1turn);
+ }
+}
+
+@keyframes a {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ to {
+ -webkit-transform: rotate(1turn);
+ transform: rotate(1turn);
+ }
+}
+
+.tui-loadmore-tips {
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.tui-loading-2 {
+ width: 28rpx;
+ height: 28rpx;
+ border: 1px solid #8f8d8e;
+ border-radius: 50%;
+ margin: 0 6px;
+ display: inline-block;
+ vertical-align: middle;
+ clip-path: polygon(0% 0%, 100% 0%, 100% 30%, 0% 30%);
+ animation: rotate 1s linear infinite;
+}
+
+@-webkit-keyframes rotate {
+ from {
+ transform: rotatez(0deg);
+ }
+
+ to {
+ transform: rotatez(360deg);
+ }
+}
+
+@keyframes rotate {
+ from {
+ transform: rotatez(0deg);
+ }
+
+ to {
+ transform: rotatez(360deg);
+ }
+}
+
+.tui-loading-3 {
+ display: inline-block;
+ margin: 0 6px;
+ vertical-align: middle;
+ width: 28rpx;
+ height: 28rpx;
+ background: 0 0;
+ border-radius: 50%;
+ border: 2px solid;
+ border-color: #e5e5e5 #e5e5e5 #e5e5e5 #8f8d8e;
+ animation: tui-rotate 0.7s linear infinite;
+}
+
+.tui-loading-3.tui-loading-primary {
+ border-color: #e5e5e5 #e5e5e5 #e5e5e5 #5677fc;
+}
+
+.tui-loading-3.tui-loading-green {
+ border-color: #e5e5e5 #e5e5e5 #e5e5e5 #19be6b;
+}
+
+.tui-loading-3.tui-loading-orange {
+ border-color: #e5e5e5 #e5e5e5 #e5e5e5 #ff7900;
+}
+
+.tui-loading-3.tui-loading-red {
+ border-color: #ededed #ededed #ededed #ed3f14;
+}
+
+@-webkit-keyframes tui-rotate {
+ 0% {
+ transform: rotate(0);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes tui-rotate {
+ 0% {
+ transform: rotate(0);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+.tui-loadmore-none {
+ width: 50%;
+ margin: 1.5em auto;
+ line-height: 1.5em;
+ font-size: 24rpx;
+ display: flex;
+ justify-content: center;
+}
+
+.tui-nomore {
+ width: 100%;
+ height: 100%;
+ position: relative;
+ display: flex;
+ justify-content: center;
+ margin-top: 10rpx;
+ padding-bottom: 6rpx;
+}
+
+.tui-nomore::before {
+ content: ' ';
+ position: absolute;
+ border-bottom: 1rpx solid #e5e5e5;
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ width: 100%;
+ top: 18rpx;
+ left: 0;
+}
+
+.tui-nomore-text {
+ color: #999;
+ font-size: 24rpx;
+ text-align: center;
+ padding: 0 18rpx;
+ height: 36rpx;
+ line-height: 36rpx;
+ position: relative;
+ z-index: 1;
+}
+
+.tui-nomore-dot {
+ position: relative;
+ text-align: center;
+ -webkit-display: flex;
+ display: flex;
+ -webkit-justify-content: center;
+ justify-content: center;
+ margin-top: 10rpx;
+ padding-bottom: 6rpx;
+}
+
+.tui-nomore-dot::before {
+ content: '';
+ position: absolute;
+ border-bottom: 1rpx solid #e5e5e5;
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ width: 360rpx;
+ top: 18rpx;
+}
+
+.tui-dot-text {
+ position: relative;
+ color: #e5e5e5;
+ font-size: 10px;
+ text-align: center;
+ width: 50rpx;
+ height: 36rpx;
+ line-height: 36rpx;
+ -webkit-transform: scale(0.8);
+ transform: scale(0.8);
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ z-index: 1;
+}
+
+/*Loading end*/
+
+/*Footer start*/
+.tui-footer {
+ width: 100%;
+ overflow: hidden;
+ padding: 30rpx 24rpx;
+ box-sizing: border-box;
+ font-size: 24rpx;
+ color: #A7A7A7;
+}
+
+.tui-fixed {
+ position: fixed;
+ z-index: 9999;
+ /* #ifdef H5 */
+ bottom: 0;
+ /* #endif */
+ /* #ifndef H5 */
+ bottom: env(safe-area-inset-bottom);
+ /* #endif */
+}
+
+.tui-footer-link {
+ color: #596d96;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 28rpx;
+}
+
+.tui-link {
+ position: relative;
+ padding: 0 18rpx;
+ line-height: 1;
+}
+
+.tui-link::before {
+ content: " ";
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 1px;
+ bottom: 0;
+ border-right: 1px solid #d3d3d3;
+ -webkit-transform-origin: 100% 0;
+ transform-origin: 100% 0;
+ -webkit-transform: scaleX(0.5);
+ transform: scaleX(0.5);
+}
+
+.tui-link:last-child::before {
+ border-right: 0 !important
+}
+
+.tui-link-hover {
+ opacity: 0.5
+}
+
+.tui-footer-copyright {
+ font-size: 24rpx;
+ color: #A7A7A7;
+ line-height: 1;
+ text-align: center;
+ padding-top: 16rpx
+}
+
+/*Footer end*/
+
+
+/*layout start*/
+
+/*形状*/
+.tui-triangle {
+ border: 16rpx solid;
+ width: 0;
+ height: 0;
+}
+
+.tui-triangle-left {
+ border-color: transparent #5c8dff transparent transparent;
+}
+
+.tui-triangle-right {
+ border-color: transparent transparent transparent #5c8dff;
+}
+
+.tui-triangle-top {
+ border-color: transparent transparent #5c8dff transparent;
+}
+
+.tui-triangle-bottom {
+ border-color: #5c8dff transparent transparent transparent;
+}
+
+
+.tui-parallelogram {
+ width: 100rpx;
+ height: 50rpx;
+ transform: skew(-10deg);
+ background: #19be6b;
+ margin-left: 10rpx;
+}
+
+.tui-crescent {
+ width: 60rpx;
+ height: 60rpx;
+ border-radius: 50%;
+ box-shadow: 12rpx 12rpx 0 0 yellowgreen;
+}
+
+/*聊天框*/
+.tui-chatbox {
+ max-width: 60%;
+ border-radius: 10rpx;
+ position: relative;
+ padding: 20rpx 26rpx;
+ font-size: 28rpx;
+ color: #fff;
+ /* word-break: break-all;
+ word-wrap: break-word; */
+}
+
+.tui-chatbox-left {
+ background: #5c8dff;
+ border: 1rpx solid #5c8dff;
+ display: inline-block;
+}
+
+.tui-chatbox-right {
+ background: #19be6b;
+ border: 1rpx solid #19be6b;
+}
+
+.tui-chatbox::before {
+ content: "";
+ position: absolute;
+ width: 0;
+ height: 0;
+ top: 20rpx;
+ border: 16rpx solid;
+}
+
+.tui-chatbox-left::before {
+ right: 100%;
+ border-color: transparent #5c8dff transparent transparent;
+}
+
+.tui-chatbox-right::before {
+ left: 100%;
+ border-color: transparent transparent transparent #19be6b;
+}
+
+/*checkbox 整体大小 */
+
+/* #ifdef MP-WEIXIN */
+.tui-checkbox .wx-checkbox-input {
+ width: 36rpx;
+ height: 36rpx;
+ border-radius: 50%;
+ margin: 0;
+}
+
+.tui-checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+ background: #F82400;
+ width: 40rpx;
+ height: 40rpx;
+ border: none;
+}
+
+/* #endif */
+
+/* #ifndef MP-WEIXIN */
+>>>.tui-checkbox .uni-checkbox-input {
+ width: 36rpx;
+ height: 36rpx;
+ border-radius: 50% !important;
+ margin: 0;
+ border-color: #d1d1d1 !important;
+}
+
+>>>.tui-checkbox .uni-checkbox-input.uni-checkbox-input-checked {
+ background: #F82400;
+ width: 40rpx;
+ height: 40rpx;
+ border: none;
+}
+
+/* #endif */
+
+/*textarea*/
+
+.tui-textarea-box {
+ border-radius: 4rpx;
+ height: 280rpx;
+ box-sizing: border-box;
+ padding: 20rpx 20rpx 0 20rpx;
+ position: relative;
+}
+
+.tui-textarea-box::after {
+ content: '';
+ position: absolute;
+ height: 200%;
+ width: 200%;
+ border: 1px solid #e6e6e6;
+ transform-origin: 0 0;
+ -webkit-transform-origin: 0 0;
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ left: 0;
+ top: 0;
+ border-radius: 8rpx;
+ pointer-events: none;
+}
+
+.tui-textarea {
+ height: 210rpx;
+ width: 100%;
+ color: #666;
+ font-size: 28rpx;
+ z-index: 2;
+}
+
+.tui-phcolor-color {
+ color: #ccc !important;
+}
+
+.tui-textarea-counter {
+ font-size: 24rpx;
+ color: #999;
+ text-align: right;
+ height: 40rpx;
+ line-height: 40rpx;
+ padding-top: 4rpx;
+}
+
+/*Input输入框*/
+.tui-input-item {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ font-size: 32rpx;
+
+}
+
+.tui-input {
+ flex: 1;
+ font-size: 32rpx;
+ overflow: visible;
+}
+
+.tui-input-title {
+ min-width: 140rpx;
+ padding-right: 12rpx;
+ flex-shrink: 0;
+}
+
+.tui-phcolor {
+ color: #ccc;
+ font-size: 32rpx;
+ overflow: visible;
+}
+
+.tui-input-border {
+ /* border: 1rpx solid #eaeef1; */
+ padding: 20rpx 30rpx;
+ border-radius: 4rpx;
+ position: relative;
+ font-size: 32rpx;
+}
+
+.tui-input-border::after {
+ content: '';
+ position: absolute;
+ height: 200%;
+ width: 200%;
+ border: 1px solid #e6e6e6;
+ transform-origin: 0 0;
+ -webkit-transform-origin: 0 0;
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ left: 0;
+ top: 0;
+ border-radius: 8rpx;
+ pointer-events: none;
+}
+
+.tui-text-right {
+ text-align: right;
+}
+
+/*上传*/
+.tui-upload-box {
+ width: 100%;
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.tui-upload-item {
+ width: 220rpx;
+ height: 220rpx;
+ position: relative;
+ margin-right: 20rpx;
+ margin-bottom: 20rpx;
+}
+
+.tui-upload-item:nth-of-type(3n) {
+ margin-right: 0;
+}
+
+.tui-upload-img {
+ width: 220rpx;
+ height: 220rpx;
+ display: block;
+}
+
+.tui-upload-del {
+ position: absolute;
+ right: -18rpx;
+ top: -18rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.tui-upload-add {
+ width: 220rpx;
+ height: 220rpx;
+ font-size: 68rpx;
+ font-weight: 100;
+ color: #888;
+ background-color: #F7F7F7;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0;
+}
+
+/* 操作条*/
+.tui-operation {
+ width: 100%;
+ height: 100rpx;
+ box-sizing: border-box;
+ overflow: hidden;
+ background: rgba(255, 255, 255, 0.9);
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.tui-operation::before {
+ content: '';
+ position: absolute;
+ top: 0px;
+ right: 0;
+ left: 0;
+ border-top: 1rpx solid #eaeef1;
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+}
+
+.tui-operation-left {
+ display: flex;
+ align-items: center;
+}
+
+.tui-operation-item {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ position: relative;
+}
+
+.tui-operation-text {
+ font-size: 22rpx;
+ color: #333;
+}
+
+.tui-operation-right {
+ flex: 1;
+ height: 100rpx;
+ box-sizing: border-box;
+ padding-top: 0;
+}
+
+.tui-relative {
+ position: relative;
+}
+
+.tui-btn-comment {
+ height: 64rpx;
+ width: 84%;
+ background: #ededed;
+ color: #999;
+ border-radius: 8rpx;
+ font-size: 28rpx;
+ display: flex;
+ align-items: center;
+ padding-left: 20rpx;
+ box-sizing: border-box;
+ padding-top: 0;
+ margin-left: 30rpx;
+}
+
+.tui-chat-operation {
+ background: #F6F6F6 !important;
+ padding-right: 18rpx;
+ box-sizing: border-box;
+}
+
+.tui-input-box {
+ width: 78%;
+ justify-content: flex-start;
+}
+
+.tui-chat-input {
+ background: #fff;
+ height: 72rpx;
+ border-radius: 6rpx;
+ padding-left: 20rpx;
+ padding-right: 20rpx;
+ flex: 1;
+}
+
+.tui-voice-icon {
+ margin-left: 20rpx;
+ margin-right: 20rpx
+}
+
+/*layout end*/
diff --git a/static/style/thorui.min.css b/static/style/thorui.min.css
new file mode 100644
index 0000000..d29bca7
--- /dev/null
+++ b/static/style/thorui.min.css
@@ -0,0 +1,5 @@
+/*!
+ * =====================================================
+ * Thor UI v1.5.0 (https://www.thorui.cn/)
+ * =====================================================
+ */@font-face{font-family:thoruiFont;src:url(~@/static/fonts/thorui.ttf) format('truetype');font-weight:400;font-style:normal}.tui-mask{width:100%;height:100%;position:fixed;top:0;left:0;background:rgba(0,0,0,.4);z-index:999}.tui-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.tui-ellipsis-2{display:-webkit-box;overflow:hidden;white-space:normal!important;text-overflow:ellipsis;word-wrap:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical}.tui-opcity{opacity:.5}.tui-scale-small{transform:scale(.9);transform-origin:center center}.tui-height-full{height:100%}.tui-width-full{width:100%}.tui-ptop-zero{padding-top:0}.tui-pbottom-zero{padding-bottom:0}.tui-pleft-zero{padding-left:0}.tui-pright-zero{padding-right:0}.tui-color-primary{color:#5677fc}.tui-color-success{color:#19be6b}.tui-color-warning{color:#ff7900}.tui-color-error{color:#eb0909}.tui-color-blue{color:#007aff}.tui-color-blue{color:#007aff}.tui-color-white{color:#fff}.tui-color-pink{color:#f74d54}.tui-primary{background-color:#5677fc!important;color:#fff}.tui-light-primary{background-color:#5c8dff!important;color:#fff}.tui-dark-primary{background-color:#4a67d6!important;color:#fff}.tui-dLight-primary{background-color:#4e77d9!important;color:#fff}.tui-danger{background-color:#ed3f14!important;color:#fff}.tui-warning{background-color:#ff7900!important;color:#fff}.tui-blue{background-color:#007aff!important;color:#fff}.tui-green{background-color:#19be6b!important;color:#fff}.tui-black{background-color:#000!important;color:#fff}.tui-white{background-color:#fff!important;color:#333!important}.tui-translucent{background-color:rgba(0,0,0,.7)}.tui-light-black{background-color:#333!important}.tui-gray{background-color:#80848f}.tui-phcolor-gray{background-color:#ccc!important}.tui-divider-gray{background-color:#eaeef1!important}.tui-btn-gray{background-color:#ededed!important;color:#999!important}.tui-hover-gray{background-color:#f7f7f9!important}.tui-bg-gray{background-color:#fafafa!important}.tui-light-blue{background-color:#ecf6fd;color:#4dabeb!important}.tui-light-brownish{background-color:#fcebef;color:#8a5966!important}.tui-light-orange{background-color:#fef5eb;color:#faa851!important}.tui-light-green{background-color:#e8f6e8;color:#44cf85!important}.tui-flex{display:-webkit-flex;display:flex}.tui-flex-1{flex:1}.tui-align-center{justify-content:center}.tui-align-left{justify-content:flex-start!important}.tui-align-right{justify-content:flex-end!important}.tui-align-between{justify-content:space-between!important}.tui-align-around{justify-content:space-around!important}.tui-vertical-center{align-items:center}.tui-vertical-top{align-items:flex-start}.tui-vertical-top{align-items:flex-end}.tui-center{display:flex;align-items:center;justify-content:center}.tui-line-feed{flex-direction:row;flex-wrap:wrap}.tui-col-12{width:100%}.tui-col-11{width:91.66666667%}.tui-col-10{width:83.33333333%}.tui-col-9{width:75%}.tui-col-8{width:66.66666667%}.tui-col-7{width:58.33333333%}.tui-col-6{width:50%}.tui-col-5{width:41.66666667%}.tui-col-4{width:33.33333333%}.tui-col-3{width:25%}.tui-col-2{width:16.66666667%}.tui-col-1{width:8.33333333%}.tui-icon{font-family:thoruiFont!important;font-style:normal;-webkit-font-smoothing:antialiased;text-align:center;text-decoration:none;font-size:32px;color:#999}.tui-icon-about:before{content:'\e772'}.tui-icon-about-fill:before{content:'\e771'}.tui-icon-add:before{content:'\e770'}.tui-icon-add-fill:before{content:'\e76f'}.tui-icon-addmessage:before{content:'\e76e'}.tui-icon-addressbook:before{content:'\e76d'}.tui-icon-agree:before{content:'\e76c'}.tui-icon-agree-fill:before{content:'\e76b'}.tui-icon-alarm:before{content:'\e76a'}.tui-icon-alarm-fill:before{content:'\e769'}.tui-icon-alipay:before{content:'\e768'}.tui-icon-android:before{content:'\e767'}.tui-icon-applets:before{content:'\e766'}.tui-icon-arrowdown:before{content:'\e765'}.tui-icon-arrowleft:before{content:'\e764'}.tui-icon-arrowright:before{content:'\e763'}.tui-icon-arrowup:before{content:'\e762'}.tui-icon-attestation:before{content:'\e761'}.tui-icon-back:before{content:'\e760'}.tui-icon-bag:before{content:'\e75f'}.tui-icon-bag-fill:before{content:'\e75e'}.tui-icon-balloon:before{content:'\e75d'}.tui-icon-bankcard:before{content:'\e75c'}.tui-icon-bankcard-fill:before{content:'\e75b'}.tui-icon-bottom:before{content:'\e75a'}.tui-icon-calendar:before{content:'\e759'}.tui-icon-camera:before{content:'\e758'}.tui-icon-camera-fill:before{content:'\e757'}.tui-icon-camera-add:before{content:'\e756'}.tui-icon-card:before{content:'\e755'}.tui-icon-card-fill:before{content:'\e754'}.tui-icon-cart:before{content:'\e753'}.tui-icon-cart-fill:before{content:'\e752'}.tui-icon-category:before{content:'\e751'}.tui-icon-category-fill:before{content:'\e750'}.tui-icon-check:before{content:'\e74f'}.tui-icon-circle:before{content:'\e74e'}.tui-icon-circle-fill:before{content:'\e74d'}.tui-icon-circle-selected:before{content:'\e74c'}.tui-icon-clock:before{content:'\e74b'}.tui-icon-clock-fill:before{content:'\e74a'}.tui-icon-close:before{content:'\e749'}.tui-icon-close-fill:before{content:'\e748'}.tui-icon-community:before{content:'\e747'}.tui-icon-community-fill:before{content:'\e746'}.tui-icon-computer:before{content:'\e745'}.tui-icon-computer-fill:before{content:'\e744'}.tui-icon-coupon:before{content:'\e743'}.tui-icon-delete:before{content:'\e742'}.tui-icon-deletekey:before{content:'\e741'}.tui-icon-dingtalk:before{content:'\e740'}.tui-icon-dissatisfied:before{content:'\e73f'}.tui-icon-down:before{content:'\e73e'}.tui-icon-download:before{content:'\e73d'}.tui-icon-edit:before{content:'\e73c'}.tui-icon-ellipsis:before{content:'\e73b'}.tui-icon-enlarge:before{content:'\e73a'}.tui-icon-evaluate:before{content:'\e739'}.tui-icon-exchange:before{content:'\e738'}.tui-icon-explain:before{content:'\e737'}.tui-icon-explain-fill:before{content:'\e736'}.tui-icon-explore:before{content:'\e735'}.tui-icon-explore-fill:before{content:'\e734'}.tui-icon-eye:before{content:'\e733'}.tui-icon-feedback:before{content:'\e732'}.tui-icon-fingerprint:before{content:'\e730'}.tui-icon-friendadd:before{content:'\e72f'}.tui-icon-friendadd-fill:before{content:'\e72e'}.tui-icon-gps:before{content:'\e72d'}.tui-icon-histogram:before{content:'\e72c'}.tui-icon-home:before{content:'\e72b'}.tui-icon-home-fill:before{content:'\e72a'}.tui-icon-house:before{content:'\e729'}.tui-icon-imface:before{content:'\e728'}.tui-icon-imkeyboard:before{content:'\e727'}.tui-icon-immore:before{content:'\e726'}.tui-icon-imvoice:before{content:'\e725'}.tui-icon-ios:before{content:'\e724'}.tui-icon-kefu:before{content:'\e723'}.tui-icon-label:before{content:'\e722'}.tui-icon-label-fill:before{content:'\e721'}.tui-icon-like:before{content:'\e720'}.tui-icon-like-fill:before{content:'\e71f'}.tui-icon-link:before{content:'\e71e'}.tui-icon-listview:before{content:'\e71d'}.tui-icon-loading:before{content:'\e71c'}.tui-icon-location:before{content:'\e71b'}.tui-icon-mail:before{content:'\e71a'}.tui-icon-mail-fill:before{content:'\e719'}.tui-icon-manage:before{content:'\e718'}.tui-icon-manage-fill:before{content:'\e717'}.tui-icon-member:before{content:'\e716'}.tui-icon-member-fill:before{content:'\e715'}.tui-icon-message:before{content:'\e714'}.tui-icon-message-fill:before{content:'\e713'}.tui-icon-mobile:before{content:'\e712'}.tui-icon-moments:before{content:'\e711'}.tui-icon-more:before{content:'\e710'}.tui-icon-more-fill:before{content:'\e70f'}.tui-icon-narrow:before{content:'\e70e'}.tui-icon-news:before{content:'\e70d'}.tui-icon-news-fill:before{content:'\e70c'}.tui-icon-nodata:before{content:'\e70b'}.tui-icon-notice:before{content:'\e699'}.tui-icon-notice-fill:before{content:'\e698'}.tui-icon-offline:before{content:'\e697'}.tui-icon-offline-fill:before{content:'\e696'}.tui-icon-oppose:before{content:'\e695'}.tui-icon-oppose-fill:before{content:'\e694'}.tui-icon-order:before{content:'\e693'}.tui-icon-partake:before{content:'\e692'}.tui-icon-people:before{content:'\e691'}.tui-icon-people-fill:before{content:'\e690'}.tui-icon-pic:before{content:'\e68f'}.tui-icon-pic-fill:before{content:'\e68e'}.tui-icon-picture:before{content:'\e68d'}.tui-icon-pie:before{content:'\e68c'}.tui-icon-play:before{content:'\e68b'}.tui-icon-plus:before{content:'\e689'}.tui-icon-polygonal:before{content:'\e688'}.tui-icon-position:before{content:'\e687'}.tui-icon-position-fill:before{content:'\e686'}.tui-icon-pwd:before{content:'\e685'}.tui-icon-qq:before{content:'\e684'}.tui-icon-qrcode:before{content:'\e682'}.tui-icon-redpacket:before{content:'\e681'}.tui-icon-redpacket-fill:before{content:'\e680'}.tui-icon-reduce:before{content:'\e67f'}.tui-icon-refresh:before{content:'\e67e'}.tui-icon-revoke:before{content:'\e67d'}.tui-icon-satisfied:before{content:'\e67c'}.tui-icon-screen:before{content:'\e67b'}.tui-icon-search:before{content:'\e67a'}.tui-icon-search-2:before{content:'\e679'}.tui-icon-send:before{content:'\e678'}.tui-icon-service:before{content:'\e677'}.tui-icon-service-fill:before{content:'\e676'}.tui-icon-setup:before{content:'\e675'}.tui-icon-setup-fill:before{content:'\e674'}.tui-icon-share:before{content:'\e673'}.tui-icon-share-fill:before{content:'\e672'}.tui-icon-shield:before{content:'\e671'}.tui-icon-shop:before{content:'\e670'}.tui-icon-shop-fill:before{content:'\e66f'}.tui-icon-shut:before{content:'\e66e'}.tui-icon-signin:before{content:'\e66d'}.tui-icon-sina:before{content:'\e66c'}.tui-icon-skin:before{content:'\e66b'}.tui-icon-soso:before{content:'\e669'}.tui-icon-square:before{content:'\e668'}.tui-icon-square-fill:before{content:'\e667'}.tui-icon-square-selected:before{content:'\e666'}.tui-icon-star:before{content:'\e665'}.tui-icon-star-fill:before{content:'\e664'}.tui-icon-strategy:before{content:'\e663'}.tui-icon-sweep:before{content:'\e662'}.tui-icon-time:before{content:'\e661'}.tui-icon-time-fill:before{content:'\e660'}.tui-icon-todown:before{content:'\e65f'}.tui-icon-toleft:before{content:'\e65e'}.tui-icon-tool:before{content:'\e65d'}.tui-icon-top:before{content:'\e65c'}.tui-icon-toright:before{content:'\e65b'}.tui-icon-towardsleft:before{content:'\e65a'}.tui-icon-towardsright:before{content:'\e659'}.tui-icon-towardsright-fill:before{content:'\e658'}.tui-icon-transport:before{content:'\e657'}.tui-icon-transport-fill:before{content:'\e656'}.tui-icon-turningdown:before{content:'\e654'}.tui-icon-turningleft:before{content:'\e653'}.tui-icon-turningright:before{content:'\e652'}.tui-icon-turningup:before{content:'\e651'}.tui-icon-unreceive:before{content:'\e650'}.tui-icon-unseen:before{content:'\e64f'}.tui-icon-up:before{content:'\e64e'}.tui-icon-upload:before{content:'\e64c'}.tui-icon-video:before{content:'\e64b'}.tui-icon-voice:before{content:'\e649'}.tui-icon-voice-fill:before{content:'\e648'}.tui-icon-voipphone:before{content:'\e647'}.tui-icon-wallet:before{content:'\e646'}.tui-icon-warning:before{content:'\e645'}.tui-icon-wealth:before{content:'\e644'}.tui-icon-wealth-fill:before{content:'\e643'}.tui-icon-weather:before{content:'\e642'}.tui-icon-wechat:before{content:'\e641'}.tui-icon-wifi:before{content:'\e640'}.tui-btn-primary{background:#5677fc!important;color:#fff}.tui-shadow-primary{box-shadow:0 10rpx 14rpx 0 rgba(86,119,252,.2)}.tui-btn-danger{background:#eb0909!important;color:#fff}.tui-shadow-danger{box-shadow:0 10rpx 14rpx 0 rgba(235,9,9,.2)}.tui-btn-warning{background:#fc872d!important;color:#fff}.tui-shadow-warning{box-shadow:0 10rpx 14rpx 0 rgba(252,135,45,.2)}.tui-btn-green{background:#35b06a!important;color:#fff}.tui-shadow-green{box-shadow:0 10rpx 14rpx 0 rgba(53,176,106,.2)}.tui-btn-blue{background:#007aff!important;color:#fff}.tui-shadow-blue{box-shadow:0 10rpx 14rpx 0 rgba(0,122,255,.2)}.tui-btn-white{background:#fff!important;color:#333!important}.tui-btn-gray{background:#bfbfbf!important;color:#fff!important}.tui-btn-black{background:#333!important;color:#fff!important}.tui-shadow-gray{box-shadow:0 10rpx 14rpx 0 rgba(191,191,191,.2)}.tui-hover-gray{background:#f7f7f9!important}.tui-black-hover{background:#555!important;color:#e5e5e5!important}.tui-btn{width:100%;height:96rpx;line-height:96rpx;font-size:32rpx;position:relative;border:0!important;border-radius:6rpx;padding-left:0;padding-right:0;overflow:visible}.tui-btn-base{width:auto;min-width:200rpx;font-size:30rpx;height:70rpx;line-height:70rpx}.tui-btn-small{width:auto;min-width:140rpx;font-size:30rpx;height:60rpx;line-height:60rpx}.tui-btn::after{content:'';position:absolute;width:200%;height:200%;transform-origin:0 0;transform:scale(.5,.5) translateZ(0);box-sizing:border-box;left:0;top:0;border-radius:12rpx;border:0}.tui-btn-white::after{border:1rpx solid #bfbfbf}.tui-white-hover{background:#e5e5e5!important;color:#2e2e2e!important}.tui-dark-disabled{opacity:.6!important;color:#fafbfc!important}.tui-dark-disabled-outline{opacity:.5!important}.tui-gray-disabled{background:#f3f3f3!important;color:#919191!important;box-shadow:none}.tui-outline-hover{opacity:.5}.tui-primary-hover{background:#4a67d6!important;color:#e5e5e5!important}.tui-primary-outline::after{border:1rpx solid #5677fc!important}.tui-primary-outline{color:#5677fc!important;background:0 0}.tui-danger-hover{background:#c80808!important;color:#e5e5e5!important}.tui-danger-outline{color:#eb0909!important;background:0 0}.tui-danger-outline::after{border:1rpx solid #eb0909!important}.tui-warning-hover{background:#d67326!important;color:#e5e5e5!important}.tui-warning-outline{color:#fc872d!important;background:0 0}.tui-warning-outline::after{border:1px solid #fc872d!important}.tui-green-hover{background:#2d965a!important;color:#e5e5e5!important}.tui-green-outline{color:#35b06a!important;background:0 0}.tui-green-outline::after{border:1rpx solid #35b06a!important}.tui-blue-hover{background:#0062cc!important;color:#e5e5e5!important}.tui-blue-outline{color:#007aff!important;background:0 0}.tui-blue-outline::after{border:1rpx solid #007aff!important}.tui-btn-gradual{background:linear-gradient(90deg,#ff5926,#f00e2c)!important;color:#fff!important}.tui-shadow-gradual{box-shadow:0 10rpx 14rpx 0 rgba(235,9,9,.15)}.tui-gray-hover{background:#a3a3a3!important;color:#898989}.tui-gradual-hover{background:linear-gradient(90deg,#d74620,#cd1225)!important;color:#fff!important}.tui-gray-outline{color:#999!important;background:0 0!important}.tui-white-outline{color:#fff!important;background:0 0!important}.tui-black-outline{background:0 0!important;color:#333!important}.tui-gray-outline::after{border:1rpx solid #ccc!important}.tui-white-outline::after{border:1px solid #fff!important}.tui-black-outline::after{border:1px solid #333!important}.tui-fillet{border-radius:50rpx}.tui-btn-white.tui-fillet::after{border-radius:98rpx}.tui-outline-fillet::after{border-radius:98rpx}.tui-rightAngle{border-radius:0}.tui-btn-white.tui-rightAngle::after{border-radius:0}.tui-outline-rightAngle::after{border-radius:0}.tui-tag{padding:16rpx 26rpx;font-size:28rpx;display:flex;align-items:center;justify-content:center;border-radius:6rpx}.tui-tag-outline{position:relative;background-color:none;color:#5677fc}.tui-tag-outline::after{content:'';position:absolute;width:200%;height:200%;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scale(.5,.5);transform:scale(.5,.5);-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;border-radius:12rpx}.tui-tag-fillet{border-radius:50rpx}.tui-white.tui-tag-fillet::after{border-radius:80rpx}.tui-tag-outline-fillet::after{border-radius:80rpx}.tui-tag-fillet-left{border-radius:50rpx 0 0 50rpx}.tui-tag-fillet-right{border-radius:0 50rpx 50rpx 0}.tui-tag-fillet-left.tui-tag-outline::after{border-radius:100rpx 0 0 100rpx}.tui-tag-fillet-right.tui-tag-outline::after{border-radius:0 100rpx 100rpx 0}.tui-badge-dot{height:16rpx;width:16rpx;border-radius:50%}.tui-badge{font-size:24rpx;height:36rpx;min-width:12rpx;padding:0 12rpx;border-radius:36rpx;display:flex;align-items:center;justify-content:center;z-index:10}.tui-badge-scale{transform-origin:center center}.tui-list-cell{position:relative;width:100%;padding:26rpx 30rpx;background-color:#fff;box-sizing:border-box}.tui-list-radius{border-radius:6rpx;overflow:hidden}.tui-cell-hover{background-color:#f1f1f1!important}.tui-list-cell::after{content:'';position:absolute;border-bottom:1rpx solid #eaeef1;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);transform-origin:0 100%;bottom:0;right:0;left:0}.tui-line-left::after{left:30rpx!important}.tui-line-right::after{right:30rpx!important}.tui-cell-unlined::after{border-bottom:0!important}.tui-cell-arrow::before{content:' ';height:10px;width:10px;border-width:2px 2px 0 0;border-color:silver;border-style:solid;-webkit-transform:matrix(.5,.5,-.5,.5,0,0);transform:matrix(.5,.5,-.5,.5,0,0);position:absolute;top:50%;margin-top:-6px;right:30rpx}.tui-arrow-right::before{right:0!important}.tui-arrow-gray::before{border-color:#666!important}.tui-arrow-white::before{border-color:#fff!important}.tui-arrow-warning::before{border-color:#ff7900!important}.tui-arrow-success::before{border-color:#19be6b!important}.tui-arrow-danger::before{border-color:#eb0909!important}.tui-card{margin:0 30rpx;font-size:28rpx;background-color:#fff;border-radius:10rpx;box-shadow:0 0 10rpx #eee;box-sizing:border-box;overflow:hidden}.tui-card-full{margin:0!important;border-radius:0!important}.tui-card-full::after{border-radius:0!important}.tui-card-border{position:relative;box-shadow:none!important}.tui-card-border::after{content:' ';position:absolute;height:200%;width:200%;border:1px solid #ddd;transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform:scale(.5);transform:scale(.5);left:0;top:0;border-radius:20rpx;box-sizing:border-box;pointer-events:none}.tui-card-header{width:100%;padding:20rpx;display:flex;align-items:center;justify-content:space-between;position:relative;box-sizing:border-box;overflow:hidden;border-top-left-radius:10rpx;border-top-right-radius:10rpx}.tui-card-header::after{content:'';position:absolute;border-bottom:1rpx solid #eaeef1;-webkit-transform:scaleY(.5);transform:scaleY(.5);bottom:0;right:0;left:0;pointer-events:none}.tui-header-line::after{border-bottom:0!important}.tui-header-thumb{height:60rpx;width:60rpx;vertical-align:middle;margin-right:20rpx;border-radius:6rpx}.tui-thumb-circle{border-radius:50%!important}.tui-header-title{display:inline-block;font-size:30rpx;color:#7a7a7a;vertical-align:middle;max-width:460rpx;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.tui-header-right{font-size:24rpx;color:#b2b2b2}.tui-card-body{font-size:32rpx;color:#262b3a;box-sizing:border-box}.tui-card-footer{font-size:28rpx;color:#596d96;border-bottom-left-radius:10rpx;border-bottom-right-radius:10rpx;box-sizing:border-box}.tui-grids{width:100%;position:relative;overflow:hidden}.tui-grids::after{content:" ";position:absolute;left:0;top:0;width:100%;height:1px;border-top:1px solid #eaeef1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.tui-border-top::after{border-top:0!important}.tui-grid{position:relative;padding:40rpx 20rpx;box-sizing:border-box;background:#fff;float:left}.tui-grid-2{width:50%}.tui-grid-3{width:33.333333333%}.tui-grid-4{width:25%;padding:30rpx 20rpx!important}.tui-grid-5{width:20%;padding:20rpx!important}.tui-grid-2:nth-of-type(2n)::before{width:0;border-right:0}.tui-grid-3:nth-of-type(3n)::before{width:0;border-right:0}.tui-grid-4:nth-of-type(4n)::before{width:0;border-right:0}.tui-grid-5:nth-of-type(5n)::before{width:0;border-right:0}.tui-grid::before{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid #eaeef1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.tui-grid::after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #eaeef1;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.tui-grid-bottom::after{height:0!important;border-bottom:0!important}.tui-grid-bg{position:relative;padding:0;width:100%;box-sizing:border-box}.tui-item-hover{background-color:#f7f7f9!important}.tui-loading-init{min-width:200rpx;min-height:200rpx;max-width:500rpx;display:flex;align-items:center;justify-content:center;flex-direction:column;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:9999;font-size:26rpx;color:#fff;background-color:rgba(0,0,0,.7);border-radius:10rpx}.tui-loading-center{width:50rpx;height:50rpx;border:3px solid #fff;border-radius:50%;margin:0 6px;display:inline-block;vertical-align:middle;clip-path:polygon(0 0,100% 0,100% 40%,0 40%);animation:rotate 1s linear infinite;margin-bottom:36rpx}.tui-loadmore-tips{text-align:center;padding:0 20rpx;box-sizing:border-box}@-webkit-keyframes rotate{from{transform:rotatez(0)}to{transform:rotatez(360deg)}}@keyframes rotate{from{transform:rotatez(0)}to{transform:rotatez(360deg)}}.tui-loadmore{width:48%;margin:1.5em auto;line-height:1.5em;font-size:24rpx;text-align:center}.tui-loading-1{margin:0 5px;width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:a 1s steps(12) infinite;animation:a 1s steps(12) infinite;background:transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;background-size:100%}@-webkit-keyframes a{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.tui-loadmore-tips{display:inline-block;vertical-align:middle}.tui-loading-2{width:28rpx;height:28rpx;border:1px solid #8f8d8e;border-radius:50%;margin:0 6px;display:inline-block;vertical-align:middle;clip-path:polygon(0 0,100% 0,100% 30%,0 30%);animation:rotate 1s linear infinite}@-webkit-keyframes rotate{from{transform:rotatez(0)}to{transform:rotatez(360deg)}}@keyframes rotate{from{transform:rotatez(0)}to{transform:rotatez(360deg)}}.tui-loading-3{display:inline-block;margin:0 6px;vertical-align:middle;width:28rpx;height:28rpx;background:0 0;border-radius:50%;border:2px solid;border-color:#e5e5e5 #e5e5e5 #e5e5e5 #8f8d8e;animation:tui-rotate .7s linear infinite}.tui-loading-3.tui-loading-primary{border-color:#e5e5e5 #e5e5e5 #e5e5e5 #5677fc}.tui-loading-3.tui-loading-green{border-color:#e5e5e5 #e5e5e5 #e5e5e5 #19be6b}.tui-loading-3.tui-loading-orange{border-color:#e5e5e5 #e5e5e5 #e5e5e5 #ff7900}.tui-loading-3.tui-loading-red{border-color:#ededed #ededed #ededed #ed3f14}@-webkit-keyframes tui-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes tui-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.tui-loadmore-none{width:50%;margin:1.5em auto;line-height:1.5em;font-size:24rpx;display:flex;justify-content:center}.tui-nomore{width:100%;height:100%;position:relative;display:flex;justify-content:center;margin-top:10rpx;padding-bottom:6rpx}.tui-nomore::before{content:' ';position:absolute;border-bottom:1rpx solid #e5e5e5;-webkit-transform:scaleY(.5);transform:scaleY(.5);width:100%;top:18rpx;left:0}.tui-nomore-text{color:#999;font-size:24rpx;text-align:center;padding:0 18rpx;height:36rpx;line-height:36rpx;position:relative;z-index:1}.tui-nomore-dot{position:relative;text-align:center;-webkit-display:flex;display:flex;-webkit-justify-content:center;justify-content:center;margin-top:10rpx;padding-bottom:6rpx}.tui-nomore-dot::before{content:'';position:absolute;border-bottom:1rpx solid #e5e5e5;-webkit-transform:scaleY(.5);transform:scaleY(.5);width:360rpx;top:18rpx}.tui-dot-text{position:relative;color:#e5e5e5;font-size:10px;text-align:center;width:50rpx;height:36rpx;line-height:36rpx;-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:center center;transform-origin:center center;z-index:1}.tui-footer{width:100%;overflow:hidden;padding:30rpx 24rpx;box-sizing:border-box;font-size:24rpx;color:#a7a7a7}.tui-fixed{position:fixed;z-index:9999;bottom:0;bottom:env(safe-area-inset-bottom)}.tui-footer-link{color:#596d96;display:flex;align-items:center;justify-content:center;font-size:28rpx}.tui-link{position:relative;padding:0 18rpx;line-height:1}.tui-link::before{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid #d3d3d3;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.tui-link:last-child::before{border-right:0!important}.tui-link-hover{opacity:.5}.tui-footer-copyright{font-size:24rpx;color:#a7a7a7;line-height:1;text-align:center;padding-top:16rpx}.tui-triangle{border:16rpx solid;width:0;height:0}.tui-triangle-left{border-color:transparent #5c8dff transparent transparent}.tui-triangle-right{border-color:transparent transparent transparent #5c8dff}.tui-triangle-top{border-color:transparent transparent #5c8dff transparent}.tui-triangle-bottom{border-color:#5c8dff transparent transparent transparent}.tui-parallelogram{width:100rpx;height:50rpx;transform:skew(-10deg);background:#19be6b;margin-left:10rpx}.tui-crescent{width:60rpx;height:60rpx;border-radius:50%;box-shadow:12rpx 12rpx 0 0 #9acd32}.tui-chatbox{max-width:60%;border-radius:10rpx;position:relative;padding:20rpx 26rpx;font-size:28rpx;color:#fff}.tui-chatbox-left{background:#5c8dff;border:1rpx solid #5c8dff;display:inline-block}.tui-chatbox-right{background:#19be6b;border:1rpx solid #19be6b}.tui-chatbox::before{content:"";position:absolute;width:0;height:0;top:20rpx;border:16rpx solid}.tui-chatbox-left::before{right:100%;border-color:transparent #5c8dff transparent transparent}.tui-chatbox-right::before{left:100%;border-color:transparent transparent transparent #19be6b}.tui-checkbox .wx-checkbox-input{width:36rpx;height:36rpx;border-radius:50%;margin:0}.tui-checkbox .wx-checkbox-input.wx-checkbox-input-checked{background:#f82400;width:40rpx;height:40rpx;border:none}.tui-textarea-box{border-radius:4rpx;height:280rpx;box-sizing:border-box;padding:20rpx 20rpx 0 20rpx;position:relative}.tui-textarea-box::after{content:'';position:absolute;height:200%;width:200%;border:1px solid #e6e6e6;transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform:scale(.5);transform:scale(.5);left:0;top:0;border-radius:8rpx;pointer-events:none}.tui-textarea{height:210rpx;width:100%;color:#666;font-size:28rpx;z-index:2}.tui-phcolor-color{color:#ccc!important}.tui-textarea-counter{font-size:24rpx;color:#999;text-align:right;height:40rpx;line-height:40rpx;padding-top:4rpx}.tui-input-item{width:100%;display:flex;align-items:center;font-size:32rpx}.tui-input{flex:1;font-size:32rpx;overflow:visible}.tui-input-title{min-width:140rpx;padding-right:12rpx;flex-shrink:0}.tui-phcolor{color:#ccc;font-size:32rpx;overflow:visible}.tui-input-border{padding:20rpx 30rpx;border-radius:4rpx;position:relative;font-size:32rpx}.tui-input-border::after{content:'';position:absolute;height:200%;width:200%;border:1px solid #e6e6e6;transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform:scale(.5);transform:scale(.5);left:0;top:0;border-radius:8rpx;pointer-events:none}.tui-text-right{text-align:right}.tui-upload-box{width:100%;display:flex;flex-wrap:wrap}.tui-upload-item{width:220rpx;height:220rpx;position:relative;margin-right:20rpx;margin-bottom:20rpx}.tui-upload-item:nth-of-type(3n){margin-right:0}.tui-upload-img{width:220rpx;height:220rpx;display:block}.tui-upload-del{position:absolute;right:-18rpx;top:-18rpx;display:flex;align-items:center;justify-content:center}.tui-upload-add{width:220rpx;height:220rpx;font-size:68rpx;font-weight:100;color:#888;background-color:#f7f7f7;display:flex;align-items:center;justify-content:center;padding:0}.tui-operation{width:100%;height:100rpx;box-sizing:border-box;overflow:hidden;background:rgba(255,255,255,.9);position:relative;display:flex;align-items:center;justify-content:space-between}.tui-operation::before{content:'';position:absolute;top:0;right:0;left:0;border-top:1rpx solid #eaeef1;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.tui-operation-left{display:flex;align-items:center}.tui-operation-item{flex:1;display:flex;align-items:center;justify-content:center;flex-direction:column;position:relative}.tui-operation-text{font-size:22rpx;color:#333}.tui-operation-right{flex:1;height:100rpx;box-sizing:border-box;padding-top:0}.tui-relative{position:relative}.tui-btn-comment{height:64rpx;width:84%;background:#ededed;color:#999;border-radius:8rpx;font-size:28rpx;display:flex;align-items:center;padding-left:20rpx;box-sizing:border-box;padding-top:0;margin-left:30rpx}.tui-chat-operation{background:#f6f6f6!important;padding-right:18rpx;box-sizing:border-box}.tui-input-box{width:78%;justify-content:flex-start}.tui-chat-input{background:#fff;height:72rpx;border-radius:6rpx;padding-left:20rpx;padding-right:20rpx;flex:1}.tui-voice-icon{margin-left:20rpx;margin-right:20rpx}
\ No newline at end of file
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..a05adb4
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,76 @@
+/**
+ * 这里是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-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/uni_modules/qiun-data-charts/changelog.md b/uni_modules/qiun-data-charts/changelog.md
new file mode 100644
index 0000000..4829f18
--- /dev/null
+++ b/uni_modules/qiun-data-charts/changelog.md
@@ -0,0 +1,246 @@
+## 2.4.3-20220505(2022-05-05)
+- 秋云图表组件 修复开启canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug
+- 秋云图表组件 修复升级hbx最新版后ECharts的highlight方法报错的bug
+- uCharts.js 雷达图新增参数opts.extra.radar.gridEval,数据点位网格抽希,默认1
+- uCharts.js 雷达图新增参数opts.extra.radar.axisLabel, 是否显示刻度点值,默认false
+- uCharts.js 雷达图新增参数opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc
+- uCharts.js 雷达图新增参数opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变
+- uCharts.js 雷达图新增参数opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"]
+- uCharts.js 雷达图优化支持series.textColor、series.textSize属性
+- uCharts.js 柱状图中温度计式图标,优化支持全圆角类型,修复边框有缝隙的bug,详见官网【演示】中的温度计图表
+- uCharts.js 柱状图新增参数opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位
+- uCharts.js 混合图增加opts.extra.mix.area.gradient 区域图是否开启渐变色
+- uCharts.js 混合图增加opts.extra.mix.area.opacity 区域图透明度,默认0.2
+- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图
+- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图
+- uCharts.js 增加opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法
+- uCharts.js 优化X轴、Y轴formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){}
+- uCharts.js 修复横屏模式下无法使用双指缩放方法的bug
+- uCharts.js 修复当只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug
+- 【官网模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2)
+
+## 注意:非unimodules 版本如因更新 hbx 至 3.4.7 导致报错如下,请到码云更新非 unimodules 版本组件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6)
+> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0"
+## 2.4.2-20220421(2022-04-21)
+- 秋云图表组件 修复HBX升级3.4.6.20220420版本后echarts报错的问题
+## 2.4.2-20220420(2022-04-20)
+## 重要!此版本uCharts新增了很多功能,修复了诸多已知问题
+- 秋云图表组件 新增onzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图
+- 秋云图表组件 新增optsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘
+- 秋云图表组件 修复开启canvas2d功能后,动态更新数据后画布闪动的bug
+- 秋云图表组件 去除directory属性,改为自动获取echarts.min.js路径(升级不受影响)
+- 秋云图表组件 增加getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。
+- 秋云图表组件 支付宝、字节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。
+- 秋云图表组件 新增加【非uniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。
+- uCharts.js 新增dobuleZoom双指缩放功能
+- uCharts.js 新增山峰图type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示
+- uCharts.js 修复折线图当数据中存在null时tooltip报错的bug
+- uCharts.js 修复饼图类当画布比较小时自动计算的半径是负数报错的bug
+- uCharts.js 统一各图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用
+- uCharts.js 标记线功能增加labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY
+- uCharts.js 修复条状图当数值很小时开启圆角后样式错误的bug
+- uCharts.js 修复X轴开启disabled后,X轴仍占用空间的bug
+- uCharts.js 修复X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug
+- uCharts.js 增加X轴rotateAngle文字旋转自定义角度,取值范围(-90至90)
+- uCharts.js 修复地图文字标签层级显示不正确的bug
+- uCharts.js 修复饼图、圆环图、玫瑰图当数据全部为0的时候不显示数据标签的bug
+- uCharts.js 修复当opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug
+
+## 另外我们还开发了各大原生小程序组件,已发布至码云和npm
+[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts)
+[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun)
+
+## 对于原生uCharts文档我们已上线新版官方网站,详情点击下面链接进入官网
+[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/)
+## 2.3.7-20220122(2022-01-22)
+## 重要!使用vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本
+- uCharts.js 修复uni-app平台组件模式使用vue3编译到小程序报错的bug。
+## 2.3.7-20220118(2022-01-18)
+## 注意,使用vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder!
+## 2.3.67-20220118(2022-01-18)
+- 秋云图表组件 组件初步支持vue3,全端编译会有些问题,具体详见下面修改:
+1. 小程序端运行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。
+2. 小程序端发行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。
+3. 如果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; 这样变更后,H5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端)
+## 2.3.6-20220111(2022-01-11)
+- 秋云图表组件 修改组件 props 属性中的 background 默认值为 rgba(0,0,0,0)
+## 2.3.6-20211201(2021-12-01)
+- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug
+## 2.3.5-20211014(2021-10-15)
+- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新)
+## 2.3.4-20211012(2021-10-12)
+- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug
+## 2.3.3-20210706(2021-07-06)
+- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示
+## 2.3.2-20210627(2021-06-27)
+- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug
+## 2.3.1-20210616(2021-06-16)
+- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug
+## 2.3.0-20210612(2021-06-12)
+- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts)
+- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件
+- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数
+- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法
+## 2.2.1-20210603(2021-06-03)
+- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug
+- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置
+## 2.2.0-20210529(2021-05-29)
+- uCharts.js 增加条状图type="bar"
+- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo
+## 2.1.7-20210524(2021-05-24)
+- uCharts.js 修复大数据量模式下曲线图不平滑的bug
+## 2.1.6-20210523(2021-05-23)
+- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug
+## 2.1.5-2021051702(2021-05-17)
+- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug
+## 2.1.5-20210517(2021-05-17)
+- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug
+## 2.1.4-20210516(2021-05-16)
+- 秋云图表组件 优化onWindowResize防抖方法
+- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug
+- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug
+- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表
+## 2.1.3-20210513(2021-05-13)
+- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点
+- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ
+- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug
+- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法
+- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false
+- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug
+- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug
+- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug
+- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index
+- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo
+- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo
+## 2.1.2-20210509(2021-05-09)
+秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug
+## 2.1.1-20210509(2021-05-09)
+- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。
+- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。
+- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。
+## 2.1.0-20210507(2021-05-07)
+- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug
+- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug
+- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug
+## 2.1.0-20210506(2021-05-06)
+- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug
+- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug
+- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid")
+- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例
+- uCharts.js 升级至v2.1.0版本
+- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug
+- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug
+- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug
+- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug
+- uCharts.js 修复 词云图获取点击索引偶尔不准的bug
+- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter)
+- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid")
+- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble")
+- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。
+## 2.0.0-20210502(2021-05-02)
+- uCharts.js 修复词云图获取点击索引不正确的bug
+## 2.0.0-20210501(2021-05-01)
+- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug
+## 2.0.0-20210426(2021-04-26)
+- 秋云图表组件 修复QQ小程序不支持canvas2d的bug
+- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug
+- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距
+- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移
+- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移
+- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px
+## 2.0.0-20210422-2(2021-04-22)
+秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug
+## 2.0.0-20210422(2021-04-22)
+- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug
+## 2.0.0-20210421(2021-04-21)
+- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug
+## 2.0.0-20210420(2021-04-20)
+- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug
+- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件
+## 2.0.0-20210419(2021-04-19)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍!
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug
+- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug
+## 2.0.0-20210418(2021-04-18)
+- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug
+## 2.0.0-20210416(2021-04-16)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍!
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug
+## 2.0.0-20210415(2021-04-15)
+- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug
+- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug
+## 2.0.0-20210414(2021-04-14)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍!
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug
+- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue)
+- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor
+- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug
+## 2.0.0-20210413(2021-04-13)
+- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug
+- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug
+- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件
+- uCharts.js 修复饼图类数据格式series属性不生效的bug
+- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue
+## 2.0.0-20210412-2(2021-04-12)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug
+- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例
+## 2.0.0-20210412(2021-04-12)
+- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化
+- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug
+## 2.0.0-20210411(2021-04-11)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册组件,请重启HBuilderX,并清空小程序开发者工具缓存。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue
+- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug
+- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug
+## 2.0.0-20210410(2021-04-10)
+- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug
+- 增加标记线及柱状图自定义颜色的demo
+## 2.0.0-20210409(2021-04-08)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug
+- 修复组件在支付宝小程序端点击位置不准确的bug
+## 2.0.0-20210408(2021-04-07)
+- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复)
+- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug
+## 2.0.0-20210407(2021-04-06)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode`
+## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651)
+## 2.0.0-20210406(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
+## 2.0.0(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
diff --git a/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue b/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
new file mode 100644
index 0000000..d3a2e6f
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
@@ -0,0 +1,1607 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue b/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
new file mode 100644
index 0000000..b15b19f
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
@@ -0,0 +1,46 @@
+
+
+
+ {{errorMessage==null?'请点击重试':errorMessage}}
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue b/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue
new file mode 100644
index 0000000..b701394
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue
@@ -0,0 +1,162 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue b/uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue
new file mode 100644
index 0000000..7541b31
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue b/uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue
new file mode 100644
index 0000000..8e14db3
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue b/uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue
new file mode 100644
index 0000000..77c55b7
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue b/uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue
new file mode 100644
index 0000000..cb93a55
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue b/uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue
new file mode 100644
index 0000000..7789060
--- /dev/null
+++ b/uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js b/uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js
new file mode 100644
index 0000000..7b8168f
--- /dev/null
+++ b/uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js
@@ -0,0 +1,422 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * 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
+ *
+ */
+
+// 通用配置项
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
+
+const cfe = {
+ //demotype为自定义图表类型
+ "type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"],
+ //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
+ "categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"],
+ //instance为实例变量承载属性,option为eopts承载属性,不要删除
+ "instance": {},
+ "option": {},
+ //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+ "formatter":{
+ "tooltipDemo1":function(res){
+ let result = ''
+ for (let i in res) {
+ if (i == 0) {
+ result += res[i].axisValueLabel + '年销售额'
+ }
+ let value = '--'
+ if (res[i].data !== null) {
+ value = res[i].data
+ }
+ // #ifdef H5
+ result += '\n' + res[i].seriesName + ':' + value + ' 万元'
+ // #endif
+
+ // #ifdef APP-PLUS
+ result += '
' + res[i].marker + res[i].seriesName + ':' + value + ' 万元'
+ // #endif
+ }
+ return result;
+ },
+ legendFormat:function(name){
+ return "自定义图例+"+name;
+ },
+ yAxisFormatDemo:function (value, index) {
+ return value + '元';
+ },
+ seriesFormatDemo:function(res){
+ return res.name + '年' + res.value + '元';
+ }
+ },
+ //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
+ "demotype":{
+ "color": color,
+ //在这里填写echarts的option即可
+
+ },
+ //下面是自定义配置,请添加项目所需的通用配置
+ "column": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'axis'
+ },
+ "grid": {
+ "top": 30,
+ "bottom": 50,
+ "right": 15,
+ "left": 40
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "toolbox": {
+ "show": false,
+ },
+ "xAxis": {
+ "type": 'category',
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ "boundaryGap": true,
+ "data": []
+ },
+ "yAxis": {
+ "type": 'value',
+ "axisTick": {
+ "show": false,
+ },
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'bar',
+ "data": [],
+ "barwidth": 20,
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "line": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'axis'
+ },
+ "grid": {
+ "top": 30,
+ "bottom": 50,
+ "right": 15,
+ "left": 40
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "toolbox": {
+ "show": false,
+ },
+ "xAxis": {
+ "type": 'category',
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ "boundaryGap": true,
+ "data": []
+ },
+ "yAxis": {
+ "type": 'value',
+ "axisTick": {
+ "show": false,
+ },
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'line',
+ "data": [],
+ "barwidth": 20,
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "area": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'axis'
+ },
+ "grid": {
+ "top": 30,
+ "bottom": 50,
+ "right": 15,
+ "left": 40
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "toolbox": {
+ "show": false,
+ },
+ "xAxis": {
+ "type": 'category',
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ "boundaryGap": true,
+ "data": []
+ },
+ "yAxis": {
+ "type": 'value',
+ "axisTick": {
+ "show": false,
+ },
+ "axisLabel": {
+ "color": '#666666'
+ },
+ "axisLine": {
+ "lineStyle": {
+ "color": '#CCCCCC'
+ }
+ },
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'line',
+ "data": [],
+ "areaStyle": {},
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "pie": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item'
+ },
+ "grid": {
+ "top": 40,
+ "bottom": 30,
+ "right": 15,
+ "left": 15
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'pie',
+ "data": [],
+ "radius": '50%',
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ },
+ },
+ "ring": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item'
+ },
+ "grid": {
+ "top": 40,
+ "bottom": 30,
+ "right": 15,
+ "left": 15
+ },
+ "legend": {
+ "bottom": 'left',
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'pie',
+ "data": [],
+ "radius": ['40%', '70%'],
+ "avoidLabelOverlap": false,
+ "label": {
+ "show": true,
+ "color": "#666666",
+ "position": 'top',
+ },
+ "labelLine": {
+ "show": true
+ },
+ },
+ },
+ "rose": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item'
+ },
+ "legend": {
+ "top": 'bottom'
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'pie',
+ "data": [],
+ "radius": "55%",
+ "center": ['50%', '50%'],
+ "roseType": 'area',
+ },
+ },
+ "funnel": {
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "tooltip": {
+ "trigger": 'item',
+ "formatter": "{b} : {c}%"
+ },
+ "legend": {
+ "top": 'bottom'
+ },
+ "seriesTemplate": {
+ "name": '',
+ "type": 'funnel',
+ "left": '10%',
+ "top": 60,
+ "bottom": 60,
+ "width": '80%',
+ "min": 0,
+ "max": 100,
+ "minSize": '0%',
+ "maxSize": '100%',
+ "sort": 'descending',
+ "gap": 2,
+ "label": {
+ "show": true,
+ "position": 'inside'
+ },
+ "labelLine": {
+ "length": 10,
+ "lineStyle": {
+ "width": 1,
+ "type": 'solid'
+ }
+ },
+ "itemStyle": {
+ "bordercolor": '#fff',
+ "borderwidth": 1
+ },
+ "emphasis": {
+ "label": {
+ "fontSize": 20
+ }
+ },
+ "data": [],
+ },
+ },
+ "gauge": {
+ "color": color,
+ "tooltip": {
+ "formatter": '{a}
{b} : {c}%'
+ },
+ "seriesTemplate": {
+ "name": '业务指标',
+ "type": 'gauge',
+ "detail": {"formatter": '{value}%'},
+ "data": [{"value": 50, "name": '完成率'}]
+ },
+ },
+ "candle": {
+ "xAxis": {
+ "data": []
+ },
+ "yAxis": {},
+ "color": color,
+ "title": {
+ "text": ''
+ },
+ "dataZoom": [{
+ "type": 'inside',
+ "xAxisIndex": [0, 1],
+ "start": 10,
+ "end": 100
+ },
+ {
+ "show": true,
+ "xAxisIndex": [0, 1],
+ "type": 'slider',
+ "bottom": 10,
+ "start": 10,
+ "end": 100
+ }
+ ],
+ "seriesTemplate": {
+ "name": '',
+ "type": 'k',
+ "data": [],
+ },
+ }
+}
+
+export default cfe;
\ No newline at end of file
diff --git a/uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js b/uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js
new file mode 100644
index 0000000..5447a0a
--- /dev/null
+++ b/uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js
@@ -0,0 +1,601 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * 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
+ *
+ */
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
+
+//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
+const formatDateTime = (timeStamp, returnType)=>{
+ var date = new Date();
+ date.setTime(timeStamp * 1000);
+ var y = date.getFullYear();
+ var m = date.getMonth() + 1;
+ m = m < 10 ? ('0' + m) : m;
+ var d = date.getDate();
+ d = d < 10 ? ('0' + d) : d;
+ var h = date.getHours();
+ h = h < 10 ? ('0' + h) : h;
+ var minute = date.getMinutes();
+ var second = date.getSeconds();
+ minute = minute < 10 ? ('0' + minute) : minute;
+ second = second < 10 ? ('0' + second) : second;
+ if(returnType == 'full'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;}
+ if(returnType == 'y-m-d'){return y + '-' + m + '-' + d;}
+ if(returnType == 'h:m'){return h +':' + minute;}
+ if(returnType == 'h:m:s'){return h +':' + minute +':' + second;}
+ return [y, m, d, h, minute, second];
+}
+
+const cfu = {
+ //demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
+ "type":["pie","ring","rose","word","funnel","map","arcbar","line","column","mount","bar","area","radar","gauge","candle","mix","tline","tarea","scatter","bubble","demotype"],
+ "range":["饼状图","圆环图","玫瑰图","词云图","漏斗图","地图","圆弧进度条","折线图","柱状图","山峰图","条状图","区域图","雷达图","仪表盘","K线图","混合图","时间轴折线","时间轴区域","散点图","气泡图","自定义类型"],
+ //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
+ //自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
+ "categories":["line","column","mount","bar","area","radar","gauge","candle","mix","demotype"],
+ //instance为实例变量承载属性,不要删除
+ "instance":{},
+ //option为opts及eopts承载属性,不要删除
+ "option":{},
+ //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+ "formatter":{
+ "yAxisDemo1":function(val, index, opts){return val+'元'},
+ "yAxisDemo2":function(val, index, opts){return val.toFixed(2)},
+ "xAxisDemo1":function(val, index, opts){return val+'年';},
+ "xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')},
+ "seriesDemo1":function(val, index, series, opts){return val+'元'},
+ "tooltipDemo1":function(item, category, index, opts){
+ if(index==0){
+ return '随便用'+item.data+'年'
+ }else{
+ return '其他我没改'+item.data+'天'
+ }
+ },
+ "pieDemo":function(val, index, series, opts){
+ if(index !== undefined){
+ return series[index].name+':'+series[index].data+'元'
+ }
+ },
+ },
+ //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
+ "demotype":{
+ //我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
+ "type": "line",
+ "color": color,
+ "padding": [15,10,0,15],
+ "xAxis": {
+ "disableGrid": true,
+ },
+ "yAxis": {
+ "gridType": "dash",
+ "dashLength": 2,
+ },
+ "legend": {
+ },
+ "extra": {
+ "line": {
+ "type": "curve",
+ "width": 2
+ },
+ }
+ },
+ //下面是自定义配置,请添加项目所需的通用配置
+ "pie":{
+ "type": "pie",
+ "color": color,
+ "padding": [5,5,5,5],
+ "extra": {
+ "pie": {
+ "activeOpacity": 0.5,
+ "activeRadius": 10,
+ "offsetAngle": 0,
+ "labelWidth": 15,
+ "border": true,
+ "borderWidth": 3,
+ "borderColor": "#FFFFFF"
+ },
+ }
+ },
+ "ring":{
+ "type": "ring",
+ "color": color,
+ "padding": [5,5,5,5],
+ "rotate": false,
+ "dataLabel": true,
+ "legend": {
+ "show": true,
+ "position": "right",
+ "lineHeight": 25,
+ },
+ "title": {
+ "name": "收益率",
+ "fontSize": 15,
+ "color": "#666666"
+ },
+ "subtitle": {
+ "name": "70%",
+ "fontSize": 25,
+ "color": "#7cb5ec"
+ },
+ "extra": {
+ "ring": {
+ "ringWidth":30,
+ "activeOpacity": 0.5,
+ "activeRadius": 10,
+ "offsetAngle": 0,
+ "labelWidth": 15,
+ "border": true,
+ "borderWidth": 3,
+ "borderColor": "#FFFFFF"
+ },
+ },
+ },
+ "rose":{
+ "type": "rose",
+ "color": color,
+ "padding": [5,5,5,5],
+ "legend": {
+ "show": true,
+ "position": "left",
+ "lineHeight": 25,
+ },
+ "extra": {
+ "rose": {
+ "type": "area",
+ "minRadius": 50,
+ "activeOpacity": 0.5,
+ "activeRadius": 10,
+ "offsetAngle": 0,
+ "labelWidth": 15,
+ "border": false,
+ "borderWidth": 2,
+ "borderColor": "#FFFFFF"
+ },
+ }
+ },
+ "word":{
+ "type": "word",
+ "color": color,
+ "extra": {
+ "word": {
+ "type": "normal",
+ "autoColors": false
+ }
+ }
+ },
+ "funnel":{
+ "type": "funnel",
+ "color": color,
+ "padding": [15,15,0,15],
+ "extra": {
+ "funnel": {
+ "activeOpacity": 0.3,
+ "activeWidth": 10,
+ "border": true,
+ "borderWidth": 2,
+ "borderColor": "#FFFFFF",
+ "fillOpacity": 1,
+ "labelAlign": "right"
+ },
+ }
+ },
+ "map":{
+ "type": "map",
+ "color": color,
+ "padding": [0,0,0,0],
+ "dataLabel": true,
+ "extra": {
+ "map": {
+ "border": true,
+ "borderWidth": 1,
+ "borderColor": "#666666",
+ "fillOpacity": 0.6,
+ "activeBorderColor": "#F04864",
+ "activeFillColor": "#FACC14",
+ "activeFillOpacity": 1
+ },
+ }
+ },
+ "arcbar":{
+ "type": "arcbar",
+ "color": color,
+ "title": {
+ "name": "百分比",
+ "fontSize": 25,
+ "color": "#00FF00"
+ },
+ "subtitle": {
+ "name": "默认标题",
+ "fontSize": 15,
+ "color": "#666666"
+ },
+ "extra": {
+ "arcbar": {
+ "type": "default",
+ "width": 12,
+ "backgroundColor": "#E9E9E9",
+ "startAngle": 0.75,
+ "endAngle": 0.25,
+ "gap": 2
+ }
+ }
+ },
+ "line":{
+ "type": "line",
+ "color": color,
+ "padding": [15,10,0,15],
+ "xAxis": {
+ "disableGrid": true,
+ },
+ "yAxis": {
+ "gridType": "dash",
+ "dashLength": 2,
+ },
+ "legend": {
+ },
+ "extra": {
+ "line": {
+ "type": "straight",
+ "width": 2
+ },
+ }
+ },
+ "tline":{
+ "type": "line",
+ "color": color,
+ "padding": [15,10,0,15],
+ "xAxis": {
+ "disableGrid": false,
+ "boundaryGap":"justify",
+ },
+ "yAxis": {
+ "gridType": "dash",
+ "dashLength": 2,
+ "data":[
+ {
+ "min":0,
+ "max":80
+ }
+ ]
+ },
+ "legend": {
+ },
+ "extra": {
+ "line": {
+ "type": "curve",
+ "width": 2
+ },
+ }
+ },
+ "tarea":{
+ "type": "area",
+ "color": color,
+ "padding": [15,10,0,15],
+ "xAxis": {
+ "disableGrid": true,
+ "boundaryGap":"justify",
+ },
+ "yAxis": {
+ "gridType": "dash",
+ "dashLength": 2,
+ "data":[
+ {
+ "min":0,
+ "max":80
+ }
+ ]
+ },
+ "legend": {
+ },
+ "extra": {
+ "area": {
+ "type": "curve",
+ "opacity": 0.2,
+ "addLine": true,
+ "width": 2,
+ "gradient": true
+ },
+ }
+ },
+ "column":{
+ "type": "column",
+ "color": color,
+ "padding": [15,15,0,5],
+ "xAxis": {
+ "disableGrid": true,
+ },
+ "yAxis": {
+ "data":[{"min":0}]
+ },
+ "legend": {
+ },
+ "extra": {
+ "column": {
+ "type": "group",
+ "width": 30,
+ "activeBgColor": "#000000",
+ "activeBgOpacity": 0.08
+ },
+ }
+ },
+ "mount":{
+ "type": "mount",
+ "color": color,
+ "padding": [15,15,0,5],
+ "xAxis": {
+ "disableGrid": true,
+ },
+ "yAxis": {
+ "data":[{"min":0}]
+ },
+ "legend": {
+ },
+ "extra": {
+ "mount": {
+ "type": "mount",
+ "widthRatio": 1.5,
+ },
+ }
+ },
+ "bar":{
+ "type": "bar",
+ "color": color,
+ "padding": [15,30,0,5],
+ "xAxis": {
+ "boundaryGap":"justify",
+ "disableGrid":false,
+ "min":0,
+ "axisLine":false
+ },
+ "yAxis": {
+ },
+ "legend": {
+ },
+ "extra": {
+ "bar": {
+ "type": "group",
+ "width": 30,
+ "meterBorde": 1,
+ "meterFillColor": "#FFFFFF",
+ "activeBgColor": "#000000",
+ "activeBgOpacity": 0.08
+ },
+ }
+ },
+ "area":{
+ "type": "area",
+ "color": color,
+ "padding": [15,15,0,15],
+ "xAxis": {
+ "disableGrid": true,
+ },
+ "yAxis": {
+ "gridType": "dash",
+ "dashLength": 2,
+ },
+ "legend": {
+ },
+ "extra": {
+ "area": {
+ "type": "straight",
+ "opacity": 0.2,
+ "addLine": true,
+ "width": 2,
+ "gradient": false
+ },
+ }
+ },
+ "radar":{
+ "type": "radar",
+ "color": color,
+ "padding": [5,5,5,5],
+ "dataLabel": false,
+ "legend": {
+ "show": true,
+ "position": "right",
+ "lineHeight": 25,
+ },
+ "extra": {
+ "radar": {
+ "gridType": "radar",
+ "gridColor": "#CCCCCC",
+ "gridCount": 3,
+ "opacity": 0.2,
+ "max": 200
+ },
+ }
+ },
+ "gauge":{
+ "type": "gauge",
+ "color": color,
+ "title": {
+ "name": "66Km/H",
+ "fontSize": 25,
+ "color": "#2fc25b",
+ "offsetY": 50
+ },
+ "subtitle": {
+ "name": "实时速度",
+ "fontSize": 15,
+ "color": "#1890ff",
+ "offsetY": -50
+ },
+ "extra": {
+ "gauge": {
+ "type": "default",
+ "width": 30,
+ "labelColor": "#666666",
+ "startAngle": 0.75,
+ "endAngle": 0.25,
+ "startNumber": 0,
+ "endNumber": 100,
+ "labelFormat": "",
+ "splitLine": {
+ "fixRadius": 0,
+ "splitNumber": 10,
+ "width": 30,
+ "color": "#FFFFFF",
+ "childNumber": 5,
+ "childWidth": 12
+ },
+ "pointer": {
+ "width": 24,
+ "color": "auto"
+ }
+ }
+ }
+ },
+ "candle":{
+ "type": "candle",
+ "color": color,
+ "padding": [15,15,0,15],
+ "enableScroll": true,
+ "enableMarkLine": true,
+ "dataLabel": false,
+ "xAxis": {
+ "labelCount": 4,
+ "itemCount": 40,
+ "disableGrid": true,
+ "gridColor": "#CCCCCC",
+ "gridType": "solid",
+ "dashLength": 4,
+ "scrollShow": true,
+ "scrollAlign": "left",
+ "scrollColor": "#A6A6A6",
+ "scrollBackgroundColor": "#EFEBEF"
+ },
+ "yAxis": {
+ },
+ "legend": {
+ },
+ "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"]
+ }
+ },
+ "markLine": {
+ "type": "dash",
+ "dashLength": 5,
+ "data": [
+ {
+ "value": 2150,
+ "lineColor": "#f04864",
+ "showLabel": true
+ },
+ {
+ "value": 2350,
+ "lineColor": "#f04864",
+ "showLabel": true
+ }
+ ]
+ }
+ }
+ },
+ "mix":{
+ "type": "mix",
+ "color": color,
+ "padding": [15,15,0,15],
+ "xAxis": {
+ "disableGrid": true,
+ },
+ "yAxis": {
+ "disabled": false,
+ "disableGrid": false,
+ "splitNumber": 5,
+ "gridType": "dash",
+ "dashLength": 4,
+ "gridColor": "#CCCCCC",
+ "padding": 10,
+ "showTitle": true,
+ "data": []
+ },
+ "legend": {
+ },
+ "extra": {
+ "mix": {
+ "column": {
+ "width": 20
+ }
+ },
+ }
+ },
+ "scatter":{
+ "type": "scatter",
+ "color":color,
+ "padding":[15,15,0,15],
+ "dataLabel":false,
+ "xAxis": {
+ "disableGrid": false,
+ "gridType":"dash",
+ "splitNumber":5,
+ "boundaryGap":"justify",
+ "min":0
+ },
+ "yAxis": {
+ "disableGrid": false,
+ "gridType":"dash",
+ },
+ "legend": {
+ },
+ "extra": {
+ "scatter": {
+ },
+ }
+ },
+ "bubble":{
+ "type": "bubble",
+ "color":color,
+ "padding":[15,15,0,15],
+ "xAxis": {
+ "disableGrid": false,
+ "gridType":"dash",
+ "splitNumber":5,
+ "boundaryGap":"justify",
+ "min":0,
+ "max":250
+ },
+ "yAxis": {
+ "disableGrid": false,
+ "gridType":"dash",
+ "data":[{
+ "min":0,
+ "max":150
+ }]
+ },
+ "legend": {
+ },
+ "extra": {
+ "bubble": {
+ "border":2,
+ "opacity": 0.5,
+ },
+ }
+ }
+}
+
+export default cfu;
\ No newline at end of file
diff --git a/uni_modules/qiun-data-charts/js_sdk/u-charts/readme.md b/uni_modules/qiun-data-charts/js_sdk/u-charts/readme.md
new file mode 100644
index 0000000..d307ba3
--- /dev/null
+++ b/uni_modules/qiun-data-charts/js_sdk/u-charts/readme.md
@@ -0,0 +1,5 @@
+# uCharts JSSDK说明
+1、如不使用uCharts组件,可直接引用u-charts.js,打包编译后会`自动压缩`,压缩后体积约为`120kb`。
+2、如果120kb的体积仍需压缩,请手到uCharts官网通过在线定制选择您需要的图表。
+3、config-ucharts.js为uCharts组件的用户配置文件,升级前请`自行备份config-ucharts.js`文件,以免被强制覆盖。
+4、config-echarts.js为ECharts组件的用户配置文件,升级前请`自行备份config-echarts.js`文件,以免被强制覆盖。
\ No newline at end of file
diff --git a/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js b/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
new file mode 100644
index 0000000..cfeeea1
--- /dev/null
+++ b/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
@@ -0,0 +1,7297 @@
+/*
+ * uCharts (R)
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360/快手)、Vue、Taro等支持canvas的框架平台
+ * Copyright (C) 2018-2022 QIUN (R) 秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ *
+ * uCharts (R) 官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+
+'use strict';
+
+var config = {
+ version: 'v2.4.3-20220505',
+ yAxisWidth: 15,
+ xAxisHeight: 22,
+ xAxisTextPadding: 3,
+ padding: [10, 10, 10, 10],
+ pixelRatio: 1,
+ rotate: false,
+ fontSize: 13,
+ fontColor: '#666666',
+ dataPointShape: ['circle', 'circle', 'circle', 'circle'],
+ color: ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'],
+ linearColor: ['#0EE2F8', '#2BDCA8', '#FA7D8D', '#EB88E2', '#2AE3A0', '#0EE2F8', '#EB88E2', '#6773E3', '#F78A85'],
+ pieChartLinePadding: 15,
+ pieChartTextPadding: 5,
+ titleFontSize: 20,
+ subtitleFontSize: 15,
+ toolTipPadding: 3,
+ toolTipBackground: '#000000',
+ toolTipOpacity: 0.7,
+ toolTipLineHeight: 20,
+ radarLabelTextMargin: 13,
+};
+
+var assign = function(target, ...varArgs) {
+ if (target == null) {
+ throw new TypeError('[uCharts] 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] series数据需为Number格式');
+ }
+ 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') {
+ if (num == num + 1) { //修复数据值过大num++无效的bug by 向日葵 @xrk_jy
+ break;
+ }
+ 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);
+ if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
+ if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+ dataChartWidth += (opts.extra.mount.widthRatio - 1)*chartData.eachSpacing;
+ }
+ var validDistance = distance;
+ if (distance >= 0) {
+ validDistance = 0;
+ self.uevent.trigger('scrollLeft');
+ self.scrollOption.position = 'left'
+ opts.xAxis.scrollPosition = 'left';
+ } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) {
+ validDistance = dataChartAreaWidth - dataChartWidth;
+ self.uevent.trigger('scrollRight');
+ self.scrollOption.position = 'right'
+ opts.xAxis.scrollPosition = 'right';
+ } else {
+ self.scrollOption.position = distance
+ opts.xAxis.scrollPosition = distance;
+ }
+ 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 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 fixPieSeries(series, opts, config){
+ let pieSeriesArr = [];
+ if(series.length>0 && series[0].data.constructor.toString().indexOf('Array') > -1){
+ opts._pieSeries_ = series;
+ let oldseries = series[0].data;
+ for (var i = 0; i < oldseries.length; i++) {
+ oldseries[i].formatter = series[0].formatter;
+ oldseries[i].data = oldseries[i].value;
+ pieSeriesArr.push(oldseries[i]);
+ }
+ opts.series = pieSeriesArr;
+ }else{
+ pieSeriesArr = series;
+ }
+ return pieSeriesArr;
+}
+
+function fillSeries(series, opts, config) {
+ var index = 0;
+ for (var i = 0; i < series.length; i++) {
+ let item = series[i];
+ if (!item.color) {
+ item.color = config.color[index];
+ index = (index + 1) % config.color.length;
+ }
+ if (!item.linearIndex) {
+ item.linearIndex = i;
+ }
+ 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':
+ case 'bar':
+ item.legendShape = "rect";
+ break;
+ case 'area':
+ case 'mount':
+ item.legendShape = "triangle";
+ break;
+ default:
+ item.legendShape = "circle";
+ }
+ }
+ }
+ return series;
+}
+
+function fillCustomColor(linearType, customColor, series, config) {
+ var newcolor = customColor || [];
+ if (linearType == 'custom' && newcolor.length == 0 ) {
+ newcolor = config.linearColor;
+ }
+ if (linearType == 'custom' && newcolor.length < series.length) {
+ let chazhi = series.length - newcolor.length;
+ for (var i = 0; i < chazhi; i++) {
+ newcolor.push(config.linearColor[(i + 1) % config.linearColor.length]);
+ }
+ }
+ return newcolor;
+}
+
+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, fontSize, context) {
+ var width = 0;
+ text = String(text);
+ // #ifdef MP-ALIPAY || MP-BAIDU || APP-NVUE
+ context = false;
+ // #endif
+ if (context !== false && context !== undefined && context.setFontSize && context.measureText) {
+ context.setFontSize(fontSize);
+ return context.measureText(text).width;
+ } else {
+ var text = text.split('');
+ 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 (/:/.test(item)) {
+ width += 2.5;
+ } 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.pix;
+ x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pix / 2) * (opts.pix - 1)) * opts.pix;
+ } else {
+ x = touches.clientX * opts.pix;
+ y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pix / 2) * (opts.pix - 1)) * opts.pix;
+ }
+ } else {
+ if (opts.rotate) {
+ y = opts.height - touches.x * opts.pix;
+ x = touches.y * opts.pix;
+ } else {
+ x = touches.x * opts.pix;
+ y = touches.y * opts.pix;
+ }
+ }
+ return {
+ x: x,
+ y: y
+ }
+}
+
+function getSeriesDataItem(series, index, group) {
+ var data = [];
+ var newSeries = [];
+ var indexIsArr = index.constructor.toString().indexOf('Array') > -1;
+ if(indexIsArr){
+ let tempSeries = filterSeries(series);
+ for (var i = 0; i < group.length; i++) {
+ newSeries.push(tempSeries[group[i]]);
+ }
+ }else{
+ newSeries = series;
+ };
+ for (let i = 0; i < newSeries.length; i++) {
+ let item = newSeries[i];
+ let tmpindex = -1;
+ if(indexIsArr){
+ tmpindex = index[i];
+ }else{
+ tmpindex = index;
+ }
+ if (item.data[tmpindex] !== null && typeof item.data[tmpindex] !== '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.formatter ? item.formatter(item.data[tmpindex]) : item.data[tmpindex];
+ data.push(seriesItem);
+ }
+ }
+ return data;
+}
+
+function getMaxTextListLength(list, fontSize, context) {
+ var lengthList = list.map(function(item) {
+ return measureText(item, fontSize, context);
+ });
+ 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, opts, index, group, categories) {
+ var option = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var calPoints = opts.chartData.calPoints?opts.chartData.calPoints:[];
+ let points = {};
+ if(group.length > 0){
+ let filterPoints = [];
+ for (let i = 0; i < group.length; i++) {
+ filterPoints.push(calPoints[group[i]])
+ }
+ points = filterPoints[0][index[0]];
+ }else{
+ for (let i = 0; i < calPoints.length; i++) {
+ if(calPoints[i][index]){
+ points = calPoints[i][index];
+ break;
+ }
+ }
+ };
+ var textList = seriesData.map(function(item) {
+ let titleText = null;
+ if (opts.categories && opts.categories.length>0) {
+ titleText = categories[index];
+ };
+ return {
+ text: option.formatter ? option.formatter(item, titleText, index, opts) : item.name + ': ' + item.data,
+ color: item.color
+ };
+ });
+ var offset = {
+ x: Math.round(points.x),
+ y: Math.round(points.y)
+ };
+ return {
+ textList: textList,
+ offset: offset
+ };
+}
+
+function getMixToolTipData(seriesData, opts, index, categories) {
+ var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
+ var points = opts.chartData.xAxisPoints[index] + opts.chartData.eachSpacing / 2;
+ var textList = seriesData.map(function(item) {
+ return {
+ text: option.formatter ? option.formatter(item, categories[index], index, opts) : item.name + ': ' + item.data,
+ color: item.color,
+ disableLegend: item.disableLegend ? true : false
+ };
+ });
+ textList = textList.filter(function(item) {
+ if (item.disableLegend !== true) {
+ return item;
+ }
+ });
+ var offset = {
+ x: Math.round(points),
+ y: 0
+ };
+ return {
+ textList: textList,
+ offset: offset
+ };
+}
+
+function getCandleToolTipData(series, seriesData, opts, index, categories, extra) {
+ var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
+ var calPoints = opts.chartData.calPoints;
+ let upColor = extra.color.upFill;
+ let downColor = extra.color.downFill;
+ //颜色顺序为开盘,收盘,最低,最高
+ let color = [upColor, upColor, downColor, upColor];
+ var textList = [];
+ 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 current={ index:-1, group:[] };
+ var spacing = opts.chartData.eachSpacing / 2;
+ let xAxisPoints = [];
+ if (calPoints && calPoints.length > 0) {
+ if (!opts.categories) {
+ spacing = 0;
+ }else{
+ 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') {
+ xAxisPoints = opts.chartData.xAxisPoints;
+ }
+ }
+ if (isInExactChartArea(currentPoints, opts, config)) {
+ if (!opts.categories) {
+ let timePoints = Array(calPoints.length);
+ for (let i = 0; i < calPoints.length; i++) {
+ timePoints[i] = Array(calPoints[i].length)
+ for (let j = 0; j < calPoints[i].length; j++) {
+ timePoints[i][j] = (Math.abs(calPoints[i][j].x - currentPoints.x));
+ }
+ };
+ let pointValue = Array(timePoints.length);
+ let pointIndex = Array(timePoints.length);
+ for (let i = 0; i < timePoints.length; i++) {
+ pointValue[i] = Math.min.apply(null, timePoints[i]);
+ pointIndex[i] = timePoints[i].indexOf(pointValue[i]);
+ }
+ let minValue = Math.min.apply(null, pointValue);
+ current.index = [];
+ for (let i = 0; i < pointValue.length; i++) {
+ if(pointValue[i] == minValue){
+ current.group.push(i);
+ current.index.push(pointIndex[i]);
+ }
+ };
+ }else{
+ xAxisPoints.forEach(function(item, index) {
+ if (currentPoints.x + offset + spacing > item) {
+ current.index = index;
+ }
+ });
+ }
+ }
+ }
+ return current;
+}
+
+function findBarChartCurrentIndex(currentPoints, calPoints, opts, config) {
+ var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
+ var current={ index:-1, group:[] };
+ var spacing = opts.chartData.eachSpacing / 2;
+ let yAxisPoints = opts.chartData.yAxisPoints;
+ if (calPoints && calPoints.length > 0) {
+ if (isInExactChartArea(currentPoints, opts, config)) {
+ yAxisPoints.forEach(function(item, index) {
+ if (currentPoints.y + offset + spacing > item) {
+ current.index = index;
+ }
+ });
+ }
+ }
+ return current;
+}
+
+function findLegendIndex(currentPoints, legendData, opts) {
+ let currentIndex = -1;
+ let gap = 0;
+ 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 (area && currentPoints.x > area[0] - gap && currentPoints.x < area[2] + gap && currentPoints.y > area[1] - gap && currentPoints.y < area[3] + gap) {
+ 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, opts.chartData.mapData.mercator)) {
+ currentIndex = i;
+ break;
+ }
+ }
+ return currentIndex;
+}
+
+function findRoseChartCurrentIndex(currentPoints, pieData, opts) {
+ var currentIndex = -1;
+ var series = getRoseDataPoints(opts._series_, opts.extra.rose.type, pieData.radius, pieData.radius);
+ if (pieData && pieData.center && isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) {
+ var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x);
+ angle = -angle;
+ if(opts.extra.rose && opts.extra.rose.offsetAngle){
+ angle = angle - opts.extra.rose.offsetAngle * Math.PI / 180;
+ }
+ for (var i = 0, len = series.length; i < len; i++) {
+ if (isInAngleRange(angle, series[i]._start_, series[i]._start_ + series[i]._rose_proportion_ * 2 * Math.PI)) {
+ currentIndex = i;
+ break;
+ }
+ }
+ }
+ return currentIndex;
+}
+
+function findPieChartCurrentIndex(currentPoints, pieData, opts) {
+ var currentIndex = -1;
+ var series = getPieDataPoints(pieData.series);
+ if (pieData && pieData.center && isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) {
+ var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x);
+ angle = -angle;
+ if(opts.extra.pie && opts.extra.pie.offsetAngle){
+ angle = angle - opts.extra.pie.offsetAngle * Math.PI / 180;
+ }
+ if(opts.extra.ring && opts.extra.ring.offsetAngle){
+ angle = angle - opts.extra.ring.offsetAngle * Math.PI / 180;
+ }
+ for (var i = 0, len = series.length; i < len; i++) {
+ if (isInAngleRange(angle, series[i]._start_, series[i]._start_ + series[i]._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,eachSeries) {
+ var newPoints = [];
+ var items = [];
+ points.forEach(function(item, index) {
+ if(eachSeries.connectNulls){
+ if (item !== null) {
+ items.push(item);
+ }
+ }else{
+ 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, context) {
+ 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 * opts.pix;
+ let margin = opts.legend.margin * opts.pix;
+ let fontSize = opts.legend.fontSize ? opts.legend.fontSize * opts.pix : config.fontSize;
+ let shapeWidth = 15 * opts.pix;
+ let shapeRight = 5 * opts.pix;
+ let lineHeight = Math.max(opts.legend.lineHeight * opts.pix, 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];
+ const legendText = item.legendText ? item.legendText : item.name;
+ let itemWidth = shapeWidth + shapeRight + measureText(legendText || 'undefined', fontSize, context) + opts.legend.itemGap * opts.pix;
+ if (widthCount + itemWidth > opts.width - opts.area[1] - opts.area[3]) {
+ legendList.push(currentRow);
+ widthCountArr.push(widthCount - opts.legend.itemGap * opts.pix);
+ widthCount = itemWidth;
+ currentRow = [item];
+ } else {
+ widthCount += itemWidth;
+ currentRow.push(item);
+ }
+ }
+ if (currentRow.length) {
+ legendList.push(currentRow);
+ widthCountArr.push(widthCount - opts.legend.itemGap * opts.pix);
+ legendData.widthArr = widthCountArr;
+ let legendWidth = Math.max.apply(null, widthCountArr);
+ switch (opts.legend.float) {
+ case 'left':
+ legendData.area.start.x = opts.area[3];
+ legendData.area.end.x = opts.area[3] + legendWidth + 2 * padding;
+ break;
+ case 'right':
+ legendData.area.start.x = opts.width - opts.area[1] - legendWidth - 2 * padding;
+ legendData.area.end.x = opts.width - opts.area[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.area[0] - opts.area[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.area[0] + margin;
+ legendData.area.end.y = opts.area[0] + margin + legendData.area.height;
+ break;
+ case 'bottom':
+ legendData.area.start.y = opts.height - opts.area[2] - margin - legendData.area.height;
+ legendData.area.end.y = opts.height - opts.area[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, context) + opts.legend.itemGap * opts.pix;
+ 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 * opts.pix + 2 * padding;
+ legendData.area.wholeWidth = legendData.area.width + padding;
+ }
+ }
+ switch (opts.legend.position) {
+ case 'top':
+ legendData.area.start.y = opts.area[0] + margin;
+ legendData.area.end.y = opts.area[0] + margin + legendData.area.height;
+ break;
+ case 'bottom':
+ legendData.area.start.y = opts.height - opts.area[2] - legendData.area.height - margin;
+ legendData.area.end.y = opts.height - opts.area[2] - margin;
+ break;
+ case 'left':
+ legendData.area.start.x = opts.area[3];
+ legendData.area.end.x = opts.area[3] + legendData.area.width;
+ break;
+ case 'right':
+ legendData.area.start.x = opts.width - opts.area[1] - legendData.area.width;
+ legendData.area.end.x = opts.width - opts.area[1];
+ break;
+ }
+ chartData.legendData = legendData;
+ return legendData;
+}
+
+function calCategoriesData(categories, opts, config, eachSpacing, context) {
+ var result = {
+ angle: 0,
+ xAxisHeight: config.xAxisHeight
+ };
+ var fontSize = opts.xAxis.fontSize * opts.pix || config.fontSize;
+ var categoriesTextLenth = categories.map(function(item,index) {
+ var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item,index,opts) : item;
+ return measureText(String(xitem), fontSize, context);
+ });
+
+ var maxTextLength = Math.max.apply(this, categoriesTextLenth);
+ if (opts.xAxis.rotateLabel == true) {
+ result.angle = opts.xAxis.rotateAngle * Math.PI / 180;
+ let tempHeight = 2 * config.xAxisTextPadding + Math.abs(maxTextLength * Math.sin(result.angle))
+ tempHeight = tempHeight < fontSize + 2 * config.xAxisTextPadding ? tempHeight + 2 * config.xAxisTextPadding : tempHeight;
+ if(opts.enableScroll == true && opts.xAxis.scrollShow == true){
+ tempHeight += 12 * opts.pix;
+ }
+ result.xAxisHeight = tempHeight;
+ }
+ if (opts.xAxis.disabled){
+ result.xAxisHeight = 0;
+ }
+ return result;
+}
+
+function getXAxisTextList(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[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, context) {
+ //堆叠图重算Y轴
+ var columnstyle = assign({}, {
+ type: ""
+ }, opts.extra.bar);
+ var result = {
+ angle: 0,
+ xAxisHeight: config.xAxisHeight
+ };
+ result.ranges = getXAxisTextList(series, opts, config, columnstyle.type);
+ result.rangesFormat = result.ranges.map(function(item) {
+ //item = opts.xAxis.formatter ? opts.xAxis.formatter(item) : util.toFixed(item, 2);
+ item = util.toFixed(item, 2);
+ return item;
+ });
+ var xAxisScaleValues = result.ranges.map(function(item) {
+ // 如果刻度值是浮点数,则保留两位小数
+ item = util.toFixed(item, 2);
+ // 若有自定义格式则调用自定义的格式化函数
+ //item = opts.xAxis.formatter ? opts.xAxis.formatter(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, opts.xAxis.fontSize * opts.pix || config.fontSize, context);
+ });
+ // 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.value = item;
+ 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, type, eachSpacing) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ series = series.sort(function(a, b) {
+ return parseInt(b.data) - parseInt(a.data);
+ });
+ for (let i = 0; i < series.length; i++) {
+ if(type == 'funnel'){
+ series[i].radius = series[i].data / series[0].data * radius * process;
+ }else{
+ series[i].radius = (eachSpacing * (series.length - i)) / (eachSpacing * series.length) * radius * process;
+ }
+ series[i]._proportion_ = series[i].data / series[0].data;
+ }
+ if(type !== 'pyramid'){
+ series.reverse();
+ }
+ return series;
+}
+
+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) {
+ item._proportion_ = 1 / series.length * process;
+ item._rose_proportion_ = 1 / series.length * process;
+ } else {
+ item._proportion_ = item.data / count * process;
+ if(type == 'area'){
+ item._rose_proportion_ = 1 / series.length * process;
+ }else{
+ item._rose_proportion_ = item.data / count * process;
+ }
+ }
+ item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData)) || radius;
+ }
+ 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 getGaugeArcbarDataPoints(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, config, context, opts) {
+ series = getPieDataPoints(series);
+ let maxLength = 0;
+ for (let i = 0; i < series.length; i++) {
+ let item = series[i];
+ let text = item.formatter ? item.formatter(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + '%';
+ maxLength = Math.max(maxLength, measureText(text, item.textSize * opts.pix || config.fontSize, context));
+ }
+ return maxLength;
+}
+
+function fixColumeData(points, eachSpacing, columnLen, index, config, opts) {
+ return points.map(function(item) {
+ if (item === null) {
+ return null;
+ }
+ var seriesGap = 0;
+ var categoryGap = 0;
+ if (opts.type == 'mix') {
+ seriesGap = opts.extra.mix.column.seriesGap * opts.pix || 0;
+ categoryGap = opts.extra.mix.column.categoryGap * opts.pix || 0;
+ } else {
+ seriesGap = opts.extra.column.seriesGap * opts.pix || 0;
+ categoryGap = opts.extra.column.categoryGap * opts.pix || 0;
+ }
+ seriesGap = Math.min(seriesGap, eachSpacing / columnLen)
+ categoryGap = Math.min(categoryGap, eachSpacing / columnLen)
+ item.width = Math.ceil((eachSpacing - 2 * categoryGap - seriesGap * (columnLen - 1)) / columnLen);
+ if (opts.extra.mix && opts.extra.mix.column.width && +opts.extra.mix.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.mix.column.width * opts.pix);
+ }
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width * opts.pix);
+ }
+ if (item.width <= 0) {
+ item.width = 1;
+ }
+ item.x += (index + 0.5 - columnLen / 2) * (item.width + seriesGap);
+ return item;
+ });
+}
+
+function fixBarData(points, eachSpacing, columnLen, index, config, opts) {
+ return points.map(function(item) {
+ if (item === null) {
+ return null;
+ }
+ var seriesGap = 0;
+ var categoryGap = 0;
+ seriesGap = opts.extra.bar.seriesGap * opts.pix || 0;
+ categoryGap = opts.extra.bar.categoryGap * opts.pix || 0;
+ seriesGap = Math.min(seriesGap, eachSpacing / columnLen)
+ categoryGap = Math.min(categoryGap, eachSpacing / columnLen)
+ item.width = Math.ceil((eachSpacing - 2 * categoryGap - seriesGap * (columnLen - 1)) / columnLen);
+ if (opts.extra.bar && opts.extra.bar.width && +opts.extra.bar.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.bar.width * opts.pix);
+ }
+ if (item.width <= 0) {
+ item.width = 1;
+ }
+ item.y += (index + 0.5 - columnLen / 2) * (item.width + seriesGap);
+ return item;
+ });
+}
+
+function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) {
+ var categoryGap = opts.extra.column.categoryGap * opts.pix || 0;
+ return points.map(function(item) {
+ if (item === null) {
+ return null;
+ }
+ item.width = eachSpacing - 2 * categoryGap;
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width * opts.pix);
+ }
+ if (index > 0) {
+ item.width -= border;
+ }
+ return item;
+ });
+}
+
+function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) {
+ var categoryGap = opts.extra.column.categoryGap * opts.pix || 0;
+ return points.map(function(item, indexn) {
+ if (item === null) {
+ return null;
+ }
+ item.width = Math.ceil(eachSpacing - 2 * categoryGap);
+ if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.column.width * opts.pix);
+ }
+ if (item.width <= 0) {
+ item.width = 1;
+ }
+ return item;
+ });
+}
+
+function fixBarStackData(points, eachSpacing, columnLen, index, config, opts, series) {
+ var categoryGap = opts.extra.bar.categoryGap * opts.pix || 0;
+ return points.map(function(item, indexn) {
+ if (item === null) {
+ return null;
+ }
+ item.width = Math.ceil(eachSpacing - 2 * categoryGap);
+ if (opts.extra.bar && opts.extra.bar.width && +opts.extra.bar.width > 0) {
+ item.width = Math.min(item.width, +opts.extra.bar.width * opts.pix);
+ }
+ if (item.width <= 0) {
+ item.width = 1;
+ }
+ 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' || opts.type == 'scatter' || opts.type == 'bubble' || opts.type == 'bar') && dataCount > 1 && opts.xAxis.boundaryGap == 'justify') {
+ dataCount -= 1;
+ }
+ var widthRatio = 0;
+ if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
+ if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+ widthRatio = opts.extra.mount.widthRatio - 1;
+ dataCount += widthRatio;
+ }
+ 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 + widthRatio / 2 * eachSpacing + index * eachSpacing);
+ });
+ if (opts.xAxis.boundaryGap !== 'justify') {
+ if (opts.enableScroll === true) {
+ xAxisPoints.push(startX + widthRatio * eachSpacing + 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' || opts.type == 'scatter' || opts.type == 'bubble' ) {
+ 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);
+ if(opts.type == 'bubble'){
+ point.r = item[2];
+ point.t = item[3];
+ }
+ } else {
+ value = item.value;
+ }
+ }
+ if (boundaryGap == 'center') {
+ point.x += eachSpacing / 2;
+ }
+ var height = validHeight * (value - minRange) / (maxRange - minRange);
+ height *= process;
+ point.y = opts.height - height - opts.area[2];
+ points.push(point);
+ }
+ });
+ return points;
+}
+
+function getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption) {
+ var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
+ var points = [];
+ var validHeight = opts.height - opts.area[0] - opts.area[2];
+ var validWidth = opts.width - opts.area[1] - opts.area[3];
+ var mountWidth = eachSpacing * mountOption.widthRatio;
+ series.forEach(function(item, index) {
+ if (item === null) {
+ points.push(null);
+ } else {
+ var point = {};
+ point.color = item.color;
+ point.x = xAxisPoints[index];
+ point.x += eachSpacing / 2;
+ var value = item.data;
+ var height = validHeight * (value - minRange) / (maxRange - minRange);
+ height *= process;
+ point.y = opts.height - height - opts.area[2];
+ point.value = value;
+ point.width = mountWidth;
+ points.push(point);
+ }
+ });
+ return points;
+}
+
+function getBarDataPoints(data, minRange, maxRange, yAxisPoints, 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];
+ 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.y = yAxisPoints[index];
+ var value = item;
+ if (typeof item === 'object' && item !== null) {
+ value = item.value;
+ }
+ var height = validWidth * (value - minRange) / (maxRange - minRange);
+ height *= process;
+ point.height = height;
+ point.value = value;
+ point.x = height + opts.area[3];
+ 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 getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) {
+ var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1;
+ var points = [];
+ var validHeight = 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.y = yAxisPoints[index];
+ 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.height = height - heightc;
+ point.x = opts.area[3] + height;
+ point.x0 = opts.area[3] + heightc;
+ points.push(point);
+ }
+ });
+ return points;
+}
+
+function getYAxisTextList(series, opts, config, stack, yData) {
+ var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : -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 = yData.min || 0;
+ var maxData = yData.max || 0;
+ if (sorted.length > 0) {
+ minData = Math.min.apply(this, sorted);
+ maxData = Math.max.apply(this, sorted);
+ }
+ if (minData === maxData) {
+ // var rangeSpan = maxData || 10;
+ // maxData += rangeSpan;
+ if(maxData == 0){
+ maxData = 10;
+ }else{
+ minData = 0;
+ }
+ }
+ var dataRange = getDataRange(minData, maxData);
+ var minRange = (yData.min === undefined || yData.min === null) ? dataRange.minRange : yData.min;
+ var maxRange = (yData.max === undefined || yData.max === null) ? dataRange.maxRange : yData.max;
+ 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, context) {
+ //堆叠图重算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;
+ }
+ if(yData.type === 'categories'){
+ if(!yData.formatter){
+ yData.formatter = (val,index,opts) => {return val + (yData.unit || '')};
+ }
+ yData.categories = yData.categories || opts.categories;
+ rangesArr[i] = yData.categories;
+ }else{
+ if(!yData.formatter){
+ yData.formatter = (val,index,opts) => {return val.toFixed(yData.tofix) + (yData.unit || '')};
+ }
+ rangesArr[i] = getYAxisTextList(newSeries[i], opts, config, columnstyle.type, yData, i);
+ }
+ let yAxisFontSizes = yData.fontSize * opts.pix || config.fontSize;
+ yAxisWidthArr[i] = {
+ position: yData.position ? yData.position : 'left',
+ width: 0
+ };
+ rangesFormatArr[i] = rangesArr[i].map(function(items,index) {
+ items = yData.formatter(items,index,opts);
+ yAxisWidthArr[i].width = Math.max(yAxisWidthArr[i].width, measureText(items, yAxisFontSizes, context) + 5);
+ return items;
+ });
+ let calibration = yData.calibration ? 4 * opts.pix : 0;
+ yAxisWidthArr[i].width += calibration + 3 * opts.pix;
+ if (yData.disabled === true) {
+ yAxisWidthArr[i].width = 0;
+ }
+ }
+ } else {
+ var rangesArr = new Array(1);
+ var rangesFormatArr = new Array(1);
+ var yAxisWidthArr = new Array(1);
+ if(opts.type === 'bar'){
+ rangesArr[0] = opts.categories;
+ if(!opts.yAxis.formatter){
+ opts.yAxis.formatter = (val,index,opts) => {return val + (opts.yAxis.unit || '')}
+ }
+ }else{
+ if(!opts.yAxis.formatter){
+ opts.yAxis.formatter = (val,index,opts) => {return val.toFixed(opts.yAxis.tofix ) + (opts.yAxis.unit || '')}
+ }
+ rangesArr[0] = getYAxisTextList(series, opts, config, columnstyle.type, {});
+ }
+ yAxisWidthArr[0] = {
+ position: 'left',
+ width: 0
+ };
+ var yAxisFontSize = opts.yAxis.fontSize * opts.pix || config.fontSize;
+ rangesFormatArr[0] = rangesArr[0].map(function(item,index) {
+ item = opts.yAxis.formatter(item,index,opts);
+ yAxisWidthArr[0].width = Math.max(yAxisWidthArr[0].width, measureText(item, yAxisFontSize, context) + 5);
+ return item;
+ });
+ yAxisWidthArr[0].width += 3 * opts.pix;
+ 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,
+ formatter: opts.yAxis.formatter
+ };
+ if(opts.type === 'bar'){
+ opts.yAxis.data[0].categories = opts.categories;
+ opts.yAxis.data[0].type = 'categories';
+ }
+ }
+ }
+ 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].formatter ? opts.yAxis.data[i].formatter(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.pix);
+ } else {
+ context.setStrokeStyle("#ffffff");
+ context.setFillStyle(color);
+ context.setLineWidth(1 * opts.pix);
+ }
+ 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.pix, item.y);
+ context.arc(item.x, item.y, 3 * opts.pix, 0, 2 * Math.PI, false);
+ }
+ });
+ } else if (shape === 'square') {
+ 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);
+ }
+ });
+ } else if (shape === 'triangle') {
+ return;
+ }
+ 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 || opts.fontColor;
+ var subtitleFontColor = opts.subtitle.color || opts.fontColor;
+ var titleHeight = title ? titlefontSize : 0;
+ var subtitleHeight = subtitle ? subtitlefontSize : 0;
+ var margin = 5;
+ if (subtitle) {
+ var textWidth = measureText(subtitle, subtitlefontSize * opts.pix, context);
+ var startX = center.x - textWidth / 2 + (opts.subtitle.offsetX|| 0) * opts.pix ;
+ var startY = center.y + subtitlefontSize * opts.pix / 2 + (opts.subtitle.offsetY || 0) * opts.pix;
+ if (title) {
+ startY += (titleHeight * opts.pix + margin) / 2;
+ }
+ context.beginPath();
+ context.setFontSize(subtitlefontSize * opts.pix);
+ context.setFillStyle(subtitleFontColor);
+ context.fillText(subtitle, startX, startY);
+ context.closePath();
+ context.stroke();
+ }
+ if (title) {
+ var _textWidth = measureText(title, titlefontSize * opts.pix, context);
+ var _startX = center.x - _textWidth / 2 + (opts.title.offsetX || 0);
+ var _startY = center.y + titlefontSize * opts.pix / 2 + (opts.title.offsetY || 0) * opts.pix;
+ if (subtitle) {
+ _startY -= (subtitleHeight * opts.pix + margin) / 2;
+ }
+ context.beginPath();
+ context.setFontSize(titlefontSize * opts.pix);
+ context.setFillStyle(titleFontColor);
+ context.fillText(title, _startX, _startY);
+ context.closePath();
+ context.stroke();
+ }
+}
+
+function drawPointText(points, series, config, context, opts) {
+ // 绘制数据文案
+ var data = series.data;
+ var textOffset = series.textOffset ? series.textOffset : 0;
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ var fontSize = series.textSize ? series.textSize * opts.pix : config.fontSize;
+ context.setFontSize(fontSize);
+ context.setFillStyle(series.textColor || opts.fontColor);
+ var value = data[index]
+ if (typeof data[index] === 'object' && data[index] !== null) {
+ if (data[index].constructor.toString().indexOf('Array')>-1) {
+ value = data[index][1];
+ } else {
+ value = data[index].value
+ }
+ }
+ var formatVal = series.formatter ? series.formatter(value,index,series,opts) : value;
+ context.setTextAlign('center');
+ context.fillText(String(formatVal), item.x, item.y - 4 + textOffset * opts.pix);
+ context.closePath();
+ context.stroke();
+ context.setTextAlign('left');
+ }
+ });
+}
+
+function drawMountPointText(points, series, config, context, opts) {
+ // 绘制数据文案
+ var data = series.data;
+ var textOffset = series.textOffset ? series.textOffset : 0;
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ var fontSize = series[index].textSize ? series[index].textSize * opts.pix : config.fontSize;
+ context.setFontSize(fontSize);
+ context.setFillStyle(series[index].textColor || opts.fontColor);
+ var value = item.value
+ var formatVal = series[index].formatter ? series[index].formatter(value,index,series,opts) : value;
+ context.setTextAlign('center');
+ context.fillText(String(formatVal), item.x, item.y - 4 + textOffset * opts.pix);
+ context.closePath();
+ context.stroke();
+ context.setTextAlign('left');
+ }
+ });
+}
+
+function drawBarPointText(points, series, config, context, opts) {
+ // 绘制数据文案
+ var data = series.data;
+ var textOffset = series.textOffset ? series.textOffset : 0;
+ points.forEach(function(item, index) {
+ if (item !== null) {
+ context.beginPath();
+ var fontSize = series.textSize ? series.textSize * opts.pix : config.fontSize;
+ context.setFontSize(fontSize);
+ context.setFillStyle(series.textColor || opts.fontColor);
+ var value = data[index]
+ if (typeof data[index] === 'object' && data[index] !== null) {
+ value = data[index].value ;
+ }
+ var formatVal = series.formatter ? series.formatter(value,index,series,opts) : value;
+ context.setTextAlign('left');
+ context.fillText(String(formatVal), item.x + 4 * opts.pix , item.y + fontSize / 2 - 3 );
+ context.closePath();
+ context.stroke();
+ }
+ });
+}
+
+function drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context) {
+ radius -= gaugeOption.width / 2 + gaugeOption.labelOffset * opts.pix;
+ radius = radius < 10 ? 10 : radius;
+ 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.formatter ? gaugeOption.formatter(nowNumber,i,opts) : nowNumber;
+ pos.x += centerPosition.x - measureText(labelText, config.fontSize, context) / 2;
+ pos.y += centerPosition.y;
+ var startX = pos.x;
+ var startY = pos.y;
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(gaugeOption.labelColor || opts.fontColor);
+ 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 || {};
+ angleList.forEach(function(angle, index) {
+ if(radarOption.labelPointShow === true && opts.categories[index] !== ''){
+ var posPoint = {
+ x: radius * Math.cos(angle),
+ y: radius * Math.sin(angle)
+ };
+ var posPointAxis = convertCoordinateOrigin(posPoint.x, posPoint.y, centerPosition);
+ context.setFillStyle(radarOption.labelPointColor);
+ context.beginPath();
+ context.arc(posPointAxis.x, posPointAxis.y, radarOption.labelPointRadius * opts.pix, 0, 2 * Math.PI, false);
+ context.closePath();
+ context.fill();
+ }
+ var pos = {
+ x: (radius + config.radarLabelTextMargin * opts.pix) * Math.cos(angle),
+ y: (radius + config.radarLabelTextMargin * opts.pix) * 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] || '', config.fontSize, context) / 2;
+ } else if (pos.x < 0) {
+ startX -= measureText(opts.categories[index] || '', config.fontSize, context);
+ }
+ context.beginPath();
+ context.setFontSize(config.fontSize);
+ context.setFillStyle(radarOption.labelColor || opts.fontColor);
+ 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,index) {
+ var text = item.formatter ? item.formatter(item,index,series,opts) : util.toFixed(item._proportion_.toFixed(4) * 100) + '%';
+ text = item.labelText ? item.labelText : text;
+ var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2);
+ if (item._rose_proportion_) {
+ arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._rose_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,
+ labelShow: item.labelShow
+ };
+ });
+ 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 * opts.pix || config.fontSize, context);
+ 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++) {
+ if(seriesConvert[i].labelShow === false){
+ continue;
+ }
+ 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.pix);
+ context.setFontSize(item.textSize * opts.pix || 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 * opts.pix, 0, 2 * Math.PI);
+ context.closePath();
+ context.fill();
+ context.beginPath();
+ context.setFontSize(item.textSize * opts.pix || config.fontSize);
+ context.setFillStyle(item.textColor || opts.fontColor);
+ 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.pix);
+ 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, context);
+ 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.pix);
+ 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 || opts.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,
+ labelAlign: 'left',
+ labelOffsetX: 0,
+ labelOffsetY: 0,
+ }, points[i]);
+ if (markLineOption.type == 'dash') {
+ context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]);
+ }
+ context.setStrokeStyle(item.lineColor);
+ context.setLineWidth(1 * opts.pix);
+ context.beginPath();
+ context.moveTo(startX, item.y);
+ context.lineTo(endX, item.y);
+ context.stroke();
+ context.setLineDash([]);
+ if (item.showLabel) {
+ let labelText = item.labelText ? item.labelText : item.value;
+ context.setFontSize(config.fontSize);
+ let textWidth = measureText(labelText, config.fontSize, context);
+ let bgWidth = textWidth + config.toolTipPadding * 2;
+ let bgStartX = item.labelAlign == 'left' ? opts.area[3] - bgWidth : opts.width - opts.area[1];
+ bgStartX += item.labelOffsetX;
+ let bgStartY = item.y - 0.5 * config.fontSize - config.toolTipPadding;
+ bgStartY += item.labelOffsetY;
+ let textX = bgStartX + config.toolTipPadding;
+ let textY = item.y;
+ context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity));
+ context.setStrokeStyle(item.labelBgColor);
+ context.setLineWidth(1 * opts.pix);
+ context.beginPath();
+ context.rect(bgStartX, bgStartY, bgWidth, config.fontSize + 2 * config.toolTipPadding);
+ context.closePath();
+ context.stroke();
+ context.fill();
+ context.setFontSize(config.fontSize);
+ context.setTextAlign('left');
+ context.setFillStyle(item.labelFontColor);
+ context.fillText(String(labelText), textX, bgStartY + config.fontSize + config.toolTipPadding/2);
+ context.stroke();
+ context.setTextAlign('left');
+ }
+ }
+}
+
+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.pix);
+ 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, context);
+ 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.pix);
+ 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 || opts.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 * opts.pix);
+ } else {
+ tStartRight += widthArr[i].width + opts.yAxis.padding * opts.pix;
+ }
+ }
+ }
+}
+
+function drawToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
+ var toolTipOption = assign({}, {
+ activeBgColor: '#000000',
+ activeBgOpacity: 0.08,
+ activeWidth: eachSpacing
+ }, opts.extra.column);
+ toolTipOption.activeWidth = toolTipOption.activeWidth > eachSpacing ? eachSpacing : toolTipOption.activeWidth;
+ var startY = opts.area[0];
+ var endY = opts.height - opts.area[2];
+ context.beginPath();
+ context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity));
+ context.rect(offsetX - toolTipOption.activeWidth / 2, startY, toolTipOption.activeWidth, endY - startY);
+ context.closePath();
+ context.fill();
+ context.setFillStyle("#FFFFFF");
+}
+
+function drawBarToolTipSplitArea(offsetX, opts, config, context, eachSpacing) {
+ var toolTipOption = assign({}, {
+ activeBgColor: '#000000',
+ activeBgOpacity: 0.08
+ }, opts.extra.bar);
+ var startX = opts.area[3];
+ var endX = opts.width - opts.area[1];
+ context.beginPath();
+ context.setFillStyle(hexToRgb(toolTipOption.activeBgColor, toolTipOption.activeBgOpacity));
+ context.rect( startX ,offsetX - eachSpacing / 2 , endX - startX,eachSpacing);
+ context.closePath();
+ context.fill();
+ context.setFillStyle("#FFFFFF");
+}
+
+
+function drawToolTip(textList, offset, opts, config, context, eachSpacing, xAxisPoints) {
+ var toolTipOption = assign({}, {
+ showBox: true,
+ showArrow: true,
+ showCategory: false,
+ bgColor: '#000000',
+ bgOpacity: 0.7,
+ borderColor: '#000000',
+ borderWidth: 0,
+ borderRadius: 0,
+ borderOpacity: 0.7,
+ fontColor: '#FFFFFF',
+ splitLine: true,
+ }, opts.extra.tooltip);
+ if(toolTipOption.showCategory==true && opts.categories){
+ textList.unshift({text:opts.categories[opts.tooltip.index],color:null})
+ }
+ var legendWidth = 4 * opts.pix;
+ var legendMarginRight = 5 * opts.pix;
+ var arrowWidth = toolTipOption.showArrow ? 8 * opts.pix : 0;
+ var isOverRightBorder = false;
+ if (opts.type == 'line' || opts.type == 'mount' || opts.type == 'area' || opts.type == 'candle' || opts.type == 'mix') {
+ if (toolTipOption.splitLine == true) {
+ drawToolTipSplitLine(opts.tooltip.offset.x, opts, config, context);
+ }
+ }
+ offset = assign({
+ x: 0,
+ y: 0
+ }, offset);
+ offset.y -= 8 * opts.pix;
+ var textWidth = textList.map(function(item) {
+ return measureText(item.text, config.fontSize, context);
+ });
+ 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_ || 0) + 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));
+ context.setLineWidth(toolTipOption.borderWidth * opts.pix);
+ context.setStrokeStyle(hexToRgb(toolTipOption.borderColor, toolTipOption.borderOpacity));
+ var radius = toolTipOption.borderRadius;
+ if (isOverRightBorder) {
+ if (toolTipOption.showArrow) {
+ context.moveTo(offset.x, offset.y + 10 * opts.pix);
+ context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pix + 5 * opts.pix);
+ }
+ context.arc(offset.x - arrowWidth - radius, offset.y + toolTipHeight - radius, radius, 0, Math.PI / 2, false);
+ context.arc(offset.x - arrowWidth - Math.round(toolTipWidth) + radius, offset.y + toolTipHeight - radius, radius,
+ Math.PI / 2, Math.PI, false);
+ context.arc(offset.x - arrowWidth - Math.round(toolTipWidth) + radius, offset.y + radius, radius, -Math.PI, -Math.PI / 2, false);
+ context.arc(offset.x - arrowWidth - radius, offset.y + radius, radius, -Math.PI / 2, 0, false);
+ if (toolTipOption.showArrow) {
+ context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pix - 5 * opts.pix);
+ context.lineTo(offset.x, offset.y + 10 * opts.pix);
+ }
+ } else {
+ if (toolTipOption.showArrow) {
+ context.moveTo(offset.x, offset.y + 10 * opts.pix);
+ context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pix - 5 * opts.pix);
+ }
+ context.arc(offset.x + arrowWidth + radius, offset.y + radius, radius, -Math.PI, -Math.PI / 2, false);
+ context.arc(offset.x + arrowWidth + Math.round(toolTipWidth) - radius, offset.y + radius, radius, -Math.PI / 2, 0,
+ false);
+ context.arc(offset.x + arrowWidth + Math.round(toolTipWidth) - radius, offset.y + toolTipHeight - radius, radius, 0,
+ Math.PI / 2, false);
+ context.arc(offset.x + arrowWidth + radius, offset.y + toolTipHeight - radius, radius, Math.PI / 2, Math.PI, false);
+ if (toolTipOption.showArrow) {
+ context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pix + 5 * opts.pix);
+ context.lineTo(offset.x, offset.y + 10 * opts.pix);
+ }
+ }
+ context.closePath();
+ context.fill();
+ if (toolTipOption.borderWidth > 0) {
+ context.stroke();
+ }
+ // 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 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,
+ meterBorder: 4,
+ meterFillColor: '#FFFFFF',
+ barBorderCircle: false,
+ barBorderRadius: [],
+ seriesGap: 2,
+ linearType: 'none',
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ }, 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);
+ }
+ columnOption.customColor = fillCustomColor(columnOption.linearType, columnOption.customColor, series, config);
+ 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];
+ //fix issues/I27B1N yyoinge & Joeshu
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ context.beginPath();
+ var fillColor = item.color || eachSeries.color
+ var strokeColor = item.color || eachSeries.color
+ if (columnOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+ //透明渐变
+ if (columnOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity));
+ grd.addColorStop(columnOption.colorStop, hexToRgb(columnOption.customColor[eachSeries.linearIndex],columnOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+ const left = startX;
+ const top = item.y;
+ const width = item.width;
+ const height = opts.height - opts.area[2] - item.y;
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius;
+ let minRadius = Math.min(width/2,height/2);
+ r0 = r0 > minRadius ? minRadius : r0;
+ r1 = r1 > minRadius ? minRadius : r1;
+ r2 = r2 > minRadius ? minRadius : r2;
+ r3 = r3 > minRadius ? minRadius : r3;
+ r0 = r0 < 0 ? 0 : r0;
+ r1 = r1 < 0 ? 0 : r1;
+ r2 = r2 < 0 ? 0 : r2;
+ r3 = r3 < 0 ? 0 : r3;
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2);
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0);
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2);
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
+ } else {
+ context.moveTo(startX, item.y);
+ context.lineTo(startX + item.width, item.y);
+ context.lineTo(startX + item.width, opts.height - opts.area[2]);
+ context.lineTo(startX, opts.height - opts.area[2]);
+ context.lineTo(startX, item.y);
+ context.setLineWidth(1)
+ context.setStrokeStyle(strokeColor);
+ }
+ context.setFillStyle(fillColor);
+ 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();
+ var fillColor = 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.setFillStyle(fillColor);
+ context.moveTo(startX, item.y);
+ context.fillRect(startX, item.y, item.width, 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.meterBorder);
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i];
+ if (item !== null && i > leftNum && i < rightNum) {
+ //画背景颜色
+ context.beginPath();
+ if (seriesIndex == 0 && columnOption.meterBorder > 0) {
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(columnOption.meterBorder * opts.pix);
+ }
+ if(seriesIndex == 0){
+ context.setFillStyle(columnOption.meterFillColor);
+ }else{
+ context.setFillStyle(item.color || eachSeries.color);
+ }
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+ const left = startX;
+ const top = item.y;
+ const width = item.width;
+ const height = opts.height - opts.area[2] - item.y;
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius;
+ let minRadius = Math.min(width/2,height/2);
+ r0 = r0 > minRadius ? minRadius : r0;
+ r1 = r1 > minRadius ? minRadius : r1;
+ r2 = r2 > minRadius ? minRadius : r2;
+ r3 = r3 > minRadius ? minRadius : r3;
+ r0 = r0 < 0 ? 0 : r0;
+ r1 = r1 < 0 ? 0 : r1;
+ r2 = r2 < 0 ? 0 : r2;
+ r3 = r3 < 0 ? 0 : r3;
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2);
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0);
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2);
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
+ context.fill();
+ }else{
+ context.moveTo(startX, item.y);
+ context.lineTo(startX + item.width, item.y);
+ context.lineTo(startX + item.width, opts.height - opts.area[2]);
+ context.lineTo(startX, opts.height - opts.area[2]);
+ context.lineTo(startX, item.y);
+ context.fill();
+ }
+ if (seriesIndex == 0 && columnOption.meterBorder > 0) {
+ context.closePath();
+ context.stroke();
+ }
+ }
+ }
+ 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, opts);
+ break;
+ case 'stack':
+ var points = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+ drawPointText(points, eachSeries, config, context, opts);
+ break;
+ case 'meter':
+ var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process);
+ drawPointText(points, eachSeries, config, context, opts);
+ break;
+ }
+ });
+ }
+ context.restore();
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing
+ };
+}
+
+function drawMountDataPoints(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 mountOption = assign({}, {
+ type: 'mount',
+ widthRatio: 1,
+ borderWidth: 1,
+ barBorderCircle: false,
+ barBorderRadius: [],
+ linearType: 'none',
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ }, opts.extra.mount);
+ mountOption.widthRatio = mountOption.widthRatio <= 0 ? 0 : mountOption.widthRatio;
+ mountOption.widthRatio = mountOption.widthRatio >= 2 ? 2 : mountOption.widthRatio;
+ 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;
+ }
+ mountOption.customColor = fillCustomColor(mountOption.linearType, mountOption.customColor, series, config);
+ let ranges, minRange, maxRange;
+ ranges = [].concat(opts.chartData.yAxisData.ranges[0]);
+ minRange = ranges.pop();
+ maxRange = ranges.shift();
+ var points = getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, process);
+ switch (mountOption.type) {
+ case 'bar':
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i];
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+ var height = opts.height - item.y - opts.area[2];
+ context.beginPath();
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+ //透明渐变
+ if (mountOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((mountOption.barBorderRadius && mountOption.barBorderRadius.length === 4) || mountOption.barBorderCircle === true) {
+ const left = startX;
+ const top = item.y;
+ const width = item.width;
+ const height = opts.height - opts.area[2] - item.y - mountOption.borderWidth * opts.pix / 2;
+ if (mountOption.barBorderCircle) {
+ mountOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+ }
+ let [r0, r1, r2, r3] = mountOption.barBorderRadius;
+ let minRadius = Math.min(width/2,height/2);
+ r0 = r0 > minRadius ? minRadius : r0;
+ r1 = r1 > minRadius ? minRadius : r1;
+ r2 = r2 > minRadius ? minRadius : r2;
+ r3 = r3 > minRadius ? minRadius : r3;
+ r0 = r0 < 0 ? 0 : r0;
+ r1 = r1 < 0 ? 0 : r1;
+ r2 = r2 < 0 ? 0 : r2;
+ r3 = r3 < 0 ? 0 : r3;
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2);
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0);
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2);
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
+ } else {
+ context.moveTo(startX, item.y);
+ context.lineTo(startX + item.width, item.y);
+ context.lineTo(startX + item.width, opts.height - opts.area[2]);
+ context.lineTo(startX, opts.height - opts.area[2]);
+ context.lineTo(startX, item.y);
+ }
+ context.setStrokeStyle(strokeColor);
+ context.setFillStyle(fillColor);
+ if(mountOption.borderWidth > 0){
+ context.setLineWidth(mountOption.borderWidth * opts.pix);
+ context.closePath();
+ context.stroke();
+ }
+ context.fill();
+ }
+ };
+ break;
+ case 'triangle':
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i];
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+ var height = opts.height - item.y - opts.area[2];
+ context.beginPath();
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+ //透明渐变
+ if (mountOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ context.moveTo(startX, opts.height - opts.area[2]);
+ context.lineTo(item.x, item.y);
+ context.lineTo(startX + item.width, opts.height - opts.area[2]);
+ context.setStrokeStyle(strokeColor);
+ context.setFillStyle(fillColor);
+ if(mountOption.borderWidth > 0){
+ context.setLineWidth(mountOption.borderWidth * opts.pix);
+ context.stroke();
+ }
+ context.fill();
+ }
+ };
+ break;
+ case 'mount':
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i];
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+ var height = opts.height - item.y - opts.area[2];
+ context.beginPath();
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+ //透明渐变
+ if (mountOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ context.moveTo(startX, opts.height - opts.area[2]);
+ context.bezierCurveTo(item.x - item.width/4, opts.height - opts.area[2], item.x - item.width/4, item.y, item.x, item.y);
+ context.bezierCurveTo(item.x + item.width/4, item.y, item.x + item.width/4, opts.height - opts.area[2], startX + item.width, opts.height - opts.area[2]);
+ context.setStrokeStyle(strokeColor);
+ context.setFillStyle(fillColor);
+ if(mountOption.borderWidth > 0){
+ context.setLineWidth(mountOption.borderWidth * opts.pix);
+ context.stroke();
+ }
+ context.fill();
+ }
+ };
+ break;
+ case 'sharp':
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i];
+ if (item !== null && i > leftNum && i < rightNum) {
+ var startX = item.x - eachSpacing*mountOption.widthRatio/2;
+ var height = opts.height - item.y - opts.area[2];
+ context.beginPath();
+ var fillColor = item.color || series[i].color
+ var strokeColor = item.color || series[i].color
+ if (mountOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+ //透明渐变
+ if (mountOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(mountOption.customColor[series[i].linearIndex], mountOption.linearOpacity));
+ grd.addColorStop(mountOption.colorStop, hexToRgb(mountOption.customColor[series[i].linearIndex],mountOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ context.moveTo(startX, opts.height - opts.area[2]);
+ context.quadraticCurveTo(item.x - 0, opts.height - opts.area[2] - height/4, item.x, item.y);
+ context.quadraticCurveTo(item.x + 0, opts.height - opts.area[2] - height/4, startX + item.width, opts.height - opts.area[2])
+ context.setStrokeStyle(strokeColor);
+ context.setFillStyle(fillColor);
+ if(mountOption.borderWidth > 0){
+ context.setLineWidth(mountOption.borderWidth * opts.pix);
+ context.stroke();
+ }
+ context.fill();
+ }
+ };
+ break;
+ }
+
+ if (opts.dataLabel !== false && process === 1) {
+ let ranges, minRange, maxRange;
+ ranges = [].concat(opts.chartData.yAxisData.ranges[0]);
+ minRange = ranges.pop();
+ maxRange = ranges.shift();
+ var points = getMountDataPoints(series, minRange, maxRange, xAxisPoints, eachSpacing, opts, mountOption, process);
+ drawMountPointText(points, series, config, context, opts);
+ }
+ context.restore();
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: points,
+ eachSpacing: eachSpacing
+ };
+}
+
+function drawBarDataPoints(series, opts, config, context) {
+ let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ let yAxisPoints = [];
+ let eachSpacing = (opts.height - opts.area[0] - opts.area[2])/opts.categories.length;
+ for (let i = 0; i < opts.categories.length; i++) {
+ yAxisPoints.push(opts.area[0] + eachSpacing / 2 + eachSpacing * i);
+ }
+ let columnOption = assign({}, {
+ type: 'group',
+ width: eachSpacing / 2,
+ meterBorder: 4,
+ meterFillColor: '#FFFFFF',
+ barBorderCircle: false,
+ barBorderRadius: [],
+ seriesGap: 2,
+ linearType: 'none',
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ }, opts.extra.bar);
+ let calPoints = [];
+ context.save();
+ let leftNum = -2;
+ let rightNum = yAxisPoints.length + 2;
+ if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) {
+ drawBarToolTipSplitArea(opts.tooltip.offset.y, opts, config, context, eachSpacing);
+ }
+ columnOption.customColor = fillCustomColor(columnOption.linearType, columnOption.customColor, series, config);
+ series.forEach(function(eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange;
+ ranges = [].concat(opts.chartData.xAxisData.ranges);
+ maxRange = ranges.pop();
+ minRange = ranges.shift();
+ var data = eachSeries.data;
+ switch (columnOption.type) {
+ case 'group':
+ var points = getBarDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, process);
+ var tooltipPoints = getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+ calPoints.push(tooltipPoints);
+ points = fixBarData(points, eachSpacing, series.length, seriesIndex, config, opts);
+ for (let i = 0; i < points.length; i++) {
+ let item = points[i];
+ //fix issues/I27B1N yyoinge & Joeshu
+ if (item !== null && i > leftNum && i < rightNum) {
+ //var startX = item.x - item.width / 2;
+ var startX = opts.area[3];
+ var startY = item.y - item.width / 2;
+ var height = item.height;
+ context.beginPath();
+ var fillColor = item.color || eachSeries.color
+ var strokeColor = item.color || eachSeries.color
+ if (columnOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, item.x, item.y);
+ //透明渐变
+ if (columnOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity));
+ grd.addColorStop(columnOption.colorStop, hexToRgb(columnOption.customColor[eachSeries.linearIndex],columnOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle === true) {
+ const left = startX;
+ const width = item.width;
+ const top = item.y - item.width / 2;
+ const height = item.height;
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius;
+ let minRadius = Math.min(width/2,height/2);
+ r0 = r0 > minRadius ? minRadius : r0;
+ r1 = r1 > minRadius ? minRadius : r1;
+ r2 = r2 > minRadius ? minRadius : r2;
+ r3 = r3 > minRadius ? minRadius : r3;
+ r0 = r0 < 0 ? 0 : r0;
+ r1 = r1 < 0 ? 0 : r1;
+ r2 = r2 < 0 ? 0 : r2;
+ r3 = r3 < 0 ? 0 : r3;
+
+ context.arc(left + r3, top + r3, r3, -Math.PI, -Math.PI / 2);
+ context.arc(item.x - r0, top + r0, r0, -Math.PI / 2, 0);
+ context.arc(item.x - r1, top + width - r1, r1, 0, Math.PI / 2);
+ context.arc(left + r2, top + width - r2, r2, Math.PI / 2, Math.PI);
+ } else {
+ context.moveTo(startX, startY);
+ context.lineTo(item.x, startY);
+ context.lineTo(item.x, startY + item.width);
+ context.lineTo(startX, startY + item.width);
+ context.lineTo(startX, startY);
+ context.setLineWidth(1)
+ context.setStrokeStyle(strokeColor);
+ }
+ context.setFillStyle(fillColor);
+ context.closePath();
+ //context.stroke();
+ context.fill();
+ }
+ };
+ break;
+ case 'stack':
+ // 绘制堆叠数据图
+ var points = getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+ calPoints.push(points);
+ points = fixBarStackData(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();
+ var fillColor = item.color || eachSeries.color;
+ var startX = item.x0;
+ context.setFillStyle(fillColor);
+ context.moveTo(startX, item.y - item.width/2);
+ context.fillRect(startX, item.y - item.width/2, item.height , item.width);
+ context.closePath();
+ context.fill();
+ }
+ };
+ break;
+ }
+ });
+
+ if (opts.dataLabel !== false && process === 1) {
+ series.forEach(function(eachSeries, seriesIndex) {
+ let ranges, minRange, maxRange;
+ ranges = [].concat(opts.chartData.xAxisData.ranges);
+ maxRange = ranges.pop();
+ minRange = ranges.shift();
+ var data = eachSeries.data;
+ switch (columnOption.type) {
+ case 'group':
+ var points = getBarDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, process);
+ points = fixBarData(points, eachSpacing, series.length, seriesIndex, config, opts);
+ drawBarPointText(points, eachSeries, config, context, opts);
+ break;
+ case 'stack':
+ var points = getBarStackDataPoints(data, minRange, maxRange, yAxisPoints, eachSpacing, opts, config, seriesIndex, series, process);
+ drawBarPointText(points, eachSeries, config, context, opts);
+ break;
+ }
+ });
+ }
+ return {
+ yAxisPoints: yAxisPoints,
+ 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.color
+ }, 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 * 2 + 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,eachSeries);
+ 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,eachSeries);
+ 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.pix);
+ 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.pix);
+ 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 * 2 + 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,eachSeries);
+ 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.pix);
+ 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);
+ }
+ };
+ }
+ if (areaOption.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 (areaOption.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.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.pix;
+ context.setLineDash([dashLength, dashLength]);
+ }
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(areaOption.width * opts.pix);
+ 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);
+ }
+ };
+ }
+ if (areaOption.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 (areaOption.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, opts);
+ });
+ }
+ context.restore();
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing
+ };
+}
+
+function drawScatterDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var scatterOption = assign({}, {
+ type: 'circle'
+ }, opts.extra.scatter);
+ 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 * 2 + 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);
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setFillStyle(eachSeries.color);
+ context.setLineWidth(1 * opts.pix);
+ var shape = eachSeries.pointShape;
+ 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.pix, item.y);
+ context.arc(item.x, item.y, 3 * opts.pix, 0, 2 * Math.PI, false);
+ }
+ });
+ } else if (shape === 'square') {
+ 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);
+ }
+ });
+ } else if (shape === 'triangle') {
+ return;
+ }
+ context.closePath();
+ context.fill();
+ context.stroke();
+ });
+ 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, opts);
+ });
+ }
+ context.restore();
+ return {
+ xAxisPoints: xAxisPoints,
+ calPoints: calPoints,
+ eachSpacing: eachSpacing
+ };
+}
+
+function drawBubbleDataPoints(series, opts, config, context) {
+ var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;
+ var bubbleOption = assign({}, {
+ opacity: 1,
+ border:2
+ }, opts.extra.bubble);
+ 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 * 2 + 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);
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(bubbleOption.border * opts.pix);
+ context.setFillStyle(hexToRgb(eachSeries.color, bubbleOption.opacity));
+ points.forEach(function(item, index) {
+ context.moveTo(item.x + item.r, item.y);
+ context.arc(item.x, item.y, item.r * opts.pix, 0, 2 * Math.PI, false);
+ });
+ context.closePath();
+ context.fill();
+ context.stroke();
+
+ if (opts.dataLabel !== false && process === 1) {
+ points.forEach(function(item, index) {
+ context.beginPath();
+ var fontSize = series.textSize * opts.pix || config.fontSize;
+ context.setFontSize(fontSize);
+ context.setFillStyle(series.textColor || "#FFFFFF");
+ context.setTextAlign('center');
+ context.fillText(String(item.t), item.x, item.y + fontSize/2);
+ context.closePath();
+ context.stroke();
+ context.setTextAlign('left');
+ });
+ }
+ });
+ 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.pix;
+ 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 * 2 + 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,eachSeries);
+ if (eachSeries.lineType == 'dash') {
+ let dashLength = eachSeries.dashLength ? eachSeries.dashLength : 8;
+ dashLength *= opts.pix;
+ 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, opts);
+ });
+ }
+ 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 columnOption = assign({}, {
+ width: eachSpacing / 2,
+ barBorderCircle: false,
+ barBorderRadius: [],
+ seriesGap: 2,
+ linearType: 'none',
+ linearOpacity: 1,
+ customColor: [],
+ colorStop: 0,
+ }, opts.extra.mix.column);
+ let areaOption = assign({}, {
+ opacity: 0.2,
+ gradient: false
+ }, opts.extra.mix.area);
+ 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 * 2 + opts.area[3];
+ rightSpace = leftSpace + (opts.xAxis.itemCount + 4) * eachSpacing;
+ }
+ columnOption.customColor = fillCustomColor(columnOption.linearType, columnOption.customColor, series, config);
+ 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) {
+ var startX = item.x - item.width / 2;
+ var height = opts.height - item.y - opts.area[2];
+ context.beginPath();
+ var fillColor = item.color || eachSeries.color
+ var strokeColor = item.color || eachSeries.color
+ if (columnOption.linearType !== 'none') {
+ var grd = context.createLinearGradient(startX, item.y, startX, opts.height - opts.area[2]);
+ //透明渐变
+ if (columnOption.linearType == 'opacity') {
+ grd.addColorStop(0, hexToRgb(fillColor, columnOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ } else {
+ grd.addColorStop(0, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity));
+ grd.addColorStop(columnOption.colorStop, hexToRgb(columnOption.customColor[eachSeries.linearIndex], columnOption.linearOpacity));
+ grd.addColorStop(1, hexToRgb(fillColor, 1));
+ }
+ fillColor = grd
+ }
+ // 圆角边框
+ if ((columnOption.barBorderRadius && columnOption.barBorderRadius.length === 4) || columnOption.barBorderCircle) {
+ const left = startX;
+ const top = item.y;
+ const width = item.width;
+ const height = opts.height - opts.area[2] - item.y;
+ if (columnOption.barBorderCircle) {
+ columnOption.barBorderRadius = [width / 2, width / 2, 0, 0];
+ }
+ let [r0, r1, r2, r3] = columnOption.barBorderRadius;
+ let minRadius = Math.min(width/2,height/2);
+ r0 = r0 > minRadius ? minRadius : r0;
+ r1 = r1 > minRadius ? minRadius : r1;
+ r2 = r2 > minRadius ? minRadius : r2;
+ r3 = r3 > minRadius ? minRadius : r3;
+ r0 = r0 < 0 ? 0 : r0;
+ r1 = r1 < 0 ? 0 : r1;
+ r2 = r2 < 0 ? 0 : r2;
+ r3 = r3 < 0 ? 0 : r3;
+ context.arc(left + r0, top + r0, r0, -Math.PI, -Math.PI / 2);
+ context.arc(left + width - r1, top + r1, r1, -Math.PI / 2, 0);
+ context.arc(left + width - r2, top + height - r2, r2, 0, Math.PI / 2);
+ context.arc(left + r3, top + height - r3, r3, Math.PI / 2, Math.PI);
+ } else {
+ context.moveTo(startX, item.y);
+ context.lineTo(startX + item.width, item.y);
+ context.lineTo(startX + item.width, opts.height - opts.area[2]);
+ context.lineTo(startX, opts.height - opts.area[2]);
+ context.lineTo(startX, item.y);
+ context.setLineWidth(1)
+ context.setStrokeStyle(strokeColor);
+ }
+ context.setFillStyle(fillColor);
+ context.closePath();
+ context.fill();
+ }
+ }
+ columnIndex += 1;
+ }
+ //绘制区域图数据
+ if (eachSeries.type == 'area') {
+ let splitPointList = splitPoints(points,eachSeries);
+ for (let i = 0; i < splitPointList.length; i++) {
+ let points = splitPointList[i];
+ // 绘制区域数据
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ 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(2 * opts.pix);
+ 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,eachSeries);
+ splitPointList.forEach(function(points, index) {
+ if (eachSeries.lineType == 'dash') {
+ let dashLength = eachSeries.dashLength ? eachSeries.dashLength : 8;
+ dashLength *= opts.pix;
+ context.setLineDash([dashLength, dashLength]);
+ }
+ context.beginPath();
+ context.setStrokeStyle(eachSeries.color);
+ context.setLineWidth(2 * opts.pix);
+ 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, opts);
+ } else {
+ points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts);
+ drawPointText(points, eachSeries, config, context, opts);
+ 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 == 'mount' || 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 == 'bar' || opts.type == 'line' || opts.type == 'area'|| opts.type == 'scatter' || opts.type == 'bubble') {
+ 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);
+ if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
+ if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+ scrollTotalWidth += (opts.extra.mount.widthRatio - 1)*eachSpacing;
+ }
+ 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.pix);
+ 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.pix);
+ 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.pix);
+ xAxisPoints.forEach(function(item, index) {
+ if (index > 0) {
+ context.beginPath();
+ context.moveTo(item - eachSpacing / 2, startY);
+ context.lineTo(item - eachSpacing / 2, startY + 3 * opts.pix);
+ context.closePath();
+ context.stroke();
+ }
+ });
+ }
+ //绘制X轴网格
+ if (opts.xAxis.disableGrid !== true) {
+ context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc");
+ context.setLineCap('butt');
+ context.setLineWidth(1 * opts.pix);
+ if (opts.xAxis.gridType == 'dash') {
+ context.setLineDash([opts.xAxis.dashLength * opts.pix, opts.xAxis.dashLength * opts.pix]);
+ }
+ 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 * opts.pix || config.fontSize;
+ if (config._xAxisTextAngle_ === 0) {
+ newCategories.forEach(function(item, index) {
+ var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item,index,opts) : item;
+ var offset = -measureText(String(xitem), xAxisFontSize, context) / 2;
+ if (boundaryGap == 'center') {
+ offset += eachSpacing / 2;
+ }
+ var scrollHeight = 0;
+ if (opts.xAxis.scrollShow) {
+ scrollHeight = 6 * opts.pix;
+ }
+ context.beginPath();
+ context.setFontSize(xAxisFontSize);
+ context.setFillStyle(opts.xAxis.fontColor || opts.fontColor);
+ context.fillText(String(xitem), xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - scrollHeight - xAxisFontSize) / 2);
+ context.closePath();
+ context.stroke();
+ });
+ } else {
+ newCategories.forEach(function(item, index) {
+ var xitem = opts.xAxis.formatter ? opts.xAxis.formatter(item) : item;
+ context.save();
+ context.beginPath();
+ context.setFontSize(xAxisFontSize);
+ context.setFillStyle(opts.xAxis.fontColor || opts.fontColor);
+ var textWidth = measureText(String(xitem), xAxisFontSize, context);
+ var offsetX = xAxisPoints[index];
+ if (boundaryGap == 'center') {
+ offsetX = xAxisPoints[index] + eachSpacing / 2;
+ }
+ var scrollHeight = 0;
+ if (opts.xAxis.scrollShow) {
+ scrollHeight = 6 * opts.pix;
+ }
+ var offsetY = startY + 6 * opts.pix + xAxisFontSize - xAxisFontSize * Math.abs(Math.sin(config._xAxisTextAngle_));
+ if(opts.xAxis.rotateAngle < 0){
+ offsetX -= xAxisFontSize / 2;
+ textWidth = 0;
+ }else{
+ offsetX += xAxisFontSize / 2;
+ textWidth = -textWidth;
+ }
+ context.translate(offsetX, offsetY);
+ context.rotate(-1 * config._xAxisTextAngle_);
+ context.fillText(String(xitem), textWidth , 0 );
+ context.closePath();
+ context.stroke();
+ context.restore();
+ });
+ }
+ }
+ context.restore();
+ //绘制X轴轴线
+ if (opts.xAxis.axisLine) {
+ context.beginPath();
+ context.setStrokeStyle(opts.xAxis.axisLineColor);
+ context.setLineWidth(1 * opts.pix);
+ 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);
+ if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1 ){
+ if(opts.extra.mount.widthRatio>2) opts.extra.mount.widthRatio = 2
+ TotalWidth += (opts.extra.mount.widthRatio - 1)*xAxiseachSpacing;
+ }
+ let endX = startX + TotalWidth;
+ let points = [];
+ let startY = 1
+ if (opts.xAxis.axisLine === false) {
+ startY = 0
+ }
+ for (let i = startY; 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.pix, opts.yAxis.dashLength * opts.pix]);
+ }
+ context.setStrokeStyle(opts.yAxis.gridColor);
+ context.setLineWidth(1 * opts.pix);
+ 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.pix;
+ }
+ if (opts.xAxis.rotateLabel) {
+ fillEndY = opts.height - opts.area[2] + opts.fontSize * opts.pix / 2;
+ }
+ // set YAxis background
+ context.beginPath();
+ context.setFillStyle(opts.background);
+ if (opts.enableScroll == true && opts.xAxis.scrollPosition && opts.xAxis.scrollPosition !== 'left') {
+ context.fillRect(0, 0, startX, fillEndY);
+ }
+ if (opts.enableScroll == true && opts.xAxis.scrollPosition && opts.xAxis.scrollPosition !== 'right') {
+ context.fillRect(endX, 0, opts.width, fillEndY);
+ }
+ context.closePath();
+ context.stroke();
+
+ let tStartLeft = opts.area[3];
+ let tStartRight = opts.width - opts.area[1];
+ let tStartCenter = opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2;
+ if (opts.yAxis.data) {
+ for (let i = 0; i < opts.yAxis.data.length; i++) {
+ let yData = opts.yAxis.data[i];
+ var points = [];
+ if(yData.type === 'categories'){
+ for (let i = 0; i <= yData.categories.length; i++) {
+ points.push(opts.area[0] + spacingValid / yData.categories.length / 2 + spacingValid / yData.categories.length * i);
+ }
+ }else{
+ for (let i = 0; i <= opts.yAxis.splitNumber; i++) {
+ points.push(opts.area[0] + eachSpacing * i);
+ }
+ }
+ if (yData.disabled !== true) {
+ let rangesFormat = opts.chartData.yAxisData.rangesFormat[i];
+ let yAxisFontSize = yData.fontSize ? yData.fontSize * opts.pix : config.fontSize;
+ let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[i];
+ let textAlign = yData.textAlign || "right";
+ //画Y轴刻度及文案
+ rangesFormat.forEach(function(item, index) {
+ var pos = points[index];
+ context.beginPath();
+ context.setFontSize(yAxisFontSize);
+ context.setLineWidth(1 * opts.pix);
+ context.setStrokeStyle(yData.axisLineColor || '#cccccc');
+ context.setFillStyle(yData.fontColor || opts.fontColor);
+ let tmpstrat = 0;
+ let gapwidth = 4 * opts.pix;
+ if (yAxisWidth.position == 'left') {
+ //画刻度线
+ if (yData.calibration == true) {
+ context.moveTo(tStartLeft, pos);
+ context.lineTo(tStartLeft - 3 * opts.pix, pos);
+ gapwidth += 3 * opts.pix;
+ }
+ //画文字
+ switch (textAlign) {
+ case "left":
+ context.setTextAlign('left');
+ tmpstrat = tStartLeft - yAxisWidth.width
+ break;
+ case "right":
+ context.setTextAlign('right');
+ tmpstrat = tStartLeft - gapwidth
+ break;
+ default:
+ context.setTextAlign('center');
+ tmpstrat = tStartLeft - yAxisWidth.width / 2
+ }
+ context.fillText(String(item), tmpstrat, pos + yAxisFontSize / 2 - 3 * opts.pix);
+
+ } else if (yAxisWidth.position == 'right') {
+ //画刻度线
+ if (yData.calibration == true) {
+ context.moveTo(tStartRight, pos);
+ context.lineTo(tStartRight + 3 * opts.pix, pos);
+ gapwidth += 3 * opts.pix;
+ }
+ switch (textAlign) {
+ case "left":
+ context.setTextAlign('left');
+ tmpstrat = tStartRight + gapwidth
+ break;
+ case "right":
+ context.setTextAlign('right');
+ tmpstrat = tStartRight + yAxisWidth.width
+ break;
+ default:
+ context.setTextAlign('center');
+ tmpstrat = tStartRight + yAxisWidth.width / 2
+ }
+ context.fillText(String(item), tmpstrat, pos + yAxisFontSize / 2 - 3 * opts.pix);
+ } else if (yAxisWidth.position == 'center') {
+ //画刻度线
+ if (yData.calibration == true) {
+ context.moveTo(tStartCenter, pos);
+ context.lineTo(tStartCenter - 3 * opts.pix, pos);
+ gapwidth += 3 * opts.pix;
+ }
+ //画文字
+ switch (textAlign) {
+ case "left":
+ context.setTextAlign('left');
+ tmpstrat = tStartCenter - yAxisWidth.width
+ break;
+ case "right":
+ context.setTextAlign('right');
+ tmpstrat = tStartCenter - gapwidth
+ break;
+ default:
+ context.setTextAlign('center');
+ tmpstrat = tStartCenter - yAxisWidth.width / 2
+ }
+ context.fillText(String(item), tmpstrat, pos + yAxisFontSize / 2 - 3 * opts.pix);
+ }
+ context.closePath();
+ context.stroke();
+ context.setTextAlign('left');
+ });
+ //画Y轴轴线
+ if (yData.axisLine !== false) {
+ context.beginPath();
+ context.setStrokeStyle(yData.axisLineColor || '#cccccc');
+ context.setLineWidth(1 * opts.pix);
+ if (yAxisWidth.position == 'left') {
+ context.moveTo(tStartLeft, opts.height - opts.area[2]);
+ context.lineTo(tStartLeft, opts.area[0]);
+ } else if (yAxisWidth.position == 'right') {
+ context.moveTo(tStartRight, opts.height - opts.area[2]);
+ context.lineTo(tStartRight, opts.area[0]);
+ } else if (yAxisWidth.position == 'center') {
+ context.moveTo(tStartCenter, opts.height - opts.area[2]);
+ context.lineTo(tStartCenter, opts.area[0]);
+ }
+ context.stroke();
+ }
+ //画Y轴标题
+ if (opts.yAxis.showTitle) {
+ let titleFontSize = yData.titleFontSize * opts.pix || config.fontSize;
+ let title = yData.title;
+ context.beginPath();
+ context.setFontSize(titleFontSize);
+ context.setFillStyle(yData.titleFontColor || opts.fontColor);
+ if (yAxisWidth.position == 'left') {
+ context.fillText(title, tStartLeft - measureText(title, titleFontSize, context) / 2 + (yData.titleOffsetX || 0), opts.area[0] - (10 - (yData.titleOffsetY || 0)) * opts.pix);
+ } else if (yAxisWidth.position == 'right') {
+ context.fillText(title, tStartRight - measureText(title, titleFontSize, context) / 2 + (yData.titleOffsetX || 0), opts.area[0] - (10 - (yData.titleOffsetY || 0)) * opts.pix);
+ } else if (yAxisWidth.position == 'center') {
+ context.fillText(title, tStartCenter - measureText(title, titleFontSize, context) / 2 + (yData.titleOffsetX || 0), opts.area[0] - (10 - (yData.titleOffsetY || 0)) * opts.pix);
+ }
+ context.closePath();
+ context.stroke();
+ }
+ if (yAxisWidth.position == 'left') {
+ tStartLeft -= (yAxisWidth.width + opts.yAxis.padding * opts.pix);
+ } else {
+ tStartRight += yAxisWidth.width + opts.yAxis.padding * opts.pix;
+ }
+ }
+ }
+ }
+
+}
+
+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 * opts.pix;
+ let fontSize = opts.legend.fontSize * opts.pix;
+ let shapeWidth = 15 * opts.pix;
+ let shapeRight = 5 * opts.pix;
+ let itemGap = opts.legend.itemGap * opts.pix;
+ let lineHeight = Math.max(opts.legend.lineHeight * opts.pix, fontSize);
+ //画背景及边框
+ context.beginPath();
+ context.setLineWidth(opts.legend.borderWidth * opts.pix);
+ 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') {
+ switch (opts.legend.float) {
+ case 'left':
+ startX = legendArea.start.x + padding;
+ break;
+ case 'right':
+ startX = legendArea.start.x + legendArea.width - width;
+ break;
+ default:
+ 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.pix);
+ 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.pix);
+ context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pix, 15 * opts.pix, 4 * opts.pix);
+ break;
+ case 'triangle':
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix);
+ context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * lineHeight + 5 * opts.pix);
+ context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * lineHeight + 5 * opts.pix);
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix);
+ break;
+ case 'diamond':
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix);
+ context.lineTo(startX + 2.5 * opts.pix, startY + 0.5 * lineHeight);
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight + 5 * opts.pix);
+ context.lineTo(startX + 12.5 * opts.pix, startY + 0.5 * lineHeight);
+ context.lineTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix);
+ break;
+ case 'circle':
+ context.moveTo(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight);
+ context.arc(startX + 7.5 * opts.pix, startY + 0.5 * lineHeight, 5 * opts.pix, 0, 2 * Math.PI);
+ break;
+ case 'rect':
+ context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pix);
+ context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix);
+ break;
+ case 'square':
+ context.moveTo(startX + 5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix);
+ context.fillRect(startX + 5 * opts.pix, startY + 0.5 * lineHeight - 5 * opts.pix, 10 * opts.pix, 10 * opts.pix);
+ break;
+ case 'none':
+ break;
+ default:
+ context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pix);
+ context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pix, 15 * opts.pix, 10 * opts.pix);
+ }
+ context.closePath();
+ context.fill();
+ context.stroke();
+ startX += shapeWidth + shapeRight;
+ let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2;
+ const legendText = item.legendText ? item.legendText : item.name;
+ context.beginPath();
+ context.setFontSize(fontSize);
+ context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor);
+ context.fillText(legendText, startX, startY + fontTrans);
+ context.closePath();
+ context.stroke();
+ if (opts.legend.position == 'top' || opts.legend.position == 'bottom') {
+ startX += measureText(legendText, fontSize, context) + itemGap;
+ item.area[2] = startX;
+ } else {
+ item.area[2] = startX + measureText(legendText, fontSize, context) + 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,
+ offsetAngle: 0,
+ labelWidth: 15,
+ ringWidth: 30,
+ customRadius: 0,
+ border: false,
+ borderWidth: 2,
+ borderColor: '#FFFFFF',
+ centerColor: '#FFFFFF',
+ linearType: 'none',
+ customColor: [],
+ }, opts.type == "pie" ? opts.extra.pie : opts.extra.ring);
+ 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 * opts.pix;
+ }
+
+ 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);
+ radius = radius < 10 ? 10 : radius;
+ if (pieOption.customRadius > 0) {
+ radius = pieOption.customRadius * opts.pix;
+ }
+ series = getPieDataPoints(series, radius, process);
+ var activeRadius = pieOption.activeRadius * opts.pix;
+ pieOption.customColor = fillCustomColor(pieOption.linearType, pieOption.customColor, series, config);
+ 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, pieOption.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.pix);
+ context.lineJoin = "round";
+ context.setStrokeStyle(pieOption.borderColor);
+ var fillcolor = eachSeries.color;
+ if (pieOption.linearType == 'custom') {
+ var grd;
+ if(context.createCircularGradient){
+ grd = context.createCircularGradient(centerPosition.x, centerPosition.y, eachSeries._radius_)
+ }else{
+ grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0,centerPosition.x, centerPosition.y, eachSeries._radius_)
+ }
+ grd.addColorStop(0, hexToRgb(pieOption.customColor[eachSeries.linearIndex], 1))
+ grd.addColorStop(1, hexToRgb(eachSeries.color, 1))
+ fillcolor = grd
+ }
+ context.setFillStyle(fillcolor);
+ 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 pieOption.ringWidth === 'number' && pieOption.ringWidth > 0) {
+ innerPieWidth = Math.max(0, radius - pieOption.ringWidth * opts.pix);
+ }
+ context.beginPath();
+ context.setFillStyle(pieOption.centerColor);
+ 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) {
+ 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,
+ offsetAngle: 0,
+ labelWidth: 15,
+ border: false,
+ borderWidth: 2,
+ borderColor: '#FFFFFF',
+ linearType: 'none',
+ customColor: [],
+ }, opts.extra.rose);
+ if (config.pieChartLinePadding == 0) {
+ config.pieChartLinePadding = roseOption.activeRadius * opts.pix;
+ }
+ 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);
+ radius = radius < 10 ? 10 : radius;
+ var minRadius = roseOption.minRadius || radius * 0.5;
+ series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process);
+ var activeRadius = roseOption.activeRadius * opts.pix;
+ roseOption.customColor = fillCustomColor(roseOption.linearType, roseOption.customColor, series, config);
+ 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.pix);
+ context.lineJoin = "round";
+ context.setStrokeStyle(roseOption.borderColor);
+ var fillcolor = eachSeries.color;
+ if (roseOption.linearType == 'custom') {
+ var grd;
+ if(context.createCircularGradient){
+ grd = context.createCircularGradient(centerPosition.x, centerPosition.y, eachSeries._radius_)
+ }else{
+ grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0,centerPosition.x, centerPosition.y, eachSeries._radius_)
+ }
+ grd.addColorStop(0, hexToRgb(roseOption.customColor[eachSeries.linearIndex], 1))
+ grd.addColorStop(1, hexToRgb(eachSeries.color, 1))
+ fillcolor = grd
+ }
+ context.setFillStyle(fillcolor);
+ 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) {
+ 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',
+ lineCap: 'round',
+ width: 12 ,
+ gap: 2 ,
+ linearType: 'none',
+ customColor: [],
+ }, opts.extra.arcbar);
+ series = getArcbarDataPoints(series, arcbarOption, process);
+ var centerPosition;
+ if (arcbarOption.centerX || arcbarOption.centerY) {
+ centerPosition = {
+ x: arcbarOption.centerX ? arcbarOption.centerX : opts.width / 2,
+ y: arcbarOption.centerY ? arcbarOption.centerY : opts.height / 2
+ };
+ } 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.pix;
+ radius -= arcbarOption.width / 2;
+ }
+ radius = radius < 10 ? 10 : radius;
+ arcbarOption.customColor = fillCustomColor(arcbarOption.linearType, arcbarOption.customColor, series, config);
+
+ for (let i = 0; i < series.length; i++) {
+ let eachSeries = series[i];
+ //背景颜色
+ context.setLineWidth(arcbarOption.width * opts.pix);
+ context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9');
+ context.setLineCap(arcbarOption.lineCap);
+ context.beginPath();
+ if (arcbarOption.type == 'default') {
+ context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, false);
+ } else {
+ context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * i, 0, 2 * Math.PI, false);
+ }
+ context.stroke();
+ //进度条
+ var fillColor = eachSeries.color
+ if(arcbarOption.linearType == 'custom'){
+ var grd = context.createLinearGradient(centerPosition.x - radius, centerPosition.y, centerPosition.x + radius, centerPosition.y);
+ grd.addColorStop(1, hexToRgb(arcbarOption.customColor[eachSeries.linearIndex], 1))
+ grd.addColorStop(0, hexToRgb(eachSeries.color, 1))
+ fillColor = grd;
+ }
+ context.setLineWidth(arcbarOption.width * opts.pix);
+ context.setStrokeStyle(fillColor);
+ context.setLineCap(arcbarOption.lineCap);
+ context.beginPath();
+ context.arc(centerPosition.x, centerPosition.y, radius - (arcbarOption.width * opts.pix + arcbarOption.gap * opts.pix) * 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,
+ labelOffset:13,
+ 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.pix;
+ radius -= gaugeOption.width / 2;
+ radius = radius < 10 ? 10 : radius;
+ 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.pix);
+ context.moveTo(startX, 0);
+ context.lineTo(endX, 0);
+ context.stroke();
+ context.rotate(childAngle * Math.PI);
+ }
+ context.restore();
+ //## 第三步画进度条
+ series = getGaugeArcbarDataPoints(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.pix);
+ 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.pix);
+ 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',
+ gridEval:1,
+ axisLabel:false,
+ axisLabelTofix:0,
+ labelColor:'#666666',
+ labelPointShow:false,
+ labelPointRadius:3,
+ labelPointColor:'#cccccc',
+ opacity: 0.2,
+ gridCount: 3,
+ border:false,
+ borderWidth:2,
+ linearType: 'none',
+ customColor: [],
+ }, 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 xr = (opts.width - opts.area[1] - opts.area[3]) / 2
+ var yr = (opts.height - opts.area[0] - opts.area[2]) / 2
+ var radius = Math.min(xr - (getMaxTextListLength(opts.categories, config.fontSize, context) + config.radarLabelTextMargin), yr - config.radarLabelTextMargin);
+ radius -= config.radarLabelTextMargin * opts.pix;
+ radius = radius < 10 ? 10 : radius;
+ // 画分割线
+ context.beginPath();
+ context.setLineWidth(1 * opts.pix);
+ context.setStrokeStyle(radarOption.gridColor);
+ coordinateAngle.forEach(function(angle,index) {
+ var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition);
+ context.moveTo(centerPosition.x, centerPosition.y);
+ if (index % radarOption.gridEval == 0) {
+ context.lineTo(pos.x, pos.y);
+ }
+ });
+ context.stroke();
+ context.closePath();
+
+ // 画背景网格
+ var _loop = function _loop(i) {
+ var startPos = {};
+ context.beginPath();
+ context.setLineWidth(1 * opts.pix);
+ 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);
+ }
+ radarOption.customColor = fillCustomColor(radarOption.linearType, radarOption.customColor, series, config);
+ var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process);
+ radarDataPoints.forEach(function(eachSeries, seriesIndex) {
+ // 绘制区域数据
+ context.beginPath();
+ context.setLineWidth(radarOption.borderWidth * opts.pix);
+ context.setStrokeStyle(eachSeries.color);
+
+ var fillcolor = hexToRgb(eachSeries.color, radarOption.opacity);
+ if (radarOption.linearType == 'custom') {
+ var grd;
+ if(context.createCircularGradient){
+ grd = context.createCircularGradient(centerPosition.x, centerPosition.y, radius)
+ }else{
+ grd = context.createRadialGradient(centerPosition.x, centerPosition.y, 0,centerPosition.x, centerPosition.y, radius)
+ }
+ grd.addColorStop(0, hexToRgb(radarOption.customColor[series[seriesIndex].linearIndex], radarOption.opacity))
+ grd.addColorStop(1, hexToRgb(eachSeries.color, radarOption.opacity))
+ fillcolor = grd
+ }
+
+ context.setFillStyle(fillcolor);
+ 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(radarOption.border === true){
+ context.stroke();
+ }
+ context.closePath();
+ if (opts.dataPointShape !== false) {
+ var points = eachSeries.data.map(function(item) {
+ return item.position;
+ });
+ drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts);
+ }
+ });
+ // 画刻度值
+ if(radarOption.axisLabel === true){
+ const maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series)));
+ const stepLength = radius / radarOption.gridCount;
+ const fontSize = opts.fontSize * opts.pix;
+ context.setFontSize(fontSize);
+ context.setFillStyle(opts.fontColor);
+ context.setTextAlign('left');
+ for (var i = 0; i < radarOption.gridCount + 1; i++) {
+ let label = i * maxData / radarOption.gridCount;
+ label = label.toFixed(radarOption.axisLabelTofix);
+ context.fillText(String(label), centerPosition.x + 3 * opts.pix, centerPosition.y - i * stepLength + fontSize / 2);
+ }
+ }
+
+ // draw label text
+ drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context);
+
+ // draw dataLabel
+ if (opts.dataLabel !== false && process === 1) {
+ radarDataPoints.forEach(function(eachSeries, seriesIndex) {
+ context.beginPath();
+ var fontSize = eachSeries.textSize * opts.pix || config.fontSize;
+ context.setFontSize(fontSize);
+ context.setFillStyle(eachSeries.textColor || opts.fontColor);
+ eachSeries.data.forEach(function(item, index) {
+ //如果是中心点垂直的上下点位
+ if(Math.abs(item.position.x - centerPosition.x)<2){
+ //如果在上面
+ if(item.position.y < centerPosition.y){
+ context.setTextAlign('center');
+ context.fillText(item.value, item.position.x, item.position.y - 4);
+ }else{
+ context.setTextAlign('center');
+ context.fillText(item.value, item.position.x, item.position.y + fontSize + 2);
+ }
+ }else{
+ //如果在左侧
+ if(item.position.x < centerPosition.x){
+ context.setTextAlign('right');
+ context.fillText(item.value, item.position.x - 4, item.position.y + fontSize / 2 - 2);
+ }else{
+ context.setTextAlign('left');
+ context.fillText(item.value, item.position.x + 4, item.position.y + fontSize / 2 - 2);
+ }
+ }
+ });
+ context.closePath();
+ context.stroke();
+ });
+ context.setTextAlign('left');
+ }
+
+ return {
+ center: centerPosition,
+ radius: radius,
+ angleList: coordinateAngle
+ };
+}
+
+// 经纬度转墨卡托
+function lonlat2mercator(longitude, latitude) {
+ var mercator = Array(2);
+ var x = longitude * 20037508.34 / 180;
+ var y = Math.log(Math.tan((90 + latitude) * Math.PI / 360)) / (Math.PI / 180);
+ y = y * 20037508.34 / 180;
+ mercator[0] = x;
+ mercator[1] = y;
+ return mercator;
+}
+
+// 墨卡托转经纬度
+function mercator2lonlat(longitude, latitude) {
+ var lonlat = Array(2)
+ var x = longitude / 20037508.34 * 180;
+ var y = latitude / 20037508.34 * 180;
+ y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2);
+ lonlat[0] = x;
+ lonlat[1] = y;
+ return lonlat;
+}
+
+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, mercator) {
+ 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 (mercator) {
+ s_poi = lonlat2mercator(epoly[j][0], epoly[j][1]);
+ e_poi = lonlat2mercator(epoly[j + 1][0], epoly[j + 1][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,
+ mercator: false,
+ 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);
+ if (mapOption.mercator) {
+ var max = lonlat2mercator(bounds.xMax, bounds.yMax)
+ var min = lonlat2mercator(bounds.xMin, bounds.yMin)
+ bounds.xMax = max[0]
+ bounds.yMax = max[1]
+ bounds.xMin = min[0]
+ bounds.yMin = min[1]
+ }
+ 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;
+ for (var i = 0; i < data.length; i++) {
+ context.beginPath();
+ context.setLineWidth(mapOption.borderWidth * opts.pix);
+ 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++) {
+ var gaosi = Array(2);
+ if (mapOption.mercator) {
+ gaosi = lonlat2mercator(coords[j][0], coords[j][1])
+ } else {
+ gaosi = coords[j]
+ }
+ point = coordinateToPoint(gaosi[1], gaosi[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) {
+ for (var i = 0; i < data.length; i++) {
+ var centerPoint = data[i].properties.centroid;
+ if (centerPoint) {
+ if (mapOption.mercator) {
+ centerPoint = lonlat2mercator(data[i].properties.centroid[0], data[i].properties.centroid[1])
+ }
+ point = coordinateToPoint(centerPoint[1], centerPoint[0], bounds, scale, xoffset, yoffset);
+ let fontSize = data[i].textSize * opts.pix || config.fontSize;
+ let text = data[i].properties.name;
+ context.beginPath();
+ context.setFontSize(fontSize)
+ context.setFillStyle(data[i].textColor || opts.fontColor)
+ context.fillText(text, point.x - measureText(text, fontSize, context) / 2, point.y + fontSize / 2);
+ context.closePath();
+ context.stroke();
+ }
+ }
+ }
+ opts.chartData.mapData = {
+ bounds: bounds,
+ scale: scale,
+ xoffset: xoffset,
+ yoffset: yoffset,
+ mercator: mapOption.mercator
+ }
+ drawToolTipBridge(opts, config, context, 1);
+ context.draw();
+}
+
+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 getWordCloudPoint(opts, type, context) {
+ let points = opts.series;
+ switch (type) {
+ case 'normal':
+ for (let i = 0; i < points.length; i++) {
+ let text = points[i].name;
+ let tHeight = points[i].textSize * opts.pix;
+ let tWidth = measureText(text, tHeight, context);
+ 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 * opts.pix;
+ let tWidth = measureText(text, tHeight, context);
+ 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);
+ if (!opts.chartData.wordCloudData) {
+ opts.chartData.wordCloudData = getWordCloudPoint(opts, wordOption.type, context);
+ }
+ context.beginPath();
+ context.setFillStyle(opts.background);
+ 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 * opts.pix;
+ let tWidth = measureText(text, tHeight, context);
+ 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({}, {
+ type:'funnel',
+ activeWidth: 10,
+ activeOpacity: 0.3,
+ border: false,
+ borderWidth: 2,
+ borderColor: '#FFFFFF',
+ fillOpacity: 1,
+ labelAlign: 'right',
+ linearType: 'none',
+ customColor: [],
+ }, 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 * opts.pix;
+ 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, funnelOption.type, eachSpacing, process);
+ context.save();
+ context.translate(centerPosition.x, centerPosition.y);
+ funnelOption.customColor = fillCustomColor(funnelOption.linearType, funnelOption.customColor, series, config);
+ if(funnelOption.type == 'pyramid'){
+ for (let i = 0; i < series.length; i++) {
+ if (i == series.length -1) {
+ if (opts.tooltip) {
+ if (opts.tooltip.index == i) {
+ context.beginPath();
+ context.setFillStyle(hexToRgb(series[i].color, funnelOption.activeOpacity));
+ context.moveTo(-activeWidth, -eachSpacing);
+ context.lineTo(-series[i].radius - activeWidth, 0);
+ context.lineTo(series[i].radius + activeWidth, 0);
+ context.lineTo(activeWidth, -eachSpacing);
+ context.lineTo(-activeWidth, -eachSpacing);
+ 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.pix);
+ context.setStrokeStyle(funnelOption.borderColor);
+ var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+ if (funnelOption.linearType == 'custom') {
+ var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
+ grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
+ grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor);
+ context.moveTo(0, -eachSpacing);
+ context.lineTo(-series[i].radius, 0);
+ context.lineTo(series[i].radius, 0);
+ context.lineTo(0, -eachSpacing);
+ 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].radius - activeWidth, 0);
+ context.lineTo(-series[i + 1].radius - activeWidth, -eachSpacing);
+ context.lineTo(series[i + 1].radius + activeWidth, -eachSpacing);
+ context.lineTo(series[i].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.pix);
+ context.setStrokeStyle(funnelOption.borderColor);
+ var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+ if (funnelOption.linearType == 'custom') {
+ var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
+ grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
+ grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor);
+ context.moveTo(0, 0);
+ context.lineTo(-series[i].radius, 0);
+ context.lineTo(-series[i + 1].radius, -eachSpacing);
+ context.lineTo(series[i + 1].radius, -eachSpacing);
+ context.lineTo(series[i].radius, 0);
+ context.lineTo(0, 0);
+ context.closePath();
+ context.fill();
+ if (funnelOption.border == true) {
+ context.stroke();
+ }
+ }
+ context.translate(0, -eachSpacing)
+ }
+ }else{
+ 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.pix);
+ context.setStrokeStyle(funnelOption.borderColor);
+ var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+ if (funnelOption.linearType == 'custom') {
+ var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
+ grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
+ grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor);
+ 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.pix);
+ context.setStrokeStyle(funnelOption.borderColor);
+ var fillColor = hexToRgb(series[i].color, funnelOption.fillOpacity);
+ if (funnelOption.linearType == 'custom') {
+ var grd = context.createLinearGradient(series[i].radius, -eachSpacing, -series[i].radius, -eachSpacing);
+ grd.addColorStop(0, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ grd.addColorStop(0.5, hexToRgb(funnelOption.customColor[series[i].linearIndex], funnelOption.fillOpacity));
+ grd.addColorStop(1, hexToRgb(series[i].color, funnelOption.fillOpacity));
+ fillColor = grd
+ }
+ context.setFillStyle(fillColor);
+ 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];
+ if(item.labelShow === false){
+ continue;
+ }
+ let startX, endX, startY, fontSize;
+ let text = item.formatter ? item.formatter(item,i,series,opts) : util.toFixed(item._proportion_ * 100) + '%';
+ text = item.labelText ? item.labelText : text;
+ if (labelAlign == 'right') {
+ if(opts.extra.funnel.type === 'pyramid'){
+ if (i == series.length -1) {
+ startX = (item.funnelArea[2] + centerPosition.x) / 2;
+ } else {
+ startX = (item.funnelArea[2] + series[i + 1].funnelArea[2]) / 2;
+ }
+ }else{
+ 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.pix || opts.fontSize * opts.pix;
+ context.setLineWidth(1 * opts.pix);
+ 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 * opts.pix, 0, 2 * Math.PI);
+ context.closePath();
+ context.fill();
+ context.beginPath();
+ context.setFontSize(fontSize);
+ context.setFillStyle(item.textColor || opts.fontColor);
+ context.fillText(text, endX + 5, startY + fontSize / 2 - 2);
+ context.closePath();
+ context.stroke();
+ context.closePath();
+ } else {
+ if(opts.extra.funnel.type === 'pyramid'){
+ if (i == series.length -1) {
+ startX = (item.funnelArea[0] + centerPosition.x) / 2;
+ } else {
+ startX = (item.funnelArea[0] + series[i + 1].funnelArea[0]) / 2;
+ }
+ }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.pix || opts.fontSize * opts.pix;
+ context.setLineWidth(1 * opts.pix);
+ 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 || opts.fontColor);
+ context.fillText(text, endX - 5 - measureText(text, fontSize, context), 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 || 'easeInOut';
+ 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);
+}
+
+Animation.prototype.stop = function() {
+ this.isStop = true;
+};
+
+function drawCharts(type, opts, config, context) {
+ var _this = this;
+ var series = opts.series;
+ //兼容ECharts饼图类数据格式
+ if (type === 'pie' || type === 'ring' || type === 'mount' || type === 'rose' || type === 'funnel') {
+ series = fixPieSeries(series, opts, config);
+ }
+ var categories = opts.categories;
+ if (type === 'mount') {
+ categories = [];
+ for (let j = 0; j < series.length; j++) {
+ if(series[j].show !== false) categories.push(series[j].name)
+ }
+ opts.categories = 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] * opts.pix;
+ }
+ //通过计算三大区域:图例、X轴、Y轴的大小,确定绘图区域
+ var _calLegendData = calLegendData(seriesMA, opts, config, opts.chartData, context),
+ 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 === 'mount' || opts.type === 'area' || opts.type === 'mix' || opts.type === 'candle' || opts.type === 'scatter' || opts.type === 'bubble' || opts.type === 'bar') {
+ _calYAxisData = calYAxisData(series, opts, config, context);
+ 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 * opts.pix : config.fontSize)
+ }
+ opts.area[0] += maxTitleHeight;
+ }
+ 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 * opts.pix;
+ } else {
+ opts.area[3] += yAxisWidth[i].width;
+ }
+ leftIndex += 1;
+ } else if (yAxisWidth[i].position == 'right') {
+ if (rightIndex > 0) {
+ opts.area[1] += yAxisWidth[i].width + opts.yAxis.padding * opts.pix;
+ } else {
+ opts.area[1] += yAxisWidth[i].width;
+ }
+ rightIndex += 1;
+ }
+ }
+ } else {
+ config.yAxisWidth = yAxisWidth;
+ }
+ opts.chartData.yAxisData = _calYAxisData;
+
+ if (opts.categories && opts.categories.length && opts.type !== 'radar' && opts.type !== 'gauge' && opts.type !== 'bar') {
+ opts.chartData.xAxisData = getXAxisPoints(opts.categories, opts, config);
+ let _calCategoriesData = calCategoriesData(opts.categories, opts, config, opts.chartData.xAxisData.eachSpacing, context),
+ 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 === 'scatter' || opts.type === 'bubble' || opts.type === 'bar') {
+ opts.chartData.xAxisData = calXAxisData(series, opts, config, context);
+ categories = opts.chartData.xAxisData.rangesFormat;
+ let _calCategoriesData = calCategoriesData(categories, opts, config, opts.chartData.xAxisData.eachSpacing, context),
+ 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;
+ _this.scrollOption.startTouchX = offsetLeft;
+ _this.scrollOption.distance = 0;
+ _this.scrollOption.lastMoveTime = 0;
+ opts._scrollDistance_ = offsetLeft;
+ }
+
+ if (type === 'pie' || type === 'ring' || type === 'rose') {
+ config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA, config, context, opts);
+ }
+
+ switch (type) {
+ case 'word':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.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: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'line':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'scatter':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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 _drawScatterDataPoints = drawScatterDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawScatterDataPoints.xAxisPoints,
+ calPoints = _drawScatterDataPoints.calPoints,
+ eachSpacing = _drawScatterDataPoints.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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'bubble':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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 _drawBubbleDataPoints = drawBubbleDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawBubbleDataPoints.xAxisPoints,
+ calPoints = _drawBubbleDataPoints.calPoints,
+ eachSpacing = _drawBubbleDataPoints.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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'mix':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'column':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'mount':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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 _drawMountDataPoints = drawMountDataPoints(series, opts, config, context, process),
+ xAxisPoints = _drawMountDataPoints.xAxisPoints,
+ calPoints = _drawMountDataPoints.calPoints,
+ eachSpacing = _drawMountDataPoints.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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'bar':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ duration: duration,
+ onProcess: function onProcess(process) {
+ context.clearRect(0, 0, opts.width, opts.height);
+ if (opts.rotate) {
+ contextRotate(context, opts);
+ }
+ drawXAxis(categories, opts, config, context);
+ var _drawBarDataPoints = drawBarDataPoints(series, opts, config, context, process),
+ yAxisPoints = _drawBarDataPoints.yAxisPoints,
+ calPoints = _drawBarDataPoints.calPoints,
+ eachSpacing = _drawBarDataPoints.eachSpacing;
+ opts.chartData.yAxisPoints = yAxisPoints;
+ opts.chartData.xAxisPoints = opts.chartData.xAxisData.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, yAxisPoints);
+ drawCanvas(opts, context);
+ },
+ onAnimationFinish: function onAnimationFinish() {
+ _this.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'area':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'ring':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'pie':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'rose':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'radar':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'arcbar':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'gauge':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ case 'candle':
+ this.animationInstance = new Animation({
+ timing: opts.timing,
+ 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.uevent.trigger('renderComplete');
+ }
+ });
+ break;
+ }
+}
+
+function uChartsEvent() {
+ this.events = {};
+}
+
+uChartsEvent.prototype.addEventListener = function(type, listener) {
+ this.events[type] = this.events[type] || [];
+ this.events[type].push(listener);
+};
+
+uChartsEvent.prototype.delEventListener = function(type) {
+ this.events[type] = [];
+};
+
+uChartsEvent.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.log('[uCharts] '+e);
+ }
+ });
+ }
+};
+
+var uCharts = function uCharts(opts) {
+ opts.pix = opts.pixelRatio ? opts.pixelRatio : 1;
+ opts.fontSize = opts.fontSize ? opts.fontSize : 13;
+ opts.fontColor = opts.fontColor ? opts.fontColor : config.fontColor;
+ if (opts.background == "" || opts.background == "none") {
+ opts.background = "#FFFFFF"
+ }
+ 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.pix,
+ gridColor: '#cccccc',
+ padding: 10,
+ fontColor: '#666666'
+ }, opts.yAxis);
+ opts.xAxis = assign({}, {
+ rotateLabel: false,
+ rotateAngle:45,
+ disabled: false,
+ disableGrid: false,
+ splitNumber: 5,
+ calibration:false,
+ gridType: 'solid',
+ dashLength: 4,
+ scrollAlign: 'left',
+ boundaryGap: 'center',
+ axisLine: true,
+ axisLineColor: '#cccccc'
+ }, opts.xAxis);
+ opts.xAxis.scrollPosition = opts.xAxis.scrollAlign;
+ 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: opts.fontColor,
+ formatter: {},
+ hiddenColor: '#CECECE'
+ }, opts.legend);
+ 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 = assign({}, config);
+ config$$1.color = opts.color ? opts.color : config$$1.color;
+ if (opts.type == 'pie') {
+ config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix;
+ }
+ if (opts.type == 'ring') {
+ config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.ring.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix;
+ }
+ if (opts.type == 'rose') {
+ config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pix || config$$1.pieChartLinePadding * opts.pix;
+ }
+ config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pix;
+
+ //屏幕旋转
+ 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;
+ config$$1.yAxisWidth = config.yAxisWidth * opts.pix;
+ config$$1.xAxisHeight = config.xAxisHeight * opts.pix;
+ if (opts.enableScroll && opts.xAxis.scrollShow) {
+ config$$1.xAxisHeight += 6 * opts.pix;
+ }
+ config$$1.fontSize = opts.fontSize * opts.pix;
+ config$$1.titleFontSize = config.titleFontSize * opts.pix;
+ config$$1.subtitleFontSize = config.subtitleFontSize * opts.pix;
+ config$$1.toolTipPadding = config.toolTipPadding * opts.pix;
+ config$$1.toolTipLineHeight = config.toolTipLineHeight * opts.pix;
+ if(!opts.context){
+ throw new Error('[uCharts] 未获取到context!注意:v2.0版本后,需要自行获取canvas的绘图上下文并传入opts.context!');
+ }
+ this.context = opts.context;
+ if (!this.context.setTextAlign) {
+ 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.setTextAlign = function(e) {
+ return this.textAlign = e;
+ }
+ this.context.draw = function() {}
+ }
+ //兼容NVUEsetLineDash
+ if(!this.context.setLineDash){
+ this.context.setLineDash = function(e) {}
+ }
+ opts.chartData = {};
+ this.uevent = new uChartsEvent();
+ 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);
+};
+
+uCharts.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, this.context), 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);
+};
+
+uCharts.prototype.zoom = function() {
+ var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount;
+ if (this.opts.enableScroll !== true) {
+ console.log('[uCharts] 请启用滚动条后使用')
+ 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, this.context),
+ 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: 0,
+ distance: 0,
+ lastMoveTime: 0
+ };
+ calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts);
+ this.opts._scrollDistance_ = offsetLeft;
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+};
+
+uCharts.prototype.dobuleZoom = function(e) {
+ if (this.opts.enableScroll !== true) {
+ console.log('[uCharts] 请启用滚动条后使用')
+ return;
+ }
+ const tcs = e.changedTouches;
+ if (tcs.length < 2) {
+ return;
+ }
+ for (var i = 0; i < tcs.length; i++) {
+ tcs[i].x = tcs[i].x ? tcs[i].x : tcs[i].clientX;
+ tcs[i].y = tcs[i].y ? tcs[i].y : tcs[i].clientY;
+ }
+ const ntcs = [getTouches(tcs[0], this.opts, e),getTouches(tcs[1], this.opts, e)];
+ const xlength = Math.abs(ntcs[0].x - ntcs[1].x);
+ // 记录初始的两指之间的数据
+ if(!this.scrollOption.moveCount){
+ let cts0 = {changedTouches:[{x:tcs[0].x,y:this.opts.area[0] / this.opts.pix + 2}]};
+ let cts1 = {changedTouches:[{x:tcs[1].x,y:this.opts.area[0] / this.opts.pix + 2}]};
+ if(this.opts.rotate){
+ cts0 = {changedTouches:[{x:this.opts.height / this.opts.pix - this.opts.area[0] / this.opts.pix - 2,y:tcs[0].y}]};
+ cts1 = {changedTouches:[{x:this.opts.height / this.opts.pix - this.opts.area[0] / this.opts.pix - 2,y:tcs[1].y}]};
+ }
+ const moveCurrent1 = this.getCurrentDataIndex(cts0).index;
+ const moveCurrent2 = this.getCurrentDataIndex(cts1).index;
+ const moveCount = Math.abs(moveCurrent1 - moveCurrent2);
+ this.scrollOption.moveCount = moveCount;
+ this.scrollOption.moveCurrent1 = Math.min(moveCurrent1, moveCurrent2);
+ this.scrollOption.moveCurrent2 = Math.max(moveCurrent1, moveCurrent2);
+ return;
+ }
+
+ let currentEachSpacing = xlength / this.scrollOption.moveCount;
+ let itemCount = (this.opts.width - this.opts.area[1] - this.opts.area[3]) / currentEachSpacing;
+ itemCount = itemCount <= 2 ? 2 : itemCount;
+ itemCount = itemCount >= this.opts.categories.length ? this.opts.categories.length : itemCount;
+ this.opts.animation = false;
+ this.opts.xAxis.itemCount = itemCount;
+ // 重新计算滚动条偏移距离
+ 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 currentLeft = eachSpacing * this.scrollOption.moveCurrent1;
+ let screenWidth = endX - startX;
+ let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1);
+ offsetLeft = -currentLeft+Math.min(ntcs[0].x,ntcs[1].x)-this.opts.area[3]-eachSpacing;
+ if (offsetLeft > 0) {
+ offsetLeft = 0;
+ }
+ if (offsetLeft < MaxLeft) {
+ offsetLeft = MaxLeft;
+ }
+ this.scrollOption.currentOffset= offsetLeft;
+ this.scrollOption.startTouchX= 0;
+ this.scrollOption.distance=0;
+ calValidDistance(this, offsetLeft, this.opts.chartData, this.config, this.opts);
+ this.opts._scrollDistance_ = offsetLeft;
+ drawCharts.call(this, this.opts.type, this.opts, this.config, this.context);
+}
+
+uCharts.prototype.stopAnimation = function() {
+ this.animationInstance && this.animationInstance.stop();
+};
+
+uCharts.prototype.addEventListener = function(type, listener) {
+ this.uevent.addEventListener(type, listener);
+};
+
+uCharts.prototype.delEventListener = function(type) {
+ this.uevent.delEventListener(type);
+};
+
+uCharts.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') {
+ return findPieChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.pieData, this.opts);
+ } else if (this.opts.type === 'rose') {
+ return findRoseChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.pieData, this.opts);
+ } 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 if (this.opts.type === 'bar') {
+ return findBarChartCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.calPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset));
+ } else {
+ return findCurrentIndex({
+ x: _touches$.x,
+ y: _touches$.y
+ }, this.opts.chartData.calPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset));
+ }
+ }
+ return -1;
+};
+
+uCharts.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;
+};
+
+uCharts.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) {
+ if (this.opts.type == 'candle') {
+ this.opts.seriesMA[index].show = !this.opts.seriesMA[index].show;
+ } else {
+ 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);
+ }
+ }
+
+};
+
+uCharts.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("[uCharts] 未获取到event坐标信息");
+ }
+ 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' || this.opts.type === 'scatter' || this.opts.type === 'bubble') {
+ var current = this.getCurrentDataIndex(e);
+ var index = option.index == undefined ? current.index : option.index;
+ if (index > -1 || index.length>0) {
+ var seriesData = getSeriesDataItem(this.opts.series, index, current.group);
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getToolTipData(seriesData, this.opts, index, current.group, this.opts.categories, option),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset;
+ offset.y = _touches$.y;
+ opts.tooltip = {
+ textList: option.textList !== undefined ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'mount') {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e).index : option.index;
+ if (index > -1) {
+ var opts = assign({}, this.opts, {animation: false});
+ var seriesData = assign({}, opts._series_[index]);
+ var textList = [{
+ text: option.formatter ? option.formatter(seriesData, undefined, index, opts) : seriesData.name + ': ' + seriesData.data,
+ color: seriesData.color
+ }];
+ var offset = {
+ x: opts.chartData.calPoints[index].x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'bar') {
+ var current = this.getCurrentDataIndex(e);
+ var index = option.index == undefined ? current.index : option.index;
+ if (index > -1 || index.length>0) {
+ var seriesData = getSeriesDataItem(this.opts.series, index, current.group);
+ if (seriesData.length !== 0) {
+ var _getToolTipData = getToolTipData(seriesData, this.opts, index, current.group, this.opts.categories, option),
+ textList = _getToolTipData.textList,
+ offset = _getToolTipData.offset;
+ offset.x = _touches$.x;
+ opts.tooltip = {
+ textList: option.textList !== undefined ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'mix') {
+ var current = this.getCurrentDataIndex(e);
+ var index = option.index == undefined ? current.index : 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, index, this.opts.categories, option),
+ textList = _getMixToolTipData.textList,
+ offset = _getMixToolTipData.offset;
+ offset.y = _touches$.y;
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'candle') {
+ var current = this.getCurrentDataIndex(e);
+ var index = option.index == undefined ? current.index : 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, 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: option.offset !== undefined ? option.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 opts = assign({}, this.opts, {animation: false});
+ var seriesData = assign({}, opts._series_[index]);
+ var textList = [{
+ text: option.formatter ? option.formatter(seriesData, undefined, index, opts) : seriesData.name + ': ' + seriesData.data,
+ color: seriesData.color
+ }];
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'map') {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e) : option.index;
+ if (index > -1) {
+ var opts = assign({}, this.opts, {animation: false});
+ var seriesData = assign({}, this.opts.series[index]);
+ seriesData.name = seriesData.properties.name
+ var textList = [{
+ text: option.formatter ? option.formatter(seriesData, undefined, index, this.opts) : seriesData.name,
+ color: seriesData.color
+ }];
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+ opts.updateData = false;
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+ if (this.opts.type === 'word') {
+ var index = option.index == undefined ? this.getCurrentDataIndex(e) : option.index;
+ if (index > -1) {
+ var opts = assign({}, this.opts, {animation: false});
+ var seriesData = assign({}, this.opts.series[index]);
+ var textList = [{
+ text: option.formatter ? option.formatter(seriesData, undefined, index, this.opts) : seriesData.name,
+ color: seriesData.color
+ }];
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.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 opts = assign({}, this.opts, {animation: false});
+ var seriesData = getSeriesDataItem(this.opts.series, index);
+ if (seriesData.length !== 0) {
+ var textList = seriesData.map((item) => {
+ return {
+ text: option.formatter ? option.formatter(item, this.opts.categories[index], index, this.opts) : item.name + ': ' + item.data,
+ color: item.color
+ };
+ });
+ var offset = {
+ x: _touches$.x,
+ y: _touches$.y
+ };
+ opts.tooltip = {
+ textList: option.textList ? option.textList : textList,
+ offset: option.offset !== undefined ? option.offset : offset,
+ option: option,
+ index: index
+ };
+ }
+ }
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ }
+};
+
+uCharts.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);
+};
+
+uCharts.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;
+ }
+};
+
+uCharts.prototype.scroll = function(e) {
+ if (this.scrollOption.lastMoveTime === 0) {
+ this.scrollOption.lastMoveTime = Date.now();
+ }
+ let Limit = this.opts.touchMoveLimit || 60;
+ let currMoveTime = Date.now();
+ let duration = currMoveTime - this.scrollOption.lastMoveTime;
+ if (duration < Math.floor(1000 / Limit)) return;
+ if (this.scrollOption.startTouchX == 0) 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
+ });
+ this.opts = opts;
+ drawCharts.call(this, opts.type, opts, this.config, this.context);
+ return currentOffset + _distance;
+ }
+};
+
+uCharts.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;
+ this.scrollOption.moveCount = 0;
+ }
+};
+
+export default uCharts;
\ No newline at end of file
diff --git a/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js b/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js
new file mode 100644
index 0000000..7a24728
--- /dev/null
+++ b/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js
@@ -0,0 +1,18 @@
+/*
+ * uCharts (R)
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360/快手)、Vue、Taro等支持canvas的框架平台
+ * Copyright (C) 2021 QIUN (R) 秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ *
+ * uCharts (R) 官方网站
+ * https://www.uCharts.cn
+ *
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ *
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ *
+ */
+"use strict";var config={version:"v2.4.3-20220505",yAxisWidth:15,xAxisHeight:22,xAxisTextPadding:3,padding:[10,10,10,10],pixelRatio:1,rotate:false,fontSize:13,fontColor:"#666666",dataPointShape:["circle","circle","circle","circle"],color:["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],linearColor:["#0EE2F8","#2BDCA8","#FA7D8D","#EB88E2","#2AE3A0","#0EE2F8","#EB88E2","#6773E3","#F78A85"],pieChartLinePadding:15,pieChartTextPadding:5,titleFontSize:20,subtitleFontSize:15,toolTipPadding:3,toolTipBackground:"#000000",toolTipOpacity:.7,toolTipLineHeight:20,radarLabelTextMargin:13};var assign=function(e,...t){if(e==null){throw new TypeError("[uCharts] Cannot convert undefined or null to object")}if(!t||t.length<=0){return e}function i(e,a){for(let t in a){e[t]=e[t]&&e[t].toString()==="[object Object]"?i(e[t],a[t]):e[t]=a[t]}return e}t.forEach(t=>{e=i(e,t)});return e};var util={toFixed:function t(e,a){a=a||2;if(this.isFloat(e)){e=e.toFixed(a)}return e},isFloat:function t(e){return e%1!==0},approximatelyEqual:function t(e,a){return Math.abs(e-a)<1e-10},isSameSign:function t(e,a){return Math.abs(e)===e&&Math.abs(a)===a||Math.abs(e)!==e&&Math.abs(a)!==a},isSameXCoordinateArea:function t(e,a){return this.isSameSign(e.x,a.x)},isCollision:function t(e,a){e.end={};e.end.x=e.start.x+e.width;e.end.y=e.start.y-e.height;a.end={};a.end.x=a.start.x+a.width;a.end.y=a.start.y-a.height;var i=a.start.x>e.end.x||a.end.xe.start.y||a.start.y1){if(r.extra.mount.widthRatio>2)r.extra.mount.widthRatio=2;n+=(r.extra.mount.widthRatio-1)*a.eachSpacing}var l=e;if(e>=0){l=0;t.uevent.trigger("scrollLeft");t.scrollOption.position="left";r.xAxis.scrollPosition="left"}else if(Math.abs(e)>=n-o){l=o-n;t.uevent.trigger("scrollRight");t.scrollOption.position="right";r.xAxis.scrollPosition="right"}else{t.scrollOption.position=e;r.xAxis.scrollPosition=e}return l}function isInAngleRange(t,e,a){function i(t){while(t<0){t+=2*Math.PI}while(t>2*Math.PI){t-=2*Math.PI}return t}t=i(t);e=i(e);a=i(a);if(e>a){a+=2*Math.PI;if(t=e&&t<=a}function createCurveControlPoints(t,e){function a(t,e){if(t[e-1]&&t[e+1]){return t[e].y>=Math.max(t[e-1].y,t[e+1].y)||t[e].y<=Math.min(t[e-1].y,t[e+1].y)}else{return false}}function c(t,e){if(t[e-1]&&t[e+1]){return t[e].x>=Math.max(t[e-1].x,t[e+1].x)||t[e].x<=Math.min(t[e-1].x,t[e+1].x)}else{return false}}var i=.2;var r=.2;var o=null;var n=null;var l=null;var s=null;if(e<1){o=t[0].x+(t[1].x-t[0].x)*i;n=t[0].y+(t[1].y-t[0].y)*i}else{o=t[e].x+(t[e+1].x-t[e-1].x)*i;n=t[e].y+(t[e+1].y-t[e-1].y)*i}if(e>t.length-3){var h=t.length-1;l=t[h].x-(t[h].x-t[h-1].x)*r;s=t[h].y-(t[h].y-t[h-1].y)*r}else{l=t[e+1].x-(t[e+2].x-t[e].x)*r;s=t[e+1].y-(t[e+2].y-t[e].y)*r}if(a(t,e+1)){s=t[e+1].y}if(a(t,e)){n=t[e].y}if(c(t,e+1)){l=t[e+1].x}if(c(t,e)){o=t[e].x}if(n>=Math.max(t[e].y,t[e+1].y)||n<=Math.min(t[e].y,t[e+1].y)){n=t[e].y}if(s>=Math.max(t[e].y,t[e+1].y)||s<=Math.min(t[e].y,t[e+1].y)){s=t[e+1].y}if(o>=Math.max(t[e].x,t[e+1].x)||o<=Math.min(t[e].x,t[e+1].x)){o=t[e].x}if(l>=Math.max(t[e].x,t[e+1].x)||l<=Math.min(t[e].x,t[e+1].x)){l=t[e+1].x}return{ctrA:{x:o,y:n},ctrB:{x:l,y:s}}}function convertCoordinateOrigin(t,e,a){return{x:a.x+t,y:a.y-e}}function avoidCollision(t,e){if(e){while(util.isCollision(t,e)){if(t.start.x>0){t.start.y--}else if(t.start.x<0){t.start.y++}else{if(t.start.y>0){t.start.y++}else{t.start.y--}}}}return t}function fixPieSeries(e,a,t){let i=[];if(e.length>0&&e[0].data.constructor.toString().indexOf("Array")>-1){a._pieSeries_=e;let t=e[0].data;for(var r=0;r=1e4){a=1e3}else if(i>=1e3){a=100}else if(i>=100){a=10}else if(i>=10){a=5}else if(i>=1){a=1}else if(i>=.1){a=.1}else if(i>=.01){a=.01}else if(i>=.001){a=.001}else if(i>=1e-4){a=1e-4}else if(i>=1e-5){a=1e-5}else{a=1e-6}return{minRange:findRange(t,"lower",a),maxRange:findRange(e,"upper",a)}}function measureText(a,t,e){var i=0;a=String(a);e=false;if(e!==false&&e!==undefined&&e.setFontSize&&e.measureText){e.setFontSize(t);return e.measureText(a).width}else{var a=a.split("");for(let e=0;e-1;if(n){let t=filterSeries(e);for(var l=0;l5&&arguments[5]!==undefined?arguments[5]:{};var l=a.chartData.calPoints?a.chartData.calPoints:[];let s={};if(r.length>0){let e=[];for(let t=0;t0){e=o[i]}return{text:n.formatter?n.formatter(t,e,i,a):t.name+": "+t.data,color:t.color}});var h={x:Math.round(s.x),y:Math.round(s.y)};return{textList:e,offset:h}}function getMixToolTipData(t,e,a,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:{};var o=e.chartData.xAxisPoints[a]+e.chartData.eachSpacing/2;var n=t.map(function(t){return{text:r.formatter?r.formatter(t,i[a],a,e):t.name+": "+t.data,color:t.color,disableLegend:t.disableLegend?true:false}});n=n.filter(function(t){if(t.disableLegend!==true){return t}});var l={x:Math.round(o),y:0};return{textList:n,offset:l}}function getCandleToolTipData(o,e,r,n,d,t){var x=arguments.length>6&&arguments[6]!==undefined?arguments[6]:{};var a=r.chartData.calPoints;let l=t.color.upFill;let s=t.color.downFill;let h=[l,l,s,l];var c=[];e.map(function(t){if(n==0){if(t.data[1]-t.data[0]<0){h[1]=s}else{h[1]=l}}else{if(t.data[0]o[n-1][1]){h[2]=l}if(t.data[3]4&&arguments[4]!==undefined?arguments[4]:0;var l={index:-1,group:[]};var i=e.chartData.eachSpacing/2;let r=[];if(n&&n.length>0){if(!e.categories){i=0}else{for(let t=1;tt){l.index=e}})}}}return l}function findBarChartCurrentIndex(a,t,e,i){var r=arguments.length>4&&arguments[4]!==undefined?arguments[4]:0;var o={index:-1,group:[]};var n=e.chartData.eachSpacing/2;let l=e.chartData.yAxisPoints;if(t&&t.length>0){if(isInExactChartArea(a,e,i)){l.forEach(function(t,e){if(a.y+r+n>t){o.index=e}})}}return o}function findLegendIndex(o,t,e){let n=-1;let l=0;if(isInExactLegendArea(o,t.area)){let i=t.points;let r=-1;for(let t=0,e=i.length;tt[0]-l&&o.xt[1]-l&&o.ye.start.x&&t.xe.start.y&&t.y=e.area[3]-10&&t.y>=e.area[0]&&t.y<=e.height-e.area[2]}function findRadarChartCurrentIndex(t,e,a){var r=2*Math.PI/a;var o=-1;if(isInExactPieChartArea(t,e.center,e.radius)){var n=function t(e){if(e<0){e+=2*Math.PI}if(e>2*Math.PI){e-=2*Math.PI}return e};var l=Math.atan2(e.center.y-t.y,t.x-e.center.x);l=-1*l;if(l<0){l+=2*Math.PI}var i=e.angleList.map(function(t){t=n(-1*t);return t});i.forEach(function(t,e){var a=n(t-r/2);var i=n(t+r/2);if(i=a&&l<=i||l+2*Math.PI>=a&&l+2*Math.PI<=i){o=e}})}return o}function findFunnelChartCurrentIndex(t,e){var a=-1;for(var i=0,r=e.series.length;io.funnelArea[0]&&t.xo.funnelArea[1]&&t.yo.area[0]&&t.xo.area[1]&&t.ys.width-s.area[1]-s.area[3]){i.push(n);o.push(r-s.legend.itemGap*s.pix);r=e;n=[t]}else{r+=e;n.push(t)}}if(n.length){i.push(n);o.push(r-s.legend.itemGap*s.pix);c.widthArr=o;let t=Math.max.apply(null,o);switch(s.legend.float){case"left":c.area.start.x=s.area[3];c.area.end.x=s.area[3]+t+2*d;break;case"right":c.area.start.x=s.width-s.area[1]-t-2*d;c.area.end.x=s.width-s.area[1];break;default:c.area.start.x=(s.width-t)/2-d;c.area.end.x=(s.width+t)/2+d}c.area.width=t+2*d;c.area.wholeWidth=t+2*d;c.area.height=i.length*g+2*d;c.area.wholeHeight=i.length*g+2*d+2*x;c.points=i}}else{let t=l.length;let e=s.height-s.area[0]-s.area[2]-2*x-2*d;let a=Math.min(Math.floor(e/g),t);c.area.height=a*g+d*2;c.area.wholeHeight=a*g+d*2;switch(s.legend.float){case"top":c.area.start.y=s.area[0]+x;c.area.end.y=s.area[0]+x+c.area.height;break;case"bottom":c.area.start.y=s.height-s.area[2]-x-c.area.height;c.area.end.y=s.height-s.area[2]-x;break;default:c.area.start.y=(s.height-c.area.height)/2;c.area.end.y=(s.height+c.area.height)/2}let i=t%a===0?t/a:Math.floor(t/a+1);let r=[];for(let e=0;ei){i=t}}c.widthArr.push(i);c.heightArr.push(a.length*g+d*2)}let e=0;for(let t=0;t4&&arguments[4]!==undefined?arguments[4]:-1;var i;if(c=="stack"){i=dataCombineStack(t,e.categories.length)}else{i=dataCombine(t)}var r=[];i=i.filter(function(t){if(typeof t==="object"&&t!==null){if(t.constructor.toString().indexOf("Array")>-1){return t!==null}else{return t.value!==null}}else{return t!==null}});i.map(function(t){if(typeof t==="object"){if(t.constructor.toString().indexOf("Array")>-1){if(e.type=="candle"){t.map(function(t){r.push(t)})}else{r.push(t[0])}}else{r.push(t.value)}}else{r.push(t)}});var o=0;var n=0;if(r.length>0){o=Math.min.apply(this,r);n=Math.max.apply(this,r)}if(a>-1){if(typeof e.xAxis.data[a].min==="number"){o=Math.min(e.xAxis.data[a].min,o)}if(typeof e.xAxis.data[a].max==="number"){n=Math.max(e.xAxis.data[a].max,n)}}else{if(typeof e.xAxis.min==="number"){o=Math.min(e.xAxis.min,o)}if(typeof e.xAxis.max==="number"){n=Math.max(e.xAxis.max,n)}}if(o===n){var d=n||10;n+=d}var l=o;var x=n;var f=[];var p=(x-l)/e.xAxis.splitNumber;for(var s=0;s<=e.xAxis.splitNumber;s++){f.push(l+p*s)}return f}function calXAxisData(t,e,a,i){var r=assign({},{type:""},e.extra.bar);var o={angle:0,xAxisHeight:a.xAxisHeight};o.ranges=getXAxisTextList(t,e,a,r.type);o.rangesFormat=o.ranges.map(function(t){t=util.toFixed(t,2);return t});var n=o.ranges.map(function(t){t=util.toFixed(t,2);return t});o=Object.assign(o,getXAxisPoints(n,e,a));var l=o.eachSpacing;var s=n.map(function(t){return measureText(t,e.xAxis.fontSize*e.pix||a.fontSize,i)});var h=Math.max.apply(this,s);if(h+2*a.xAxisTextPadding>l){o.angle=45*Math.PI/180;o.xAxisHeight=2*a.xAxisTextPadding+h*Math.sin(o.angle)}if(e.xAxis.disabled===true){o.xAxisHeight=0}return o}function getRadarDataPoints(r,o,n,a,t){var l=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var e=t.extra.radar||{};e.max=e.max||0;var s=Math.max(e.max,Math.max.apply(null,dataCombine(a)));var h=[];for(let e=0;e2&&arguments[2]!==undefined?arguments[2]:1;var o=0;var n=0;for(let e=0;e4&&arguments[4]!==undefined?arguments[4]:1;e=e.sort(function(t,e){return parseInt(e.data)-parseInt(t.data)});for(let t=0;t4&&arguments[4]!==undefined?arguments[4]:1;var l=0;var s=0;var h=[];for(let e=0;e2&&arguments[2]!==undefined?arguments[2]:1;if(o==1){o=.999999}for(let a=0;a=2){t._proportion_=t._proportion_%2}}return i}function getGaugeArcbarDataPoints(i,r){var o=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;if(o==1){o=.999999}for(let a=0;a=2){t._proportion_=t._proportion_%2}}return i}function getGaugeAxisPoints(e,a,t){let i=a-t+1;let r=a;for(let t=0;t=2){e[t]._endAngle_=e[t]._endAngle_%2}r=e[t]._endAngle_}return e}function getGaugeDataPoints(i,r,o){let n=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;for(let a=0;a=o.oldData){e._proportion_=(e._endAngle_-e._oldAngle_)*n+o.oldAngle}else{e._proportion_=e._oldAngle_-(e._oldAngle_-e._endAngle_)*n}if(e._proportion_>=2){e._proportion_=e._proportion_%2}}return i}function getPieTextMaxLength(i,r,o,n){i=getPieDataPoints(i);let l=0;for(let a=0;a0){t.width=Math.min(t.width,+n.extra.mix.column.width*n.pix)}if(n.extra.column&&n.extra.column.width&&+n.extra.column.width>0){t.width=Math.min(t.width,+n.extra.column.width*n.pix)}if(t.width<=0){t.width=1}t.x+=(o+.5-r/2)*(t.width+e);return t})}function fixBarData(t,i,r,o,e,n){return t.map(function(t){if(t===null){return null}var e=0;var a=0;e=n.extra.bar.seriesGap*n.pix||0;a=n.extra.bar.categoryGap*n.pix||0;e=Math.min(e,i/r);a=Math.min(a,i/r);t.width=Math.ceil((i-2*a-e*(r-1))/r);if(n.extra.bar&&n.extra.bar.width&&+n.extra.bar.width>0){t.width=Math.min(t.width,+n.extra.bar.width*n.pix)}if(t.width<=0){t.width=1}t.y+=(o+.5-r/2)*(t.width+e);return t})}function fixColumeMeterData(t,e,a,i,r,o,n){var l=o.extra.column.categoryGap*o.pix||0;return t.map(function(t){if(t===null){return null}t.width=e-2*l;if(o.extra.column&&o.extra.column.width&&+o.extra.column.width>0){t.width=Math.min(t.width,+o.extra.column.width*o.pix)}if(i>0){t.width-=n}return t})}function fixColumeStackData(t,a,e,i,r,o,n){var l=o.extra.column.categoryGap*o.pix||0;return t.map(function(t,e){if(t===null){return null}t.width=Math.ceil(a-2*l);if(o.extra.column&&o.extra.column.width&&+o.extra.column.width>0){t.width=Math.min(t.width,+o.extra.column.width*o.pix)}if(t.width<=0){t.width=1}return t})}function fixBarStackData(t,a,e,i,r,o,n){var l=o.extra.bar.categoryGap*o.pix||0;return t.map(function(t,e){if(t===null){return null}t.width=Math.ceil(a-2*l);if(o.extra.bar&&o.extra.bar.width&&+o.extra.bar.width>0){t.width=Math.min(t.width,+o.extra.bar.width*o.pix)}if(t.width<=0){t.width=1}return t})}function getXAxisPoints(t,e,h){var a=e.width-e.area[1]-e.area[3];var i=e.enableScroll?Math.min(e.xAxis.itemCount,t.length):t.length;if((e.type=="line"||e.type=="area"||e.type=="scatter"||e.type=="bubble"||e.type=="bar")&&i>1&&e.xAxis.boundaryGap=="justify"){i-=1}var r=0;if(e.type=="mount"&&e.extra&&e.extra.mount&&e.extra.mount.widthRatio&&e.extra.mount.widthRatio>1){if(e.extra.mount.widthRatio>2)e.extra.mount.widthRatio=2;r=e.extra.mount.widthRatio-1;i+=r}var o=a/i;var n=[];var l=e.area[3];var s=e.width-e.area[1];t.forEach(function(t,e){n.push(l+r/2*o+e*o)});if(e.xAxis.boundaryGap!=="justify"){if(e.enableScroll===true){n.push(l+r*o+t.length*o)}else{n.push(s)}}return{xAxisPoints:n,startX:l,endX:s,eachSpacing:o}}function getCandleDataPoints(t,l,s,h,c,d,a){var x=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var e=[];var f=d.height-d.area[0]-d.area[2];t.forEach(function(t,o){if(t===null){e.push(null)}else{var n=[];t.forEach(function(t,e){var a={};a.x=h[o]+Math.round(c/2);var i=t.value||t;var r=f*(i-l)/(s-l);r*=x;a.y=d.height-Math.round(r)-d.area[2];n.push(a)});e.push(n)}});return e}function getDataPoints(t,a,n,l,s,h,e){var c=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var d="center";if(h.type=="line"||h.type=="area"||h.type=="scatter"||h.type=="bubble"){d=h.xAxis.boundaryGap}var x=[];var f=h.height-h.area[0]-h.area[2];var p=h.width-h.area[1]-h.area[3];t.forEach(function(i,t){if(i===null){x.push(null)}else{var r={};r.color=i.color;r.x=l[t];var o=i;if(typeof i==="object"&&i!==null){if(i.constructor.toString().indexOf("Array")>-1){let t,e,a;t=[].concat(h.chartData.xAxisData.ranges);e=t.shift();a=t.pop();o=i[1];r.x=h.area[3]+p*(i[0]-e)/(a-e);if(h.type=="bubble"){r.r=i[2];r.t=i[3]}}else{o=i.value}}if(d=="center"){r.x+=s/2}var e=f*(o-a)/(n-a);e*=c;r.y=h.height-e-h.area[2];x.push(r)}});return x}function getMountDataPoints(t,o,n,l,s,h,e){var c=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var d=[];var x=h.height-h.area[0]-h.area[2];var a=h.width-h.area[1]-h.area[3];var f=s*e.widthRatio;t.forEach(function(t,e){if(t===null){d.push(null)}else{var a={};a.color=t.color;a.x=l[e];a.x+=s/2;var i=t.data;var r=x*(i-o)/(n-o);r*=c;a.y=h.height-r-h.area[2];a.value=i;a.width=f;d.push(a)}});return d}function getBarDataPoints(t,o,n,l,e,s,a){var h=arguments.length>7&&arguments[7]!==undefined?arguments[7]:1;var c=[];var i=s.height-s.area[0]-s.area[2];var d=s.width-s.area[1]-s.area[3];t.forEach(function(t,e){if(t===null){c.push(null)}else{var a={};a.color=t.color;a.y=l[e];var i=t;if(typeof t==="object"&&t!==null){i=t.value}var r=d*(i-o)/(n-o);r*=h;a.height=r;a.value=i;a.x=r+s.area[3];c.push(a)}});return c}function getStackDataPoints(t,s,h,c,u,d,e,x,y){var f=arguments.length>9&&arguments[9]!==undefined?arguments[9]:1;var p=[];var g=d.height-d.area[0]-d.area[2];t.forEach(function(t,e){if(t===null){p.push(null)}else{var a={};a.color=t.color;a.x=c[e]+Math.round(u/2);if(x>0){var i=0;for(let t=0;t<=x;t++){i+=y[t].data[e]}var r=i-t;var o=g*(i-s)/(h-s);var n=g*(r-s)/(h-s)}else{var i=t;var o=g*(i-s)/(h-s);var n=0}var l=n;o*=f;l*=f;a.y=d.height-Math.round(o)-d.area[2];a.y0=d.height-Math.round(l)-d.area[2];p.push(a)}});return p}function getBarStackDataPoints(t,s,h,c,e,d,a,x,u){var f=arguments.length>9&&arguments[9]!==undefined?arguments[9]:1;var p=[];var g=d.width-d.area[1]-d.area[3];t.forEach(function(t,e){if(t===null){p.push(null)}else{var a={};a.color=t.color;a.y=c[e];if(x>0){var i=0;for(let t=0;t<=x;t++){i+=u[t].data[e]}var r=i-t;var o=g*(i-s)/(h-s);var n=g*(r-s)/(h-s)}else{var i=t;var o=g*(i-s)/(h-s);var n=0}var l=n;o*=f;l*=f;a.height=o-l;a.x=d.area[3]+o;a.x0=d.area[3]+l;p.push(a)}});return p}function getYAxisTextList(t,e,h,c,a){var d=arguments.length>5&&arguments[5]!==undefined?arguments[5]:-1;var i;if(c=="stack"){i=dataCombineStack(t,e.categories.length)}else{i=dataCombine(t)}var r=[];i=i.filter(function(t){if(typeof t==="object"&&t!==null){if(t.constructor.toString().indexOf("Array")>-1){return t!==null}else{return t.value!==null}}else{return t!==null}});i.map(function(t){if(typeof t==="object"){if(t.constructor.toString().indexOf("Array")>-1){if(e.type=="candle"){t.map(function(t){r.push(t)})}else{r.push(t[1])}}else{r.push(t.value)}}else{r.push(t)}});var o=a.min||0;var n=a.max||0;if(r.length>0){o=Math.min.apply(this,r);n=Math.max.apply(this,r)}if(o===n){if(n==0){n=10}else{o=0}}var l=getDataRange(o,n);var x=a.min===undefined||a.min===null?l.minRange:a.min;var f=a.max===undefined||a.max===null?l.maxRange:a.max;var p=[];var g=(f-x)/e.yAxis.splitNumber;for(var s=0;s<=e.yAxis.splitNumber;s++){p.push(x+g*s)}return p.reverse()}function calYAxisData(a,o,e,n){var l=assign({},{type:""},o.extra.column);var t=o.yAxis.data.length;var s=new Array(t);if(t>0){for(let e=0;e{return t+(i.unit||"")}}i.categories=i.categories||o.categories;h[r]=i.categories}else{if(!i.formatter){i.formatter=(t,e,a)=>{return t.toFixed(i.tofix)+(i.unit||"")}}h[r]=getYAxisTextList(s[r],o,e,l.type,i,r)}let a=i.fontSize*o.pix||e.fontSize;d[r]={position:i.position?i.position:"left",width:0};c[r]=h[r].map(function(t,e){t=i.formatter(t,e,o);d[r].width=Math.max(d[r].width,measureText(t,a,n)+5);return t});let t=i.calibration?4*o.pix:0;d[r].width+=t+3*o.pix;if(i.disabled===true){d[r].width=0}}}else{var h=new Array(1);var c=new Array(1);var d=new Array(1);if(o.type==="bar"){h[0]=o.categories;if(!o.yAxis.formatter){o.yAxis.formatter=(t,e,a)=>{return t+(a.yAxis.unit||"")}}}else{if(!o.yAxis.formatter){o.yAxis.formatter=(t,e,a)=>{return t.toFixed(a.yAxis.tofix)+(a.yAxis.unit||"")}}h[0]=getYAxisTextList(a,o,e,l.type,{})}d[0]={position:"left",width:0};var i=o.yAxis.fontSize*o.pix||e.fontSize;c[0]=h[0].map(function(t,e){t=o.yAxis.formatter(t,e,o);d[0].width=Math.max(d[0].width,measureText(t,i,n)+5);return t});d[0].width+=3*o.pix;if(o.yAxis.disabled===true){d[0]={position:"left",width:0};o.yAxis.data[0]={disabled:true}}else{o.yAxis.data[0]={disabled:false,position:"left",max:o.yAxis.max,min:o.yAxis.min,formatter:o.yAxis.formatter};if(o.type==="bar"){o.yAxis.data[0].categories=o.categories;o.yAxis.data[0].type="categories"}}}return{rangesFormat:c,ranges:h,yAxisWidth:d}}function calTooltipYAxisData(r,t,o,e,a){let n=[].concat(o.chartData.yAxisData.ranges);let l=o.height-o.area[0]-o.area[2];let s=o.area[0];let h=[];for(let i=0;i-1){i=h[e][1]}else{i=h[e].value}}var r=o.formatter?o.formatter(i,e,o,s):i;l.setTextAlign("center");l.fillText(String(r),t.x,t.y-4+c*s.pix);l.closePath();l.stroke();l.setTextAlign("left")}})}function drawMountPointText(t,o,n,l,s){var e=o.data;var h=o.textOffset?o.textOffset:0;t.forEach(function(t,e){if(t!==null){l.beginPath();var a=o[e].textSize?o[e].textSize*s.pix:n.fontSize;l.setFontSize(a);l.setFillStyle(o[e].textColor||s.fontColor);var i=t.value;var r=o[e].formatter?o[e].formatter(i,e,o,s):i;l.setTextAlign("center");l.fillText(String(r),t.x,t.y-4+h*s.pix);l.closePath();l.stroke();l.setTextAlign("left")}})}function drawBarPointText(t,o,n,l,s){var h=o.data;var e=o.textOffset?o.textOffset:0;t.forEach(function(t,e){if(t!==null){l.beginPath();var a=o.textSize?o.textSize*s.pix:n.fontSize;l.setFontSize(a);l.setFillStyle(o.textColor||s.fontColor);var i=h[e];if(typeof h[e]==="object"&&h[e]!==null){i=h[e].value}var r=o.formatter?o.formatter(i,e,o,s):i;l.setTextAlign("left");l.fillText(String(r),t.x+4*s.pix,t.y+a/2-3);l.closePath();l.stroke()}})}function drawGaugeLabel(e,a,i,r,o,n){a-=e.width/2+e.labelOffset*r.pix;a=a<10?10:a;let t=e.startAngle-e.endAngle+1;let d=t/e.splitLine.splitNumber;let x=e.endNumber-e.startNumber;let f=x/e.splitLine.splitNumber;let l=e.startAngle;let s=e.startNumber;for(let t=0;t=2){l=l%2}s+=f}}function drawRadarLabel(t,s,h,c,d,x){var f=c.extra.radar||{};t.forEach(function(t,e){if(f.labelPointShow===true&&c.categories[e]!==""){var a={x:s*Math.cos(t),y:s*Math.sin(t)};var i=convertCoordinateOrigin(a.x,a.y,h);x.setFillStyle(f.labelPointColor);x.beginPath();x.arc(i.x,i.y,f.labelPointRadius*c.pix,0,2*Math.PI,false);x.closePath();x.fill()}var r={x:(s+d.radarLabelTextMargin*c.pix)*Math.cos(t),y:(s+d.radarLabelTextMargin*c.pix)*Math.sin(t)};var o=convertCoordinateOrigin(r.x,r.y,h);var n=o.x;var l=o.y;if(util.approximatelyEqual(r.x,0)){n-=measureText(c.categories[e]||"",d.fontSize,x)/2}else if(r.x<0){n-=measureText(c.categories[e]||"",d.fontSize,x)}x.beginPath();x.setFontSize(d.fontSize);x.setFillStyle(f.labelColor||c.fontColor);x.fillText(c.categories[e]||"",n,l+d.fontSize/2);x.closePath();x.stroke()})}function drawPieText(n,d,x,f,t,l){var p=x.pieChartLinePadding;var g=[];var u=null;var y=n.map(function(t,e){var a=t.formatter?t.formatter(t,e,n,d):util.toFixed(t._proportion_.toFixed(4)*100)+"%";a=t.labelText?t.labelText:a;var i=2*Math.PI-(t._start_+2*Math.PI*t._proportion_/2);if(t._rose_proportion_){i=2*Math.PI-(t._start_+2*Math.PI*t._rose_proportion_/2)}var r=t.color;var o=t._radius_;return{arc:i,text:a,color:r,radius:o,textColor:t.textColor,textSize:t.textSize,labelShow:t.labelShow}});for(let c=0;c=0?e+x.pieChartTextPadding:e-x.pieChartTextPadding;let n=a;let l=measureText(t.text,t.textSize*d.pix||x.fontSize,f);let s=n;if(u&&util.isSameXCoordinateArea(u.start,{x:o})){if(o>0){s=Math.min(n,u.start.y)}else if(e<0){s=Math.max(n,u.start.y)}else{if(n>0){s=Math.max(n,u.start.y)}else{s=Math.min(n,u.start.y)}}}if(o<0){o-=l}let h={lineStart:{x:i,y:r},lineEnd:{x:e,y:a},start:{x:o,y:s},width:l,height:x.fontSize,text:t.text,color:t.color,textColor:t.textColor,textSize:t.textSize};u=avoidCollision(h,u);g.push(u)}for(let n=0;nr?r:o.activeWidth;var n=e.area[0];var l=e.height-e.area[2];i.beginPath();i.setFillStyle(hexToRgb(o.activeBgColor,o.activeBgOpacity));i.rect(t-o.activeWidth/2,n,o.activeWidth,l-n);i.closePath();i.fill();i.setFillStyle("#FFFFFF")}function drawBarToolTipSplitArea(t,e,a,i,r){var o=assign({},{activeBgColor:"#000000",activeBgOpacity:.08},e.extra.bar);var n=e.area[3];var l=e.width-e.area[1];i.beginPath();i.setFillStyle(hexToRgb(o.activeBgColor,o.activeBgOpacity));i.rect(n,t-r/2,l-n,r);i.closePath();i.fill();i.setFillStyle("#FFFFFF")}function drawToolTip(t,r,e,o,n,c,d){var l=assign({},{showBox:true,showArrow:true,showCategory:false,bgColor:"#000000",bgOpacity:.7,borderColor:"#000000",borderWidth:0,borderRadius:0,borderOpacity:.7,fontColor:"#FFFFFF",splitLine:true},e.extra.tooltip);if(l.showCategory==true&&e.categories){t.unshift({text:e.categories[e.tooltip.index],color:null})}var x=4*e.pix;var f=5*e.pix;var s=l.showArrow?8*e.pix:0;var p=false;if(e.type=="line"||e.type=="mount"||e.type=="area"||e.type=="candle"||e.type=="mix"){if(l.splitLine==true){drawToolTipSplitLine(e.tooltip.offset.x,e,o,n)}}r=assign({x:0,y:0},r);r.y-=8*e.pix;var g=t.map(function(t){return measureText(t.text,o.fontSize,n)});var h=x+f+4*o.toolTipPadding+Math.max.apply(null,g);var a=2*o.toolTipPadding+t.length*o.toolTipLineHeight;if(l.showBox==false){return}if(r.x-Math.abs(e._scrollDistance_||0)+s+h>e.width){p=true}if(a+r.y>e.height){r.y=e.height-a}n.beginPath();n.setFillStyle(hexToRgb(l.bgColor||o.toolTipBackground,l.bgOpacity||o.toolTipOpacity));n.setLineWidth(l.borderWidth*e.pix);n.setStrokeStyle(hexToRgb(l.borderColor,l.borderOpacity));var i=l.borderRadius;if(p){if(l.showArrow){n.moveTo(r.x,r.y+10*e.pix);n.lineTo(r.x-s,r.y+10*e.pix+5*e.pix)}n.arc(r.x-s-i,r.y+a-i,i,0,Math.PI/2,false);n.arc(r.x-s-Math.round(h)+i,r.y+a-i,i,Math.PI/2,Math.PI,false);n.arc(r.x-s-Math.round(h)+i,r.y+i,i,-Math.PI,-Math.PI/2,false);n.arc(r.x-s-i,r.y+i,i,-Math.PI/2,0,false);if(l.showArrow){n.lineTo(r.x-s,r.y+10*e.pix-5*e.pix);n.lineTo(r.x,r.y+10*e.pix)}}else{if(l.showArrow){n.moveTo(r.x,r.y+10*e.pix);n.lineTo(r.x+s,r.y+10*e.pix-5*e.pix)}n.arc(r.x+s+i,r.y+i,i,-Math.PI,-Math.PI/2,false);n.arc(r.x+s+Math.round(h)-i,r.y+i,i,-Math.PI/2,0,false);n.arc(r.x+s+Math.round(h)-i,r.y+a-i,i,0,Math.PI/2,false);n.arc(r.x+s+i,r.y+a-i,i,Math.PI/2,Math.PI,false);if(l.showArrow){n.lineTo(r.x+s,r.y+10*e.pix+5*e.pix);n.lineTo(r.x,r.y+10*e.pix)}}n.closePath();n.fill();if(l.borderWidth>0){n.stroke()}t.forEach(function(t,e){if(t.color!==null){n.beginPath();n.setFillStyle(t.color);var a=r.x+s+2*o.toolTipPadding;var i=r.y+(o.toolTipLineHeight-o.fontSize)/2+o.toolTipLineHeight*e+o.toolTipPadding+1;if(p){a=r.x-h-s+2*o.toolTipPadding}n.fillRect(a,i,x,o.fontSize);n.closePath()}});t.forEach(function(t,e){var a=r.x+s+2*o.toolTipPadding+x+f;if(p){a=r.x-h-s+2*o.toolTipPadding+ +x+f}var i=r.y+(o.toolTipLineHeight-o.fontSize)/2+o.toolTipLineHeight*e+o.toolTipPadding;n.beginPath();n.setFontSize(o.fontSize);n.setFillStyle(l.fontColor);n.fillText(t.text,a,i+o.fontSize);n.closePath();n.stroke()})}function drawColumnDataPoints(y,v,m,T){let b=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let t=v.chartData.xAxisData,P=t.xAxisPoints,w=t.eachSpacing;let S=assign({},{type:"group",width:w/2,meterBorder:4,meterFillColor:"#FFFFFF",barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0},v.extra.column);let A=[];T.save();let C=-2;let D=P.length+2;if(v._scrollDistance_&&v._scrollDistance_!==0&&v.enableScroll===true){T.translate(v._scrollDistance_,0);C=Math.floor(-v._scrollDistance_/w)-2;D=C+v.xAxis.itemCount+4}if(v.tooltip&&v.tooltip.textList&&v.tooltip.textList.length&&b===1){drawToolTipSplitArea(v.tooltip.offset.x,v,m,T,w)}S.customColor=fillCustomColor(S.linearType,S.customColor,y,m);y.forEach(function(a,i){let t,o,x;t=[].concat(v.chartData.yAxisData.ranges[a.index]);o=t.pop();x=t.shift();var f=a.data;switch(S.type){case"group":var r=getDataPoints(f,o,x,P,w,v,m,b);var p=getStackDataPoints(f,o,x,P,w,v,m,i,y,b);A.push(p);r=fixColumeData(r,w,y.length,i,m,v);for(let t=0;tC&&tr?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);T.arc(h+d-e,c+e,e,-Math.PI/2,0);T.arc(h+d-a,c+l-a,a,0,Math.PI/2);T.arc(h+i,c+l-i,i,Math.PI/2,Math.PI)}else{T.moveTo(n,o.y);T.lineTo(n+o.width,o.y);T.lineTo(n+o.width,v.height-v.area[2]);T.lineTo(n,v.height-v.area[2]);T.lineTo(n,o.y);T.setLineWidth(1);T.setStrokeStyle(g)}T.setFillStyle(s);T.closePath();T.fill()}};break;case"stack":var r=getStackDataPoints(f,o,x,P,w,v,m,i,y,b);A.push(r);r=fixColumeStackData(r,w,y.length,i,m,v,y);for(let e=0;eC&&e0){l-=u}T.setFillStyle(s);T.moveTo(n,t.y);T.fillRect(n,t.y,t.width,l);T.closePath();T.fill()}};break;case"meter":var r=getDataPoints(f,o,x,P,w,v,m,b);A.push(r);r=fixColumeMeterData(r,w,y.length,i,m,v,S.meterBorder);for(let t=0;tC&&t0){T.setStrokeStyle(a.color);T.setLineWidth(S.meterBorder*v.pix)}if(i==0){T.setFillStyle(S.meterFillColor)}else{T.setFillStyle(o.color||a.color)}var n=o.x-o.width/2;var l=v.height-o.y-v.area[2];if(S.barBorderRadius&&S.barBorderRadius.length===4||S.barBorderCircle===true){const h=n;const c=o.y;const d=o.width;const l=v.height-v.area[2]-o.y;if(S.barBorderCircle){S.barBorderRadius=[d/2,d/2,0,0]}let[t,e,a,i]=S.barBorderRadius;let r=Math.min(d/2,l/2);t=t>r?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);T.arc(h+d-e,c+e,e,-Math.PI/2,0);T.arc(h+d-a,c+l-a,a,0,Math.PI/2);T.arc(h+i,c+l-i,i,Math.PI/2,Math.PI);T.fill()}else{T.moveTo(n,o.y);T.lineTo(n+o.width,o.y);T.lineTo(n+o.width,v.height-v.area[2]);T.lineTo(n,v.height-v.area[2]);T.lineTo(n,o.y);T.fill()}if(i==0&&S.meterBorder>0){T.closePath();T.stroke()}}}break}});if(v.dataLabel!==false&&b===1){y.forEach(function(t,e){let a,i,r;a=[].concat(v.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;switch(S.type){case"group":var n=getDataPoints(o,i,r,P,w,v,m,b);n=fixColumeData(n,w,y.length,e,m,v);drawPointText(n,t,m,T,v);break;case"stack":var n=getStackDataPoints(o,i,r,P,w,v,m,e,y,b);drawPointText(n,t,m,T,v);break;case"meter":var n=getDataPoints(o,i,r,P,w,v,m,b);drawPointText(n,t,m,T,v);break}})}T.restore();return{xAxisPoints:P,calPoints:A,eachSpacing:w}}function drawMountDataPoints(i,n,o,l){let f=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let t=n.chartData.xAxisData,p=t.xAxisPoints,r=t.eachSpacing;let s=assign({},{type:"mount",widthRatio:1,borderWidth:1,barBorderCircle:false,barBorderRadius:[],linearType:"none",linearOpacity:1,customColor:[],colorStop:0},n.extra.mount);s.widthRatio=s.widthRatio<=0?0:s.widthRatio;s.widthRatio=s.widthRatio>=2?2:s.widthRatio;let e=[];l.save();let a=-2;let g=p.length+2;if(n._scrollDistance_&&n._scrollDistance_!==0&&n.enableScroll===true){l.translate(n._scrollDistance_,0);a=Math.floor(-n._scrollDistance_/r)-2;g=a+n.xAxis.itemCount+4}s.customColor=fillCustomColor(s.linearType,s.customColor,i,o);let u,y,v;u=[].concat(n.chartData.yAxisData.ranges[0]);y=u.pop();v=u.shift();var h=getMountDataPoints(i,y,v,p,r,n,s,f);switch(s.type){case"bar":for(let t=0;ta&&tr?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;l.arc(b+t,P+t,t,-Math.PI,-Math.PI/2);l.arc(b+w-e,P+e,e,-Math.PI/2,0);l.arc(b+w-a,P+m-a,a,0,Math.PI/2);l.arc(b+i,P+m-i,i,Math.PI/2,Math.PI)}else{l.moveTo(c,o.y);l.lineTo(c+o.width,o.y);l.lineTo(c+o.width,n.height-n.area[2]);l.lineTo(c,n.height-n.area[2]);l.lineTo(c,o.y)}l.setStrokeStyle(T);l.setFillStyle(d);if(s.borderWidth>0){l.setLineWidth(s.borderWidth*n.pix);l.closePath();l.stroke()}l.fill()}};break;case"triangle":for(let e=0;ea&&e0){l.setLineWidth(s.borderWidth*n.pix);l.stroke()}l.fill()}};break;case"mount":for(let e=0;ea&&e0){l.setLineWidth(s.borderWidth*n.pix);l.stroke()}l.fill()}};break;case"sharp":for(let e=0;ea&&e0){l.setLineWidth(s.borderWidth*n.pix);l.stroke()}l.fill()}};break}if(n.dataLabel!==false&&f===1){let t,e,a;t=[].concat(n.chartData.yAxisData.ranges[0]);e=t.pop();a=t.shift();var h=getMountDataPoints(i,e,a,p,r,n,s,f);drawMountPointText(h,i,o,l,n)}l.restore();return{xAxisPoints:p,calPoints:h,eachSpacing:r}}function drawBarDataPoints(y,v,m,T){let b=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let P=[];let w=(v.height-v.area[0]-v.area[2])/v.categories.length;for(let t=0;tC&&tr?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(u+i,c+i,i,-Math.PI,-Math.PI/2);T.arc(o.x-t,c+t,t,-Math.PI/2,0);T.arc(o.x-e,c+h-e,e,0,Math.PI/2);T.arc(u+a,c+h-a,a,Math.PI/2,Math.PI)}else{T.moveTo(n,r);T.lineTo(o.x,r);T.lineTo(o.x,r+o.width);T.lineTo(n,r+o.width);T.lineTo(n,r);T.setLineWidth(1);T.setStrokeStyle(g)}T.setFillStyle(l);T.closePath();T.fill()}};break;case"stack":var i=getBarStackDataPoints(x,e,d,P,w,v,m,t,y,b);A.push(i);i=fixBarStackData(i,w,y.length,t,m,v,y);for(let e=0;eC&&e5&&arguments[5]!==undefined?arguments[5]:1;var s=assign({},{color:{},average:{}},h.extra.candle);s.color=assign({},{upLine:"#f04864",upFill:"#f04864",downLine:"#2fc25b",downFill:"#2fc25b"},s.color);s.average=assign({},{show:false,name:[],day:[],color:c.color},s.average);h.extra.candle=s;let a=h.chartData.xAxisData,x=a.xAxisPoints,f=a.eachSpacing;let y=[];d.save();let p=-2;let v=x.length+2;let g=0;let m=h.width+f;if(h._scrollDistance_&&h._scrollDistance_!==0&&h.enableScroll===true){d.translate(h._scrollDistance_,0);p=Math.floor(-h._scrollDistance_/f)-2;v=p+h.xAxis.itemCount+4;g=-h._scrollDistance_-f*2+h.area[3];m=g+(h.xAxis.itemCount+4)*f}if(s.average.show||t){t.forEach(function(e,t){let a,i,r;a=[].concat(h.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();var o=e.data;var n=getDataPoints(o,i,r,x,f,h,c,u);var l=splitPoints(n,e);for(let t=0;tg){d.moveTo(t.x,t.y);a=1}if(e>0&&t.x>g&&t.xp&&e0){d.setStrokeStyle(s.color.upLine);d.setFillStyle(s.color.upFill);d.setLineWidth(1*h.pix);d.moveTo(t[3].x,t[3].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[1].x-f/4,t[1].y);d.lineTo(t[0].x-f/4,t[0].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[2].x,t[2].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[0].x+f/4,t[0].y);d.lineTo(t[1].x+f/4,t[1].y);d.lineTo(t[1].x,t[1].y);d.moveTo(t[3].x,t[3].y)}else{d.setStrokeStyle(s.color.downLine);d.setFillStyle(s.color.downFill);d.setLineWidth(1*h.pix);d.moveTo(t[3].x,t[3].y);d.lineTo(t[0].x,t[0].y);d.lineTo(t[0].x-f/4,t[0].y);d.lineTo(t[1].x-f/4,t[1].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[2].x,t[2].y);d.lineTo(t[1].x,t[1].y);d.lineTo(t[1].x+f/4,t[1].y);d.lineTo(t[0].x+f/4,t[0].y);d.lineTo(t[0].x,t[0].y);d.moveTo(t[3].x,t[3].y)}d.closePath();d.fill();d.stroke()}}});d.restore();return{xAxisPoints:x,calPoints:y,eachSpacing:f}}function drawAreaDataPoints(t,s,h,c){var d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var x=assign({},{type:"straight",opacity:.2,addLine:false,width:2,gradient:false},s.extra.area);let e=s.chartData.xAxisData,y=e.xAxisPoints,f=e.eachSpacing;let p=s.height-s.area[2];let v=[];c.save();let g=0;let u=s.width+f;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);g=-s._scrollDistance_-f*2+s.area[3];u=g+(s.xAxis.itemCount+4)*f}t.forEach(function(e,t){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();let o=e.data;let n=getDataPoints(o,i,r,y,f,s,h,d);v.push(n);let l=splitPoints(n,e);for(let t=0;t1){let t=r[0];let e=r[r.length-1];c.moveTo(t.x,t.y);let i=0;if(x.type==="curve"){for(let a=0;ag){c.moveTo(e.x,e.y);i=1}if(a>0&&e.x>g&&e.xg){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>g&&t.xg){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>g&&t.xg){c.moveTo(e.x,e.y);i=1}if(a>0&&e.x>g&&e.xg){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>g&&t.xg){c.moveTo(t.x,t.y);i=1}if(e>0&&t.x>g&&t.x4&&arguments[4]!==undefined?arguments[4]:1;var i=assign({},{type:"circle"},s.extra.scatter);let e=s.chartData.xAxisData,x=e.xAxisPoints,f=e.eachSpacing;var r=[];c.save();let a=0;let o=s.width+f;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);a=-s._scrollDistance_-f*2+s.area[3];o=a+(s.xAxis.itemCount+4)*f}t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,x,f,s,h,d);c.beginPath();c.setStrokeStyle(t.color);c.setFillStyle(t.color);c.setLineWidth(1*s.pix);var l=t.pointShape;if(l==="diamond"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x,t.y-4.5);c.lineTo(t.x-4.5,t.y);c.lineTo(t.x,t.y+4.5);c.lineTo(t.x+4.5,t.y);c.lineTo(t.x,t.y-4.5)}})}else if(l==="circle"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x+2.5*s.pix,t.y);c.arc(t.x,t.y,3*s.pix,0,2*Math.PI,false)}})}else if(l==="square"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x-3.5,t.y-3.5);c.rect(t.x-3.5,t.y-3.5,7,7)}})}else if(l==="triangle"){n.forEach(function(t,e){if(t!==null){c.moveTo(t.x,t.y-4.5);c.lineTo(t.x-4.5,t.y+4.5);c.lineTo(t.x+4.5,t.y+4.5);c.lineTo(t.x,t.y-4.5)}})}else if(l==="triangle"){return}c.closePath();c.fill();c.stroke()});if(s.dataLabel!==false&&d===1){t.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,x,f,s,h,d);drawPointText(n,t,h,c,s)})}c.restore();return{xAxisPoints:x,calPoints:r,eachSpacing:f}}function drawBubbleDataPoints(l,s,h,c){var d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var x=assign({},{opacity:1,border:2},s.extra.bubble);let t=s.chartData.xAxisData,f=t.xAxisPoints,p=t.eachSpacing;var e=[];c.save();let a=0;let i=s.width+p;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);a=-s._scrollDistance_-p*2+s.area[3];i=a+(s.xAxis.itemCount+4)*p}l.forEach(function(t,e){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[t.index]);i=a.pop();r=a.shift();var o=t.data;var n=getDataPoints(o,i,r,f,p,s,h,d);c.beginPath();c.setStrokeStyle(t.color);c.setLineWidth(x.border*s.pix);c.setFillStyle(hexToRgb(t.color,x.opacity));n.forEach(function(t,e){c.moveTo(t.x+t.r,t.y);c.arc(t.x,t.y,t.r*s.pix,0,2*Math.PI,false)});c.closePath();c.fill();c.stroke();if(s.dataLabel!==false&&d===1){n.forEach(function(t,e){c.beginPath();var a=l.textSize*s.pix||h.fontSize;c.setFontSize(a);c.setFillStyle(l.textColor||"#FFFFFF");c.setTextAlign("center");c.fillText(String(t.t),t.x,t.y+a/2);c.closePath();c.stroke();c.setTextAlign("left")})}});c.restore();return{xAxisPoints:f,calPoints:e,eachSpacing:p}}function drawLineDataPoints(t,s,h,c){var d=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var x=assign({},{type:"straight",width:2},s.extra.line);x.width*=s.pix;let e=s.chartData.xAxisData,f=e.xAxisPoints,p=e.eachSpacing;var y=[];c.save();let g=0;let u=s.width+p;if(s._scrollDistance_&&s._scrollDistance_!==0&&s.enableScroll===true){c.translate(s._scrollDistance_,0);g=-s._scrollDistance_-p*2+s.area[3];u=g+(s.xAxis.itemCount+4)*p}t.forEach(function(e,t){let a,i,r;a=[].concat(s.chartData.yAxisData.ranges[e.index]);i=a.pop();r=a.shift();var o=e.data;var n=getDataPoints(o,i,r,f,p,s,h,d);y.push(n);var l=splitPoints(n,e);if(e.lineType=="dash"){let t=e.dashLength?e.dashLength:8;t*=s.pix;c.setLineDash([t,t])}c.beginPath();c.setStrokeStyle(e.color);c.setLineWidth(x.width);l.forEach(function(i,t){if(i.length===1){c.moveTo(i[0].x,i[0].y);c.arc(i[0].x,i[0].y,1,0,2*Math.PI)}else{c.moveTo(i[0].x,i[0].y);let a=0;if(x.type==="curve"){for(let e=0;eg){c.moveTo(t.x,t.y);a=1}if(e>0&&t.x>g&&t.xg){c.moveTo(t.x,t.y);a=1}if(e>0&&t.x>g&&t.xg){c.moveTo(t.x,t.y);a=1}if(e>0&&t.x>g&&t.x4&&arguments[4]!==undefined?arguments[4]:1;let e=v.chartData.xAxisData,b=e.xAxisPoints,P=e.eachSpacing;let w=assign({},{width:P/2,barBorderCircle:false,barBorderRadius:[],seriesGap:2,linearType:"none",linearOpacity:1,customColor:[],colorStop:0},v.extra.mix.column);let S=assign({},{opacity:.2,gradient:false},v.extra.mix.area);let M=v.height-v.area[2];let L=[];var _=0;var F=0;t.forEach(function(t,e){if(t.type=="column"){F+=1}});T.save();let k=-2;let R=b.length+2;let A=0;let C=v.width+P;if(v._scrollDistance_&&v._scrollDistance_!==0&&v.enableScroll===true){T.translate(v._scrollDistance_,0);k=Math.floor(-v._scrollDistance_/P)-2;R=k+v.xAxis.itemCount+4;A=-v._scrollDistance_-P*2+v.area[3];C=A+(v.xAxis.itemCount+4)*P}w.customColor=fillCustomColor(w.linearType,w.customColor,t,m);t.forEach(function(n,t){let o,x,f;o=[].concat(v.chartData.yAxisData.ranges[n.index]);x=o.pop();f=o.shift();var p=n.data;var a=getDataPoints(p,x,f,b,P,v,m,D);L.push(a);if(n.type=="column"){a=fixColumeData(a,P,F,_,m,v);for(let t=0;tk&&tr?r:t;e=e>r?r:e;a=a>r?r:a;i=i>r?r:i;t=t<0?0:t;e=e<0?0:e;a=a<0?0:a;i=i<0?0:i;T.arc(h+t,c+t,t,-Math.PI,-Math.PI/2);T.arc(h+d-e,c+e,e,-Math.PI/2,0);T.arc(h+d-a,c+s-a,a,0,Math.PI/2);T.arc(h+i,c+s-i,i,Math.PI/2,Math.PI)}else{T.moveTo(l,o.y);T.lineTo(l+o.width,o.y);T.lineTo(l+o.width,v.height-v.area[2]);T.lineTo(l,v.height-v.area[2]);T.lineTo(l,o.y);T.setLineWidth(1);T.setStrokeStyle(g)}T.setFillStyle(e);T.closePath();T.fill()}}_+=1}if(n.type=="area"){let e=splitPoints(a,n);for(let t=0;t1){var r=i[0];let t=i[i.length-1];T.moveTo(r.x,r.y);let a=0;if(n.style==="curve"){for(let e=0;eA){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>A&&t.xA){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>A&&t.xA){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>A&&t.xA){T.moveTo(t.x,t.y);a=1}if(e>0&&t.x>A&&t.x1){if(l.extra.mount.widthRatio>2)l.extra.mount.widthRatio=2;g+=(l.extra.mount.widthRatio-1)*d}var u=n*n/g;var y=0;if(l._scrollDistance_){y=-l._scrollDistance_*n/g}h.beginPath();h.setLineCap("round");h.setLineWidth(6*l.pix);h.setStrokeStyle(l.xAxis.scrollBackgroundColor||"#EFEBEF");h.moveTo(e,o);h.lineTo(a,o);h.stroke();h.closePath();h.beginPath();h.setLineCap("round");h.setLineWidth(6*l.pix);h.setStrokeStyle(l.xAxis.scrollColor||"#A6A6A6");h.moveTo(e+y,o);h.lineTo(e+y+u,o);h.stroke();h.closePath();h.setLineCap("butt")}h.save();if(l._scrollDistance_&&l._scrollDistance_!==0){h.translate(l._scrollDistance_,0)}if(l.xAxis.calibration===true){h.setStrokeStyle(l.xAxis.gridColor||"#cccccc");h.setLineCap("butt");h.setLineWidth(1*l.pix);c.forEach(function(t,e){if(e>0){h.beginPath();h.moveTo(t-d/2,x);h.lineTo(t-d/2,x+3*l.pix);h.closePath();h.stroke()}})}if(l.xAxis.disableGrid!==true){h.setStrokeStyle(l.xAxis.gridColor||"#cccccc");h.setLineCap("butt");h.setLineWidth(1*l.pix);if(l.xAxis.gridType=="dash"){h.setLineDash([l.xAxis.dashLength*l.pix,l.xAxis.dashLength*l.pix])}l.xAxis.gridEval=l.xAxis.gridEval||1;c.forEach(function(t,e){if(e%l.xAxis.gridEval==0){h.beginPath();h.moveTo(t,x);h.lineTo(t,i);h.stroke()}});h.setLineDash([])}if(l.xAxis.disabled!==true){let t=r.length;if(l.xAxis.labelCount){if(l.xAxis.itemCount){t=Math.ceil(r.length/l.xAxis.itemCount*l.xAxis.labelCount)}else{t=l.xAxis.labelCount}t-=1}let e=Math.ceil(r.length/t);let a=[];let i=r.length;for(let t=0;t1){if(e.extra.mount.widthRatio>2)e.extra.mount.widthRatio=2;l+=(e.extra.mount.widthRatio-1)*n}let x=r+l;let s=[];let h=1;if(e.xAxis.axisLine===false){h=0}for(let t=h;t4&&arguments[4]!==undefined?arguments[4]:1;var n=assign({},{activeOpacity:.5,activeRadius:10,offsetAngle:0,labelWidth:15,ringWidth:30,customRadius:0,border:false,borderWidth:2,borderColor:"#FFFFFF",centerColor:"#FFFFFF",linearType:"none",customColor:[]},r.type=="pie"?r.extra.pie:r.extra.ring);var l={x:r.area[3]+(r.width-r.area[1]-r.area[3])/2,y:r.area[0]+(r.height-r.area[0]-r.area[2])/2};if(e.pieChartLinePadding==0){e.pieChartLinePadding=n.activeRadius*r.pix}var i=Math.min((r.width-r.area[1]-r.area[3])/2-e.pieChartLinePadding-e.pieChartTextPadding-e._pieTextMaxLength_,(r.height-r.area[0]-r.area[2])/2-e.pieChartLinePadding-e.pieChartTextPadding);i=i<10?10:i;if(n.customRadius>0){i=n.customRadius*r.pix}t=getPieDataPoints(t,i,a);var h=n.activeRadius*r.pix;n.customColor=fillCustomColor(n.linearType,n.customColor,t,e);t=t.map(function(t){t._start_+=n.offsetAngle*Math.PI/180;return t});t.forEach(function(t,e){if(r.tooltip){if(r.tooltip.index==e){o.beginPath();o.setFillStyle(hexToRgb(t.color,n.activeOpacity||.5));o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_+h,t._start_,t._start_+2*t._proportion_*Math.PI);o.closePath();o.fill()}}o.beginPath();o.setLineWidth(n.borderWidth*r.pix);o.lineJoin="round";o.setStrokeStyle(n.borderColor);var a=t.color;if(n.linearType=="custom"){var i;if(o.createCircularGradient){i=o.createCircularGradient(l.x,l.y,t._radius_)}else{i=o.createRadialGradient(l.x,l.y,0,l.x,l.y,t._radius_)}i.addColorStop(0,hexToRgb(n.customColor[t.linearIndex],1));i.addColorStop(1,hexToRgb(t.color,1));a=i}o.setFillStyle(a);o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_,t._start_,t._start_+2*t._proportion_*Math.PI);o.closePath();o.fill();if(n.border==true){o.stroke()}});if(r.type==="ring"){var s=i*.6;if(typeof n.ringWidth==="number"&&n.ringWidth>0){s=Math.max(0,i-n.ringWidth*r.pix)}o.beginPath();o.setFillStyle(n.centerColor);o.moveTo(l.x,l.y);o.arc(l.x,l.y,s,0,2*Math.PI);o.closePath();o.fill()}if(r.dataLabel!==false&&a===1){drawPieText(t,r,e,o,i,l)}if(a===1&&r.type==="ring"){drawRingTitle(r,e,o,l)}return{center:l,radius:i,series:t}}function drawRoseDataPoints(t,r,e,o){var a=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var n=assign({},{type:"area",activeOpacity:.5,activeRadius:10,offsetAngle:0,labelWidth:15,border:false,borderWidth:2,borderColor:"#FFFFFF",linearType:"none",customColor:[]},r.extra.rose);if(e.pieChartLinePadding==0){e.pieChartLinePadding=n.activeRadius*r.pix}var l={x:r.area[3]+(r.width-r.area[1]-r.area[3])/2,y:r.area[0]+(r.height-r.area[0]-r.area[2])/2};var i=Math.min((r.width-r.area[1]-r.area[3])/2-e.pieChartLinePadding-e.pieChartTextPadding-e._pieTextMaxLength_,(r.height-r.area[0]-r.area[2])/2-e.pieChartLinePadding-e.pieChartTextPadding);i=i<10?10:i;var s=n.minRadius||i*.5;t=getRoseDataPoints(t,n.type,s,i,a);var h=n.activeRadius*r.pix;n.customColor=fillCustomColor(n.linearType,n.customColor,t,e);t=t.map(function(t){t._start_+=(n.offsetAngle||0)*Math.PI/180;return t});t.forEach(function(t,e){if(r.tooltip){if(r.tooltip.index==e){o.beginPath();o.setFillStyle(hexToRgb(t.color,n.activeOpacity||.5));o.moveTo(l.x,l.y);o.arc(l.x,l.y,h+t._radius_,t._start_,t._start_+2*t._rose_proportion_*Math.PI);o.closePath();o.fill()}}o.beginPath();o.setLineWidth(n.borderWidth*r.pix);o.lineJoin="round";o.setStrokeStyle(n.borderColor);var a=t.color;if(n.linearType=="custom"){var i;if(o.createCircularGradient){i=o.createCircularGradient(l.x,l.y,t._radius_)}else{i=o.createRadialGradient(l.x,l.y,0,l.x,l.y,t._radius_)}i.addColorStop(0,hexToRgb(n.customColor[t.linearIndex],1));i.addColorStop(1,hexToRgb(t.color,1));a=i}o.setFillStyle(a);o.moveTo(l.x,l.y);o.arc(l.x,l.y,t._radius_,t._start_,t._start_+2*t._rose_proportion_*Math.PI);o.closePath();o.fill();if(n.border==true){o.stroke()}});if(r.dataLabel!==false&&a===1){drawPieText(t,r,e,o,i,l)}return{center:l,radius:i,series:t}}function drawArcbarDataPoints(a,i,t,r){var e=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var o=assign({},{startAngle:.75,endAngle:.25,type:"default",lineCap:"round",width:12,gap:2,linearType:"none",customColor:[]},i.extra.arcbar);a=getArcbarDataPoints(a,o,e);var n;if(o.centerX||o.centerY){n={x:o.centerX?o.centerX:i.width/2,y:o.centerY?o.centerY:i.height/2}}else{n={x:i.width/2,y:i.height/2}}var l;if(o.radius){l=o.radius}else{l=Math.min(n.x,n.y);l-=5*i.pix;l-=o.width/2}l=l<10?10:l;o.customColor=fillCustomColor(o.linearType,o.customColor,a,t);for(let e=0;e5&&arguments[5]!==undefined?arguments[5]:1;var f=assign({},{type:"default",startAngle:.75,endAngle:.25,width:15,labelOffset:13,splitLine:{fixRadius:0,splitNumber:10,width:15,color:"#FFFFFF",childNumber:5,childWidth:5},pointer:{width:15,color:"auto"}},c.extra.gauge);if(f.oldAngle==undefined){f.oldAngle=f.startAngle}if(f.oldData==undefined){f.oldData=0}n=getGaugeAxisPoints(n,f.startAngle,f.endAngle);var p={x:c.width/2,y:c.height/2};var g=Math.min(p.x,p.y);g-=5*c.pix;g-=f.width/2;g=g<10?10:g;var u=g-f.width;var y=0;if(f.type=="progress"){var v=g-f.width*3;d.beginPath();let t=d.createLinearGradient(p.x,p.y-v,p.x,p.y+v);t.addColorStop("0",hexToRgb(h[0].color,.3));t.addColorStop("1.0",hexToRgb("#FFFFFF",.1));d.setFillStyle(t);d.arc(p.x,p.y,v,0,2*Math.PI,false);d.fill();d.setLineWidth(f.width);d.setStrokeStyle(hexToRgb(h[0].color,.3));d.setLineCap("round");d.beginPath();d.arc(p.x,p.y,u,f.startAngle*Math.PI,f.endAngle*Math.PI,false);d.stroke();y=f.startAngle-f.endAngle+1;let e=y/f.splitLine.splitNumber;let a=y/f.splitLine.splitNumber/f.splitLine.childNumber;let i=-g-f.width*.5-f.splitLine.fixRadius;let r=-g-f.width-f.splitLine.fixRadius+f.splitLine.width;d.save();d.translate(p.x,p.y);d.rotate((f.startAngle-1)*Math.PI);let o=f.splitLine.splitNumber*f.splitLine.childNumber+1;let n=h[0].data*x;for(let t=0;tt/o){d.setStrokeStyle(hexToRgb(h[0].color,1))}else{d.setStrokeStyle(hexToRgb(h[0].color,.3))}d.setLineWidth(3*c.pix);d.moveTo(i,0);d.lineTo(r,0);d.stroke();d.rotate(a*Math.PI)}d.restore();h=getGaugeArcbarDataPoints(h,f,x);d.setLineWidth(f.width);d.setStrokeStyle(h[0].color);d.setLineCap("round");d.beginPath();d.arc(p.x,p.y,u,f.startAngle*Math.PI,h[0]._proportion_*Math.PI,false);d.stroke();let l=g-f.width*2.5;d.save();d.translate(p.x,p.y);d.rotate((h[0]._proportion_-1)*Math.PI);d.beginPath();d.setLineWidth(f.width/3);let s=d.createLinearGradient(0,-l*.6,0,l*.6);s.addColorStop("0",hexToRgb("#FFFFFF",0));s.addColorStop("0.5",hexToRgb(h[0].color,1));s.addColorStop("1.0",hexToRgb("#FFFFFF",0));d.setStrokeStyle(s);d.arc(0,0,l,.85*Math.PI,1.15*Math.PI,false);d.stroke();d.beginPath();d.setLineWidth(1);d.setStrokeStyle(h[0].color);d.setFillStyle(h[0].color);d.moveTo(-l-f.width/3/2,-4);d.lineTo(-l-f.width/3/2-4,0);d.lineTo(-l-f.width/3/2,4);d.lineTo(-l-f.width/3/2,-4);d.stroke();d.fill();d.restore()}else{d.setLineWidth(f.width);d.setLineCap("butt");for(let e=0;e4&&arguments[4]!==undefined?arguments[4]:1;var s=assign({},{gridColor:"#cccccc",gridType:"radar",gridEval:1,axisLabel:false,axisLabelTofix:0,labelColor:"#666666",labelPointShow:false,labelPointRadius:3,labelPointColor:"#cccccc",opacity:.2,gridCount:3,border:false,borderWidth:2,linearType:"none",customColor:[]},n.extra.radar);var a=getRadarCoordinateSeries(n.categories.length);var h={x:n.area[3]+(n.width-n.area[1]-n.area[3])/2,y:n.area[0]+(n.height-n.area[0]-n.area[2])/2};var r=(n.width-n.area[1]-n.area[3])/2;var d=(n.height-n.area[0]-n.area[2])/2;var c=Math.min(r-(getMaxTextListLength(n.categories,i.fontSize,l)+i.radarLabelTextMargin),d-i.radarLabelTextMargin);c-=i.radarLabelTextMargin*n.pix;c=c<10?10:c;l.beginPath();l.setLineWidth(1*n.pix);l.setStrokeStyle(s.gridColor);a.forEach(function(t,e){var a=convertCoordinateOrigin(c*Math.cos(t),c*Math.sin(t),h);l.moveTo(h.x,h.y);if(e%s.gridEval==0){l.lineTo(a.x,a.y)}});l.stroke();l.closePath();var x=function t(i){var r={};l.beginPath();l.setLineWidth(1*n.pix);l.setStrokeStyle(s.gridColor);if(s.gridType=="radar"){a.forEach(function(t,e){var a=convertCoordinateOrigin(c/s.gridCount*i*Math.cos(t),c/s.gridCount*i*Math.sin(t),h);if(e===0){r=a;l.moveTo(a.x,a.y)}else{l.lineTo(a.x,a.y)}});l.lineTo(r.x,r.y)}else{var e=convertCoordinateOrigin(c/s.gridCount*i*Math.cos(1.5),c/s.gridCount*i*Math.sin(1.5),h);l.arc(h.x,h.y,h.y-e.y,0,2*Math.PI,false)}l.stroke();l.closePath()};for(var e=1;e<=s.gridCount;e++){x(e)}s.customColor=fillCustomColor(s.linearType,s.customColor,o,i);var f=getRadarDataPoints(a,h,c,o,n,t);f.forEach(function(t,e){l.beginPath();l.setLineWidth(s.borderWidth*n.pix);l.setStrokeStyle(t.color);var a=hexToRgb(t.color,s.opacity);if(s.linearType=="custom"){var i;if(l.createCircularGradient){i=l.createCircularGradient(h.x,h.y,c)}else{i=l.createRadialGradient(h.x,h.y,0,h.x,h.y,c)}i.addColorStop(0,hexToRgb(s.customColor[o[e].linearIndex],s.opacity));i.addColorStop(1,hexToRgb(t.color,s.opacity));a=i}l.setFillStyle(a);t.data.forEach(function(t,e){if(e===0){l.moveTo(t.position.x,t.position.y)}else{l.lineTo(t.position.x,t.position.y)}});l.closePath();l.fill();if(s.border===true){l.stroke()}l.closePath();if(n.dataPointShape!==false){var r=t.data.map(function(t){return t.position});drawPointShape(r,t.color,t.pointShape,l,n)}});if(s.axisLabel===true){const p=Math.max(s.max,Math.max.apply(null,dataCombine(o)));const g=c/s.gridCount;const u=n.fontSize*n.pix;l.setFontSize(u);l.setFillStyle(n.fontColor);l.setTextAlign("left");for(var e=0;eh.x?e.xMax:h.x;e.yMin=e.yMinh.y?e.yMax:h.y}}}return e}function coordinateToPoint(t,e,a,i,r,o){return{x:(e-a.xMin)*i+r,y:(a.yMax-t)*i+o}}function pointToCoordinate(t,e,a,i,r,o){return{x:(e-r)/i+a.xMin,y:a.yMax-(t-o)/i}}function isRayIntersectsSegment(t,e,a){if(e[1]==a[1]){return false}if(e[1]>t[1]&&a[1]>t[1]){return false}if(e[1]t[1]){return false}if(a[1]==t[1]&&e[1]>t[1]){return false}if(e[0]a[t].area[2]||e[1]>a[t].area[3]||e[2]i||e[3]>r){o=true;break}else{o=false}}else{o=true;break}}}return o}function getWordCloudPoint(c,t,d){let x=c.series;switch(t){case"normal":for(let l=0;l.7){return true}else{return false}};for(let h=0;h4&&arguments[4]!==undefined?arguments[4]:1;let a=assign({},{type:"normal",autoColors:true},r.extra.word);if(!r.chartData.wordCloudData){r.chartData.wordCloudData=getWordCloudPoint(r,a.type,o)}o.beginPath();o.setFillStyle(r.background);o.rect(0,0,r.width,r.height);o.fill();o.save();let l=r.chartData.wordCloudData;o.translate(r.width/2,r.height/2);for(let i=0;i0){if(r.tooltip){if(r.tooltip.index==i){o.strokeText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}else{o.fillText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}}else{o.fillText(t,(l[i].areav[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].areav[1]+5+e-r.height/2)*n)}}}else{if(l[i].area[0]>0){if(r.tooltip){if(r.tooltip.index==i){o.strokeText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}else{o.fillText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}}else{o.fillText(t,(l[i].area[0]+5-r.width/2)*n-a*(1-n)/2,(l[i].area[1]+5+e-r.height/2)*n)}}}o.stroke();o.restore()}o.restore()}function drawFunnelDataPoints(e,a,t,i){let c=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;let r=assign({},{type:"funnel",activeWidth:10,activeOpacity:.3,border:false,borderWidth:2,borderColor:"#FFFFFF",fillOpacity:1,labelAlign:"right",linearType:"none",customColor:[]},a.extra.funnel);let o=(a.height-a.area[0]-a.area[2])/e.length;let n={x:a.area[3]+(a.width-a.area[1]-a.area[3])/2,y:a.height-a.area[2]};let l=r.activeWidth*a.pix;let d=Math.min((a.width-a.area[1]-a.area[3])/2-l,(a.height-a.area[0]-a.area[2])/2-l);e=getFunnelDataPoints(e,d,r.type,o,c);i.save();i.translate(n.x,n.y);r.customColor=fillCustomColor(r.linearType,r.customColor,e,t);if(r.type=="pyramid"){for(let t=0;t0){l.area[3]+=i[t].width+l.yAxis.padding*l.pix}else{l.area[3]+=i[t].width}a+=1}else if(i[t].position=="right"){if(e>0){l.area[1]+=i[t].width+l.yAxis.padding*l.pix}else{l.area[1]+=i[t].width}e+=1}}}else{n.yAxisWidth=i}l.chartData.yAxisData=f;if(l.categories&&l.categories.length&&l.type!=="radar"&&l.type!=="gauge"&&l.type!=="bar"){l.chartData.xAxisData=getXAxisPoints(l.categories,l,n);let t=calCategoriesData(l.categories,l,n,l.chartData.xAxisData.eachSpacing,s),e=t.xAxisHeight,a=t.angle;n.xAxisHeight=e;n._xAxisTextAngle_=a;l.area[2]+=e;l.chartData.categoriesData=t}else{if(l.type==="line"||l.type==="area"||l.type==="scatter"||l.type==="bubble"||l.type==="bar"){l.chartData.xAxisData=calXAxisData(c,l,n,s);d=l.chartData.xAxisData.rangesFormat;let t=calCategoriesData(d,l,n,l.chartData.xAxisData.eachSpacing,s),e=t.xAxisHeight,a=t.angle;n.xAxisHeight=e;n._xAxisTextAngle_=a;l.area[2]+=e;l.chartData.categoriesData=t}else{l.chartData.xAxisData={xAxisPoints:[]}}}if(l.enableScroll&&l.xAxis.scrollAlign=="right"&&l._scrollDistance_===undefined){let t=0,e=l.chartData.xAxisData.xAxisPoints,a=l.chartData.xAxisData.startX,i=l.chartData.xAxisData.endX,r=l.chartData.xAxisData.eachSpacing;let o=r*(e.length-1);let n=i-a;t=n-o;h.scrollOption.currentOffset=t;h.scrollOption.startTouchX=t;h.scrollOption.distance=0;h.scrollOption.lastMoveTime=0;l._scrollDistance_=t}if(t==="pie"||t==="ring"||t==="rose"){n._pieTextMaxLength_=l.dataLabel===false?0:getPieTextMaxLength(x,n,s,l)}switch(t){case"word":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function(t){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawWordCloudDataPoints(c,l,n,s,t);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"map":s.clearRect(0,0,l.width,l.height);drawMapDataPoints(c,l,n,s);break;case"funnel":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function(t){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.funnelData=drawFunnelDataPoints(c,l,n,s,t);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,t);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"line":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawLineDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"scatter":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawScatterDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"bubble":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawBubbleDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"mix":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawMixDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"column":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawColumnDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"mount":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawMountDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"bar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawXAxis(d,l,n,s);var a=drawBarDataPoints(c,l,n,s,e),i=a.yAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.yAxisPoints=i;l.chartData.xAxisPoints=l.chartData.xAxisData.xAxisPoints;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"area":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawAreaDataPoints(c,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"ring":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawPieDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"pie":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawPieDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"rose":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.pieData=drawRoseDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"radar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.radarData=drawRadarDataPoints(c,l,n,s,e);drawLegend(l.series,l,n,s,l.chartData);drawToolTipBridge(l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"arcbar":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.arcbarData=drawArcbarDataPoints(c,l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"gauge":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}l.chartData.gaugeData=drawGaugeDataPoints(d,c,l,n,s,e);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break;case"candle":this.animationInstance=new Animation({timing:l.timing,duration:e,onProcess:function t(e){s.clearRect(0,0,l.width,l.height);if(l.rotate){contextRotate(s,l)}drawYAxisGrid(d,l,n,s);drawXAxis(d,l,n,s);var a=drawCandleDataPoints(c,x,l,n,s,e),i=a.xAxisPoints,r=a.calPoints,o=a.eachSpacing;l.chartData.xAxisPoints=i;l.chartData.calPoints=r;l.chartData.eachSpacing=o;drawYAxis(c,l,n,s);if(l.enableMarkLine!==false&&e===1){drawMarkLine(l,n,s)}if(x){drawLegend(x,l,n,s,l.chartData)}else{drawLegend(l.series,l,n,s,l.chartData)}drawToolTipBridge(l,n,s,e,o,i);drawCanvas(l,s)},onAnimationFinish:function t(){h.uevent.trigger("renderComplete")}});break}}function uChartsEvent(){this.events={}}uChartsEvent.prototype.addEventListener=function(t,e){this.events[t]=this.events[t]||[];this.events[t].push(e)};uChartsEvent.prototype.delEventListener=function(t){this.events[t]=[]};uChartsEvent.prototype.trigger=function(){for(var t=arguments.length,e=Array(t),a=0;a0&&arguments[0]!==undefined?arguments[0]:{};this.opts=assign({},this.opts,t);this.opts.updateData=true;let c=t.scrollPosition||"current";switch(c){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 t=calYAxisData(this.opts.series,this.opts,this.config,this.context),e=t.yAxisWidth;this.config.yAxisWidth=e;let a=0;let i=getXAxisPoints(this.opts.categories,this.opts,this.config),r=i.xAxisPoints,o=i.startX,n=i.endX,l=i.eachSpacing;let s=l*(r.length-1);let h=n-o;a=h-s;this.scrollOption={currentOffset:a,startTouchX:a,distance:0,lastMoveTime:0};this.opts._scrollDistance_=a;break}drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)};uCharts.prototype.zoom=function(){var t=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.opts.xAxis.itemCount;if(this.opts.enableScroll!==true){console.log("[uCharts] 请启用滚动条后使用");return}let e=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=t.itemCount;let a=calYAxisData(this.opts.series,this.opts,this.config,this.context),i=a.yAxisWidth;this.config.yAxisWidth=i;let r=0;let o=getXAxisPoints(this.opts.categories,this.opts,this.config),h=o.xAxisPoints,c=o.startX,d=o.endX,n=o.eachSpacing;let x=n*e;let l=d-c;let s=l-n*(h.length-1);r=l/2-x;if(r>0){r=0}if(r=this.opts.categories.length?this.opts.categories.length:r;this.opts.animation=false;this.opts.xAxis.itemCount=r;let o=0;let n=getXAxisPoints(this.opts.categories,this.opts,this.config),x=n.xAxisPoints,f=n.startX,p=n.endX,l=n.eachSpacing;let g=l*this.scrollOption.moveCurrent1;let u=p-f;let y=u-l*(x.length-1);o=-g+Math.min(i[0].x,i[1].x)-this.opts.area[3]-l;if(o>0){o=0}if(o1&&arguments[1]!==undefined?arguments[1]:{};var a=null;if(t.changedTouches){a=t.changedTouches[0]}else{a=t.mp.changedTouches[0]}if(a){var i=getTouches(a,this.opts,t);var r=this.getLegendDataIndex(t);if(r>=0){if(this.opts.type=="candle"){this.opts.seriesMA[r].show=!this.opts.seriesMA[r].show}else{this.opts.series[r].show=!this.opts.series[r].show}this.opts.animation=e.animation?true:false;this.opts._scrollDistance_=this.scrollOption.currentOffset;drawCharts.call(this,this.opts.type,this.opts,this.config,this.context)}}};uCharts.prototype.showToolTip=function(t){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var c=null;if(t.changedTouches){c=t.changedTouches[0]}else{c=t.mp.changedTouches[0]}if(!c){console.log("[uCharts] 未获取到event坐标信息")}var a=getTouches(c,this.opts,t);var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});if(this.opts.type==="line"||this.opts.type==="area"||this.opts.type==="column"||this.opts.type==="scatter"||this.opts.type==="bubble"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1||o.length>0){var n=getSeriesDataItem(this.opts.series,o,r.group);if(n.length!==0){var l=getToolTipData(n,this.opts,o,r.group,this.opts.categories,e),s=l.textList,h=l.offset;h.y=a.y;i.tooltip={textList:e.textList!==undefined?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="mount"){var o=e.index==undefined?this.getCurrentDataIndex(t).index:e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},i._series_[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,i):n.name+": "+n.data,color:n.color}];var h={x:i.chartData.calPoints[o].x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="bar"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1||o.length>0){var n=getSeriesDataItem(this.opts.series,o,r.group);if(n.length!==0){var l=getToolTipData(n,this.opts,o,r.group,this.opts.categories,e),s=l.textList,h=l.offset;h.x=a.x;i.tooltip={textList:e.textList!==undefined?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="mix"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1){var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var x=getMixToolTipData(n,this.opts,o,this.opts.categories,e),s=x.textList,h=x.offset;h.y=a.y;i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="candle"){var r=this.getCurrentDataIndex(t);var o=e.index==undefined?r.index:e.index;if(o>-1){var d=this.scrollOption.currentOffset;var i=assign({},this.opts,{_scrollDistance_:d,animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var l=getCandleToolTipData(this.opts.series[0].data,n,this.opts,o,this.opts.categories,this.opts.extra.candle,e),s=l.textList,h=l.offset;h.y=a.y;i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="pie"||this.opts.type==="ring"||this.opts.type==="rose"||this.opts.type==="funnel"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},i._series_[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,i):n.name+": "+n.data,color:n.color}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="map"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},this.opts.series[o]);n.name=n.properties.name;var s=[{text:e.formatter?e.formatter(n,undefined,o,this.opts):n.name,color:n.color}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}i.updateData=false;drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="word"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=assign({},this.opts.series[o]);var s=[{text:e.formatter?e.formatter(n,undefined,o,this.opts):n.name,color:n.color}];var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}i.updateData=false;drawCharts.call(this,i.type,i,this.config,this.context)}if(this.opts.type==="radar"){var o=e.index==undefined?this.getCurrentDataIndex(t):e.index;if(o>-1){var i=assign({},this.opts,{animation:false});var n=getSeriesDataItem(this.opts.series,o);if(n.length!==0){var s=n.map(t=>{return{text:e.formatter?e.formatter(t,this.opts.categories[o],o,this.opts):t.name+": "+t.data,color:t.color}});var h={x:a.x,y:a.y};i.tooltip={textList:e.textList?e.textList:s,offset:e.offset!==undefined?e.offset:h,option:e,index:o}}}drawCharts.call(this,i.type,i,this.config,this.context)}};uCharts.prototype.translate=function(t){this.scrollOption={currentOffset:t,startTouchX:t,distance:0,lastMoveTime:0};let e=assign({},this.opts,{_scrollDistance_:t,animation:false});drawCharts.call(this,this.opts.type,e,this.config,this.context)};uCharts.prototype.scrollStart=function(t){var e=null;if(t.changedTouches){e=t.changedTouches[0]}else{e=t.mp.changedTouches[0]}var a=getTouches(e,this.opts,t);if(e&&this.opts.enableScroll===true){this.scrollOption.startTouchX=a.x}};uCharts.prototype.scroll=function(t){if(this.scrollOption.lastMoveTime===0){this.scrollOption.lastMoveTime=Date.now()}let e=this.opts.touchMoveLimit||60;let a=Date.now();let i=a-this.scrollOption.lastMoveTime;if(i写给uCharts使用者的一封信
+
+亲爱的用户:
+
+- 由于最近上线的官网中实行了部分收费体验,收到了许多用户的使用反馈,大致反馈的问题都指向同一矛头:为何新官网的在线工具也要收费?对于这件事,我们深表歉意。由于新官网本身未提供技术文档,使得用户误以为我们对文档实行了收费。经我们连夜整改,新官网目前已经将技术文档开放出来供大家阅读使用,并免费对外开放了【演示】中的查看全端全平台的代码的功能,为此再次向所受影响的用户们致以诚恳的歉意。
+
+- 其次,我们须澄清几点,如下:
+1. uCharts的插件本身遵循开源原则,并不收费,用户可自行到DCloud市场与Gitee码云上获取源码
+2. uCharts的技术文档永久对用户开放
+3. 收费内容仅针对原生工具、组件工具、定制功能以及模板市场的部分收费模板
+
+- uCharts为什么实行收费原则?
+1. 服务器的费用支撑
+2. 团队的运营支出;正如你所见,我们的群里有大量的用户在请教图表配置与反馈问题,群里的每一位管理员都在花费不少精力在积极解决用户的问题,然而遇到巨大的咨询量时,我们无法及时、精准解答回复,因此,我们推出了会员优先服务
+3. 与其说模板市场是收费,倒不如说给野生用户提供了创造价值的机会,用户既可以在上面发布模板赚取费用,遇到心动的模板也能免费/付费使用
+
+- 收费不是目的,正如你们所见,用户可以申请成为[【开发者】](https://www.ucharts.cn/v2/#/agreement/developer),开发者不限制任何官网功能,并享有官方指导、开发、改造uCharts的权力,并且活动期间【返还超级会员费用】!我们想说的是,我们新版官网上线旨在希望更多的用户加入到开发者的队伍,我们共同去维护uCharts!
+
+我们相信:星星之火可以燎原!
+
+uCharts技术团队
+
+2022.4.23
+
+
+
+
+
+
+
+[](https://gitee.com/uCharts/uCharts/stargazers)
+[](https://gitee.com/uCharts/uCharts/members)
+[](https://www.apache.org/licenses/LICENSE-2.0.html)
+[](https://www.npmjs.com/~qiun)
+
+
+## uCharts简介
+
+`uCharts`是一款基于`canvas API`开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro )、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等更多支持 canvas API 的平台。
+
+## 官方网站
+
+## [https://www.ucharts.cn](https://www.ucharts.cn)
+
+## 快速体验
+
+一套代码编到多个平台,依次扫描二维码,亲自体验uCharts图表跨平台效果!其他平台请自行编译。
+
+
+
+## 致开发者
+
+感谢各位开发者`四年`来对秋云及uCharts的支持,uCharts的进步离不开各位开发者的鼓励与贡献。为更好的帮助各位开发者使用图表工具,我们推出了新版官网,增加了在线定制、问答社区、在线配置等一些增值服务,为确保您能更好的应用图表组件,建议您先`仔细阅读本页指南`以及`常见问题`,而不是下载下来`直接使用`。如仍然不能解决,请到`官网社区`或开通会员后加入`专属VIP会员群`提问将会很快得到回答。
+
+## 社群支持
+
+uCharts官方拥有4个2000人的QQ群及专属VIP会员群支持,庞大的用户量证明我们一直在努力,请各位放心使用!uCharts的开源图表组件的开发,团队付出了大量的时间与精力,经过四来的考验,不会有比较明显的bug,请各位放心使用。如果您有更好的想法,可以在`码云提交Pull Requests`以帮助更多开发者完成需求,再次感谢各位对uCharts的鼓励与支持!
+
+#### 官方交流群
+- 交流群1:371774600(已满)
+- 交流群2:619841586(已满)
+- 交流群3:955340127(已满)
+- 交流群4:641669795
+- 口令`uniapp`
+
+#### 专属VIP会员群
+- 开通会员后详见【账号详情】页面中顶部的滚动通知
+- 口令`您的用户ID`
+
+## 版权信息
+
+uCharts始终坚持开源,遵循 [Apache Licence 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) 开源协议,意味着您无需支付任何费用,即可将uCharts应用到您的产品中。
+
+注意:这并不意味着您可以将uCharts应用到非法的领域,比如涉及赌博,暴力等方面。如因此产生纠纷或法律问题,uCharts相关方及秋云科技不承担任何责任。
+
+## 合作伙伴
+
+[](https://www.diygw.com/)
+[](https://gitee.com/howcode/has-chat)
+[](https://www.uviewui.com/)
+[](https://ext.dcloud.net.cn/plugin?id=7088)
+[](https://ext.dcloud.net.cn/publisher?id=202)
+[](https://www.firstui.cn/)
+[](https://ext.dcloud.net.cn/plugin?id=5169)
+[](https://www.graceui.com/)
+
+
+## 更新记录
+
+详见官网指南中说明,[点击此处查看](https://www.ucharts.cn/v2/#/guide/index?id=100)
+
+
+## 相关链接
+- [uCharts官网](https://www.ucharts.cn)
+- [DCloud插件市场地址](https://ext.dcloud.net.cn/plugin?id=271)
+- [uCharts码云开源托管地址](https://gitee.com/uCharts/uCharts) [](https://gitee.com/uCharts/uCharts/stargazers)
+- [uCharts npm开源地址](https://www.ucharts.cn)
+- [ECharts官网](https://echarts.apache.org/zh/index.html)
+- [ECharts配置手册](https://echarts.apache.org/zh/option.html)
+- [图表组件在项目中的应用 ReportPlus数据报表](https://www.ucharts.cn/v2/#/layout/info?id=1)
\ No newline at end of file
diff --git a/uni_modules/uni-easyinput/changelog.md b/uni_modules/uni-easyinput/changelog.md
new file mode 100644
index 0000000..6c6b083
--- /dev/null
+++ b/uni_modules/uni-easyinput/changelog.md
@@ -0,0 +1,41 @@
+## 1.0.5(2022-06-07)
+- 优化 clearable 显示策略
+## 1.0.4(2022-06-07)
+- 优化 clearable 显示策略
+## 1.0.3(2022-05-20)
+- 修复 关闭图标某些情况下无法取消的bug
+## 1.0.2(2022-04-12)
+- 修复 默认值不生效的bug
+## 1.0.1(2022-04-02)
+- 修复 value不能为0的bug
+## 1.0.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+## 0.1.4(2021-08-20)
+- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
+## 0.1.3(2021-08-11)
+- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+## 0.1.2(2021-07-30)
+- 优化 vue3下事件警告的问题
+## 0.1.1
+- 优化 errorMessage 属性支持 Boolean 类型
+## 0.1.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.0.16(2021-06-29)
+- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug
+## 0.0.15(2021-06-21)
+- 修复 passwordIcon 属性拼写错误的 bug
+## 0.0.14(2021-06-18)
+- 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标
+- 修复 confirmType 属性不生效的问题
+## 0.0.13(2021-06-04)
+- 修复 disabled 状态可清出内容的 bug
+## 0.0.12(2021-05-12)
+- 新增 组件示例地址
+## 0.0.11(2021-05-07)
+- 修复 input-border 属性不生效的问题
+## 0.0.10(2021-04-30)
+- 修复 ios 遮挡文字、显示一半的问题
+## 0.0.9(2021-02-05)
+- 调整为uni_modules目录规范
+- 优化 兼容 nvue 页面
diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/uni_modules/uni-easyinput/components/uni-easyinput/common.js
new file mode 100644
index 0000000..df9abe1
--- /dev/null
+++ b/uni_modules/uni-easyinput/components/uni-easyinput/common.js
@@ -0,0 +1,56 @@
+/**
+ * @desc 函数防抖
+ * @param func 目标函数
+ * @param wait 延迟执行毫秒数
+ * @param immediate true - 立即执行, false - 延迟执行
+ */
+export const debounce = function(func, wait = 1000, immediate = true) {
+ let timer;
+ console.log(1);
+ return function() {
+ console.log(123);
+ let context = this,
+ args = arguments;
+ if (timer) clearTimeout(timer);
+ if (immediate) {
+ let callNow = !timer;
+ timer = setTimeout(() => {
+ timer = null;
+ }, wait);
+ if (callNow) func.apply(context, args);
+ } else {
+ timer = setTimeout(() => {
+ func.apply(context, args);
+ }, wait)
+ }
+ }
+}
+/**
+ * @desc 函数节流
+ * @param func 函数
+ * @param wait 延迟执行毫秒数
+ * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发
+ */
+export const throttle = (func, wait = 1000, type = 1) => {
+ let previous = 0;
+ let timeout;
+ return function() {
+ let context = this;
+ let args = arguments;
+ if (type === 1) {
+ let now = Date.now();
+
+ if (now - previous > wait) {
+ func.apply(context, args);
+ previous = now;
+ }
+ } else if (type === 2) {
+ if (!timeout) {
+ timeout = setTimeout(() => {
+ timeout = null;
+ func.apply(context, args)
+ }, wait)
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
new file mode 100644
index 0000000..36e7702
--- /dev/null
+++ b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
@@ -0,0 +1,461 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-easyinput/package.json b/uni_modules/uni-easyinput/package.json
new file mode 100644
index 0000000..15482b2
--- /dev/null
+++ b/uni_modules/uni-easyinput/package.json
@@ -0,0 +1,90 @@
+{
+ "id": "uni-easyinput",
+ "displayName": "uni-easyinput 增强输入框",
+ "version": "1.0.5",
+ "description": "Easyinput 组件是对原生input组件的增强",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "input",
+ "uni-easyinput",
+ "输入框"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-easyinput/readme.md b/uni_modules/uni-easyinput/readme.md
new file mode 100644
index 0000000..f1faf8f
--- /dev/null
+++ b/uni_modules/uni-easyinput/readme.md
@@ -0,0 +1,11 @@
+
+
+### Easyinput 增强输入框
+> **组件名:uni-easyinput**
+> 代码块: `uEasyinput`
+
+
+easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md
new file mode 100644
index 0000000..6449885
--- /dev/null
+++ b/uni_modules/uni-icons/changelog.md
@@ -0,0 +1,22 @@
+## 1.3.5(2022-01-24)
+- 优化 size 属性可以传入不带单位的字符串数值
+## 1.3.4(2022-01-24)
+- 优化 size 支持其他单位
+## 1.3.3(2022-01-17)
+- 修复 nvue 有些图标不显示的bug,兼容老版本图标
+## 1.3.2(2021-12-01)
+- 优化 示例可复制图标名称
+## 1.3.1(2021-11-23)
+- 优化 兼容旧组件 type 值
+## 1.3.0(2021-11-19)
+- 新增 更多图标
+- 优化 自定义图标使用方式
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7(2021-11-08)
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.5(2021-05-12)
+- 新增 组件示例地址
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js
new file mode 100644
index 0000000..7889936
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/icons.js
@@ -0,0 +1,1169 @@
+export default {
+ "id": "2852637",
+ "name": "uniui图标库",
+ "font_family": "uniicons",
+ "css_prefix_text": "uniui-",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "25027049",
+ "name": "yanse",
+ "font_class": "color",
+ "unicode": "e6cf",
+ "unicode_decimal": 59087
+ },
+ {
+ "icon_id": "25027048",
+ "name": "wallet",
+ "font_class": "wallet",
+ "unicode": "e6b1",
+ "unicode_decimal": 59057
+ },
+ {
+ "icon_id": "25015720",
+ "name": "settings-filled",
+ "font_class": "settings-filled",
+ "unicode": "e6ce",
+ "unicode_decimal": 59086
+ },
+ {
+ "icon_id": "25015434",
+ "name": "shimingrenzheng-filled",
+ "font_class": "auth-filled",
+ "unicode": "e6cc",
+ "unicode_decimal": 59084
+ },
+ {
+ "icon_id": "24934246",
+ "name": "shop-filled",
+ "font_class": "shop-filled",
+ "unicode": "e6cd",
+ "unicode_decimal": 59085
+ },
+ {
+ "icon_id": "24934159",
+ "name": "staff-filled-01",
+ "font_class": "staff-filled",
+ "unicode": "e6cb",
+ "unicode_decimal": 59083
+ },
+ {
+ "icon_id": "24932461",
+ "name": "VIP-filled",
+ "font_class": "vip-filled",
+ "unicode": "e6c6",
+ "unicode_decimal": 59078
+ },
+ {
+ "icon_id": "24932462",
+ "name": "plus_circle_fill",
+ "font_class": "plus-filled",
+ "unicode": "e6c7",
+ "unicode_decimal": 59079
+ },
+ {
+ "icon_id": "24932463",
+ "name": "folder_add-filled",
+ "font_class": "folder-add-filled",
+ "unicode": "e6c8",
+ "unicode_decimal": 59080
+ },
+ {
+ "icon_id": "24932464",
+ "name": "yanse-filled",
+ "font_class": "color-filled",
+ "unicode": "e6c9",
+ "unicode_decimal": 59081
+ },
+ {
+ "icon_id": "24932465",
+ "name": "tune-filled",
+ "font_class": "tune-filled",
+ "unicode": "e6ca",
+ "unicode_decimal": 59082
+ },
+ {
+ "icon_id": "24932455",
+ "name": "a-rilidaka-filled",
+ "font_class": "calendar-filled",
+ "unicode": "e6c0",
+ "unicode_decimal": 59072
+ },
+ {
+ "icon_id": "24932456",
+ "name": "notification-filled",
+ "font_class": "notification-filled",
+ "unicode": "e6c1",
+ "unicode_decimal": 59073
+ },
+ {
+ "icon_id": "24932457",
+ "name": "wallet-filled",
+ "font_class": "wallet-filled",
+ "unicode": "e6c2",
+ "unicode_decimal": 59074
+ },
+ {
+ "icon_id": "24932458",
+ "name": "paihangbang-filled",
+ "font_class": "medal-filled",
+ "unicode": "e6c3",
+ "unicode_decimal": 59075
+ },
+ {
+ "icon_id": "24932459",
+ "name": "gift-filled",
+ "font_class": "gift-filled",
+ "unicode": "e6c4",
+ "unicode_decimal": 59076
+ },
+ {
+ "icon_id": "24932460",
+ "name": "fire-filled",
+ "font_class": "fire-filled",
+ "unicode": "e6c5",
+ "unicode_decimal": 59077
+ },
+ {
+ "icon_id": "24928001",
+ "name": "refreshempty",
+ "font_class": "refreshempty",
+ "unicode": "e6bf",
+ "unicode_decimal": 59071
+ },
+ {
+ "icon_id": "24926853",
+ "name": "location-ellipse",
+ "font_class": "location-filled",
+ "unicode": "e6af",
+ "unicode_decimal": 59055
+ },
+ {
+ "icon_id": "24926735",
+ "name": "person-filled",
+ "font_class": "person-filled",
+ "unicode": "e69d",
+ "unicode_decimal": 59037
+ },
+ {
+ "icon_id": "24926703",
+ "name": "personadd-filled",
+ "font_class": "personadd-filled",
+ "unicode": "e698",
+ "unicode_decimal": 59032
+ },
+ {
+ "icon_id": "24923351",
+ "name": "back",
+ "font_class": "back",
+ "unicode": "e6b9",
+ "unicode_decimal": 59065
+ },
+ {
+ "icon_id": "24923352",
+ "name": "forward",
+ "font_class": "forward",
+ "unicode": "e6ba",
+ "unicode_decimal": 59066
+ },
+ {
+ "icon_id": "24923353",
+ "name": "arrowthinright",
+ "font_class": "arrow-right",
+ "unicode": "e6bb",
+ "unicode_decimal": 59067
+ },
+ {
+ "icon_id": "24923353",
+ "name": "arrowthinright",
+ "font_class": "arrowthinright",
+ "unicode": "e6bb",
+ "unicode_decimal": 59067
+ },
+ {
+ "icon_id": "24923354",
+ "name": "arrowthinleft",
+ "font_class": "arrow-left",
+ "unicode": "e6bc",
+ "unicode_decimal": 59068
+ },
+ {
+ "icon_id": "24923354",
+ "name": "arrowthinleft",
+ "font_class": "arrowthinleft",
+ "unicode": "e6bc",
+ "unicode_decimal": 59068
+ },
+ {
+ "icon_id": "24923355",
+ "name": "arrowthinup",
+ "font_class": "arrow-up",
+ "unicode": "e6bd",
+ "unicode_decimal": 59069
+ },
+ {
+ "icon_id": "24923355",
+ "name": "arrowthinup",
+ "font_class": "arrowthinup",
+ "unicode": "e6bd",
+ "unicode_decimal": 59069
+ },
+ {
+ "icon_id": "24923356",
+ "name": "arrowthindown",
+ "font_class": "arrow-down",
+ "unicode": "e6be",
+ "unicode_decimal": 59070
+ },{
+ "icon_id": "24923356",
+ "name": "arrowthindown",
+ "font_class": "arrowthindown",
+ "unicode": "e6be",
+ "unicode_decimal": 59070
+ },
+ {
+ "icon_id": "24923349",
+ "name": "arrowdown",
+ "font_class": "bottom",
+ "unicode": "e6b8",
+ "unicode_decimal": 59064
+ },{
+ "icon_id": "24923349",
+ "name": "arrowdown",
+ "font_class": "arrowdown",
+ "unicode": "e6b8",
+ "unicode_decimal": 59064
+ },
+ {
+ "icon_id": "24923346",
+ "name": "arrowright",
+ "font_class": "right",
+ "unicode": "e6b5",
+ "unicode_decimal": 59061
+ },
+ {
+ "icon_id": "24923346",
+ "name": "arrowright",
+ "font_class": "arrowright",
+ "unicode": "e6b5",
+ "unicode_decimal": 59061
+ },
+ {
+ "icon_id": "24923347",
+ "name": "arrowup",
+ "font_class": "top",
+ "unicode": "e6b6",
+ "unicode_decimal": 59062
+ },
+ {
+ "icon_id": "24923347",
+ "name": "arrowup",
+ "font_class": "arrowup",
+ "unicode": "e6b6",
+ "unicode_decimal": 59062
+ },
+ {
+ "icon_id": "24923348",
+ "name": "arrowleft",
+ "font_class": "left",
+ "unicode": "e6b7",
+ "unicode_decimal": 59063
+ },
+ {
+ "icon_id": "24923348",
+ "name": "arrowleft",
+ "font_class": "arrowleft",
+ "unicode": "e6b7",
+ "unicode_decimal": 59063
+ },
+ {
+ "icon_id": "24923334",
+ "name": "eye",
+ "font_class": "eye",
+ "unicode": "e651",
+ "unicode_decimal": 58961
+ },
+ {
+ "icon_id": "24923335",
+ "name": "eye-filled",
+ "font_class": "eye-filled",
+ "unicode": "e66a",
+ "unicode_decimal": 58986
+ },
+ {
+ "icon_id": "24923336",
+ "name": "eye-slash",
+ "font_class": "eye-slash",
+ "unicode": "e6b3",
+ "unicode_decimal": 59059
+ },
+ {
+ "icon_id": "24923337",
+ "name": "eye-slash-filled",
+ "font_class": "eye-slash-filled",
+ "unicode": "e6b4",
+ "unicode_decimal": 59060
+ },
+ {
+ "icon_id": "24923305",
+ "name": "info-filled",
+ "font_class": "info-filled",
+ "unicode": "e649",
+ "unicode_decimal": 58953
+ },
+ {
+ "icon_id": "24923299",
+ "name": "reload-01",
+ "font_class": "reload",
+ "unicode": "e6b2",
+ "unicode_decimal": 59058
+ },
+ {
+ "icon_id": "24923195",
+ "name": "mic_slash_fill",
+ "font_class": "micoff-filled",
+ "unicode": "e6b0",
+ "unicode_decimal": 59056
+ },
+ {
+ "icon_id": "24923165",
+ "name": "map-pin-ellipse",
+ "font_class": "map-pin-ellipse",
+ "unicode": "e6ac",
+ "unicode_decimal": 59052
+ },
+ {
+ "icon_id": "24923166",
+ "name": "map-pin",
+ "font_class": "map-pin",
+ "unicode": "e6ad",
+ "unicode_decimal": 59053
+ },
+ {
+ "icon_id": "24923167",
+ "name": "location",
+ "font_class": "location",
+ "unicode": "e6ae",
+ "unicode_decimal": 59054
+ },
+ {
+ "icon_id": "24923064",
+ "name": "starhalf",
+ "font_class": "starhalf",
+ "unicode": "e683",
+ "unicode_decimal": 59011
+ },
+ {
+ "icon_id": "24923065",
+ "name": "star",
+ "font_class": "star",
+ "unicode": "e688",
+ "unicode_decimal": 59016
+ },
+ {
+ "icon_id": "24923066",
+ "name": "star-filled",
+ "font_class": "star-filled",
+ "unicode": "e68f",
+ "unicode_decimal": 59023
+ },
+ {
+ "icon_id": "24899646",
+ "name": "a-rilidaka",
+ "font_class": "calendar",
+ "unicode": "e6a0",
+ "unicode_decimal": 59040
+ },
+ {
+ "icon_id": "24899647",
+ "name": "fire",
+ "font_class": "fire",
+ "unicode": "e6a1",
+ "unicode_decimal": 59041
+ },
+ {
+ "icon_id": "24899648",
+ "name": "paihangbang",
+ "font_class": "medal",
+ "unicode": "e6a2",
+ "unicode_decimal": 59042
+ },
+ {
+ "icon_id": "24899649",
+ "name": "font",
+ "font_class": "font",
+ "unicode": "e6a3",
+ "unicode_decimal": 59043
+ },
+ {
+ "icon_id": "24899650",
+ "name": "gift",
+ "font_class": "gift",
+ "unicode": "e6a4",
+ "unicode_decimal": 59044
+ },
+ {
+ "icon_id": "24899651",
+ "name": "link",
+ "font_class": "link",
+ "unicode": "e6a5",
+ "unicode_decimal": 59045
+ },
+ {
+ "icon_id": "24899652",
+ "name": "notification",
+ "font_class": "notification",
+ "unicode": "e6a6",
+ "unicode_decimal": 59046
+ },
+ {
+ "icon_id": "24899653",
+ "name": "staff",
+ "font_class": "staff",
+ "unicode": "e6a7",
+ "unicode_decimal": 59047
+ },
+ {
+ "icon_id": "24899654",
+ "name": "VIP",
+ "font_class": "vip",
+ "unicode": "e6a8",
+ "unicode_decimal": 59048
+ },
+ {
+ "icon_id": "24899655",
+ "name": "folder_add",
+ "font_class": "folder-add",
+ "unicode": "e6a9",
+ "unicode_decimal": 59049
+ },
+ {
+ "icon_id": "24899656",
+ "name": "tune",
+ "font_class": "tune",
+ "unicode": "e6aa",
+ "unicode_decimal": 59050
+ },
+ {
+ "icon_id": "24899657",
+ "name": "shimingrenzheng",
+ "font_class": "auth",
+ "unicode": "e6ab",
+ "unicode_decimal": 59051
+ },
+ {
+ "icon_id": "24899565",
+ "name": "person",
+ "font_class": "person",
+ "unicode": "e699",
+ "unicode_decimal": 59033
+ },
+ {
+ "icon_id": "24899566",
+ "name": "email-filled",
+ "font_class": "email-filled",
+ "unicode": "e69a",
+ "unicode_decimal": 59034
+ },
+ {
+ "icon_id": "24899567",
+ "name": "phone-filled",
+ "font_class": "phone-filled",
+ "unicode": "e69b",
+ "unicode_decimal": 59035
+ },
+ {
+ "icon_id": "24899568",
+ "name": "phone",
+ "font_class": "phone",
+ "unicode": "e69c",
+ "unicode_decimal": 59036
+ },
+ {
+ "icon_id": "24899570",
+ "name": "email",
+ "font_class": "email",
+ "unicode": "e69e",
+ "unicode_decimal": 59038
+ },
+ {
+ "icon_id": "24899571",
+ "name": "personadd",
+ "font_class": "personadd",
+ "unicode": "e69f",
+ "unicode_decimal": 59039
+ },
+ {
+ "icon_id": "24899558",
+ "name": "chatboxes-filled",
+ "font_class": "chatboxes-filled",
+ "unicode": "e692",
+ "unicode_decimal": 59026
+ },
+ {
+ "icon_id": "24899559",
+ "name": "contact",
+ "font_class": "contact",
+ "unicode": "e693",
+ "unicode_decimal": 59027
+ },
+ {
+ "icon_id": "24899560",
+ "name": "chatbubble-filled",
+ "font_class": "chatbubble-filled",
+ "unicode": "e694",
+ "unicode_decimal": 59028
+ },
+ {
+ "icon_id": "24899561",
+ "name": "contact-filled",
+ "font_class": "contact-filled",
+ "unicode": "e695",
+ "unicode_decimal": 59029
+ },
+ {
+ "icon_id": "24899562",
+ "name": "chatboxes",
+ "font_class": "chatboxes",
+ "unicode": "e696",
+ "unicode_decimal": 59030
+ },
+ {
+ "icon_id": "24899563",
+ "name": "chatbubble",
+ "font_class": "chatbubble",
+ "unicode": "e697",
+ "unicode_decimal": 59031
+ },
+ {
+ "icon_id": "24881290",
+ "name": "upload-filled",
+ "font_class": "upload-filled",
+ "unicode": "e68e",
+ "unicode_decimal": 59022
+ },
+ {
+ "icon_id": "24881292",
+ "name": "upload",
+ "font_class": "upload",
+ "unicode": "e690",
+ "unicode_decimal": 59024
+ },
+ {
+ "icon_id": "24881293",
+ "name": "weixin",
+ "font_class": "weixin",
+ "unicode": "e691",
+ "unicode_decimal": 59025
+ },
+ {
+ "icon_id": "24881274",
+ "name": "compose",
+ "font_class": "compose",
+ "unicode": "e67f",
+ "unicode_decimal": 59007
+ },
+ {
+ "icon_id": "24881275",
+ "name": "qq",
+ "font_class": "qq",
+ "unicode": "e680",
+ "unicode_decimal": 59008
+ },
+ {
+ "icon_id": "24881276",
+ "name": "download-filled",
+ "font_class": "download-filled",
+ "unicode": "e681",
+ "unicode_decimal": 59009
+ },
+ {
+ "icon_id": "24881277",
+ "name": "pengyouquan",
+ "font_class": "pyq",
+ "unicode": "e682",
+ "unicode_decimal": 59010
+ },
+ {
+ "icon_id": "24881279",
+ "name": "sound",
+ "font_class": "sound",
+ "unicode": "e684",
+ "unicode_decimal": 59012
+ },
+ {
+ "icon_id": "24881280",
+ "name": "trash-filled",
+ "font_class": "trash-filled",
+ "unicode": "e685",
+ "unicode_decimal": 59013
+ },
+ {
+ "icon_id": "24881281",
+ "name": "sound-filled",
+ "font_class": "sound-filled",
+ "unicode": "e686",
+ "unicode_decimal": 59014
+ },
+ {
+ "icon_id": "24881282",
+ "name": "trash",
+ "font_class": "trash",
+ "unicode": "e687",
+ "unicode_decimal": 59015
+ },
+ {
+ "icon_id": "24881284",
+ "name": "videocam-filled",
+ "font_class": "videocam-filled",
+ "unicode": "e689",
+ "unicode_decimal": 59017
+ },
+ {
+ "icon_id": "24881285",
+ "name": "spinner-cycle",
+ "font_class": "spinner-cycle",
+ "unicode": "e68a",
+ "unicode_decimal": 59018
+ },
+ {
+ "icon_id": "24881286",
+ "name": "weibo",
+ "font_class": "weibo",
+ "unicode": "e68b",
+ "unicode_decimal": 59019
+ },
+ {
+ "icon_id": "24881288",
+ "name": "videocam",
+ "font_class": "videocam",
+ "unicode": "e68c",
+ "unicode_decimal": 59020
+ },
+ {
+ "icon_id": "24881289",
+ "name": "download",
+ "font_class": "download",
+ "unicode": "e68d",
+ "unicode_decimal": 59021
+ },
+ {
+ "icon_id": "24879601",
+ "name": "help",
+ "font_class": "help",
+ "unicode": "e679",
+ "unicode_decimal": 59001
+ },
+ {
+ "icon_id": "24879602",
+ "name": "navigate-filled",
+ "font_class": "navigate-filled",
+ "unicode": "e67a",
+ "unicode_decimal": 59002
+ },
+ {
+ "icon_id": "24879603",
+ "name": "plusempty",
+ "font_class": "plusempty",
+ "unicode": "e67b",
+ "unicode_decimal": 59003
+ },
+ {
+ "icon_id": "24879604",
+ "name": "smallcircle",
+ "font_class": "smallcircle",
+ "unicode": "e67c",
+ "unicode_decimal": 59004
+ },
+ {
+ "icon_id": "24879605",
+ "name": "minus-filled",
+ "font_class": "minus-filled",
+ "unicode": "e67d",
+ "unicode_decimal": 59005
+ },
+ {
+ "icon_id": "24879606",
+ "name": "micoff",
+ "font_class": "micoff",
+ "unicode": "e67e",
+ "unicode_decimal": 59006
+ },
+ {
+ "icon_id": "24879588",
+ "name": "closeempty",
+ "font_class": "closeempty",
+ "unicode": "e66c",
+ "unicode_decimal": 58988
+ },
+ {
+ "icon_id": "24879589",
+ "name": "clear",
+ "font_class": "clear",
+ "unicode": "e66d",
+ "unicode_decimal": 58989
+ },
+ {
+ "icon_id": "24879590",
+ "name": "navigate",
+ "font_class": "navigate",
+ "unicode": "e66e",
+ "unicode_decimal": 58990
+ },
+ {
+ "icon_id": "24879591",
+ "name": "minus",
+ "font_class": "minus",
+ "unicode": "e66f",
+ "unicode_decimal": 58991
+ },
+ {
+ "icon_id": "24879592",
+ "name": "image",
+ "font_class": "image",
+ "unicode": "e670",
+ "unicode_decimal": 58992
+ },
+ {
+ "icon_id": "24879593",
+ "name": "mic",
+ "font_class": "mic",
+ "unicode": "e671",
+ "unicode_decimal": 58993
+ },
+ {
+ "icon_id": "24879594",
+ "name": "paperplane",
+ "font_class": "paperplane",
+ "unicode": "e672",
+ "unicode_decimal": 58994
+ },
+ {
+ "icon_id": "24879595",
+ "name": "close",
+ "font_class": "close",
+ "unicode": "e673",
+ "unicode_decimal": 58995
+ },
+ {
+ "icon_id": "24879596",
+ "name": "help-filled",
+ "font_class": "help-filled",
+ "unicode": "e674",
+ "unicode_decimal": 58996
+ },
+ {
+ "icon_id": "24879597",
+ "name": "plus-filled",
+ "font_class": "paperplane-filled",
+ "unicode": "e675",
+ "unicode_decimal": 58997
+ },
+ {
+ "icon_id": "24879598",
+ "name": "plus",
+ "font_class": "plus",
+ "unicode": "e676",
+ "unicode_decimal": 58998
+ },
+ {
+ "icon_id": "24879599",
+ "name": "mic-filled",
+ "font_class": "mic-filled",
+ "unicode": "e677",
+ "unicode_decimal": 58999
+ },
+ {
+ "icon_id": "24879600",
+ "name": "image-filled",
+ "font_class": "image-filled",
+ "unicode": "e678",
+ "unicode_decimal": 59000
+ },
+ {
+ "icon_id": "24855900",
+ "name": "locked-filled",
+ "font_class": "locked-filled",
+ "unicode": "e668",
+ "unicode_decimal": 58984
+ },
+ {
+ "icon_id": "24855901",
+ "name": "info",
+ "font_class": "info",
+ "unicode": "e669",
+ "unicode_decimal": 58985
+ },
+ {
+ "icon_id": "24855903",
+ "name": "locked",
+ "font_class": "locked",
+ "unicode": "e66b",
+ "unicode_decimal": 58987
+ },
+ {
+ "icon_id": "24855884",
+ "name": "camera-filled",
+ "font_class": "camera-filled",
+ "unicode": "e658",
+ "unicode_decimal": 58968
+ },
+ {
+ "icon_id": "24855885",
+ "name": "chat-filled",
+ "font_class": "chat-filled",
+ "unicode": "e659",
+ "unicode_decimal": 58969
+ },
+ {
+ "icon_id": "24855886",
+ "name": "camera",
+ "font_class": "camera",
+ "unicode": "e65a",
+ "unicode_decimal": 58970
+ },
+ {
+ "icon_id": "24855887",
+ "name": "circle",
+ "font_class": "circle",
+ "unicode": "e65b",
+ "unicode_decimal": 58971
+ },
+ {
+ "icon_id": "24855888",
+ "name": "checkmarkempty",
+ "font_class": "checkmarkempty",
+ "unicode": "e65c",
+ "unicode_decimal": 58972
+ },
+ {
+ "icon_id": "24855889",
+ "name": "chat",
+ "font_class": "chat",
+ "unicode": "e65d",
+ "unicode_decimal": 58973
+ },
+ {
+ "icon_id": "24855890",
+ "name": "circle-filled",
+ "font_class": "circle-filled",
+ "unicode": "e65e",
+ "unicode_decimal": 58974
+ },
+ {
+ "icon_id": "24855891",
+ "name": "flag",
+ "font_class": "flag",
+ "unicode": "e65f",
+ "unicode_decimal": 58975
+ },
+ {
+ "icon_id": "24855892",
+ "name": "flag-filled",
+ "font_class": "flag-filled",
+ "unicode": "e660",
+ "unicode_decimal": 58976
+ },
+ {
+ "icon_id": "24855893",
+ "name": "gear-filled",
+ "font_class": "gear-filled",
+ "unicode": "e661",
+ "unicode_decimal": 58977
+ },
+ {
+ "icon_id": "24855894",
+ "name": "home",
+ "font_class": "home",
+ "unicode": "e662",
+ "unicode_decimal": 58978
+ },
+ {
+ "icon_id": "24855895",
+ "name": "home-filled",
+ "font_class": "home-filled",
+ "unicode": "e663",
+ "unicode_decimal": 58979
+ },
+ {
+ "icon_id": "24855896",
+ "name": "gear",
+ "font_class": "gear",
+ "unicode": "e664",
+ "unicode_decimal": 58980
+ },
+ {
+ "icon_id": "24855897",
+ "name": "smallcircle-filled",
+ "font_class": "smallcircle-filled",
+ "unicode": "e665",
+ "unicode_decimal": 58981
+ },
+ {
+ "icon_id": "24855898",
+ "name": "map-filled",
+ "font_class": "map-filled",
+ "unicode": "e666",
+ "unicode_decimal": 58982
+ },
+ {
+ "icon_id": "24855899",
+ "name": "map",
+ "font_class": "map",
+ "unicode": "e667",
+ "unicode_decimal": 58983
+ },
+ {
+ "icon_id": "24855825",
+ "name": "refresh-filled",
+ "font_class": "refresh-filled",
+ "unicode": "e656",
+ "unicode_decimal": 58966
+ },
+ {
+ "icon_id": "24855826",
+ "name": "refresh",
+ "font_class": "refresh",
+ "unicode": "e657",
+ "unicode_decimal": 58967
+ },
+ {
+ "icon_id": "24855808",
+ "name": "cloud-upload",
+ "font_class": "cloud-upload",
+ "unicode": "e645",
+ "unicode_decimal": 58949
+ },
+ {
+ "icon_id": "24855809",
+ "name": "cloud-download-filled",
+ "font_class": "cloud-download-filled",
+ "unicode": "e646",
+ "unicode_decimal": 58950
+ },
+ {
+ "icon_id": "24855810",
+ "name": "cloud-download",
+ "font_class": "cloud-download",
+ "unicode": "e647",
+ "unicode_decimal": 58951
+ },
+ {
+ "icon_id": "24855811",
+ "name": "cloud-upload-filled",
+ "font_class": "cloud-upload-filled",
+ "unicode": "e648",
+ "unicode_decimal": 58952
+ },
+ {
+ "icon_id": "24855813",
+ "name": "redo",
+ "font_class": "redo",
+ "unicode": "e64a",
+ "unicode_decimal": 58954
+ },
+ {
+ "icon_id": "24855814",
+ "name": "images-filled",
+ "font_class": "images-filled",
+ "unicode": "e64b",
+ "unicode_decimal": 58955
+ },
+ {
+ "icon_id": "24855815",
+ "name": "undo-filled",
+ "font_class": "undo-filled",
+ "unicode": "e64c",
+ "unicode_decimal": 58956
+ },
+ {
+ "icon_id": "24855816",
+ "name": "more",
+ "font_class": "more",
+ "unicode": "e64d",
+ "unicode_decimal": 58957
+ },
+ {
+ "icon_id": "24855817",
+ "name": "more-filled",
+ "font_class": "more-filled",
+ "unicode": "e64e",
+ "unicode_decimal": 58958
+ },
+ {
+ "icon_id": "24855818",
+ "name": "undo",
+ "font_class": "undo",
+ "unicode": "e64f",
+ "unicode_decimal": 58959
+ },
+ {
+ "icon_id": "24855819",
+ "name": "images",
+ "font_class": "images",
+ "unicode": "e650",
+ "unicode_decimal": 58960
+ },
+ {
+ "icon_id": "24855821",
+ "name": "paperclip",
+ "font_class": "paperclip",
+ "unicode": "e652",
+ "unicode_decimal": 58962
+ },
+ {
+ "icon_id": "24855822",
+ "name": "settings",
+ "font_class": "settings",
+ "unicode": "e653",
+ "unicode_decimal": 58963
+ },
+ {
+ "icon_id": "24855823",
+ "name": "search",
+ "font_class": "search",
+ "unicode": "e654",
+ "unicode_decimal": 58964
+ },
+ {
+ "icon_id": "24855824",
+ "name": "redo-filled",
+ "font_class": "redo-filled",
+ "unicode": "e655",
+ "unicode_decimal": 58965
+ },
+ {
+ "icon_id": "24841702",
+ "name": "list",
+ "font_class": "list",
+ "unicode": "e644",
+ "unicode_decimal": 58948
+ },
+ {
+ "icon_id": "24841489",
+ "name": "mail-open-filled",
+ "font_class": "mail-open-filled",
+ "unicode": "e63a",
+ "unicode_decimal": 58938
+ },
+ {
+ "icon_id": "24841491",
+ "name": "hand-thumbsdown-filled",
+ "font_class": "hand-down-filled",
+ "unicode": "e63c",
+ "unicode_decimal": 58940
+ },
+ {
+ "icon_id": "24841492",
+ "name": "hand-thumbsdown",
+ "font_class": "hand-down",
+ "unicode": "e63d",
+ "unicode_decimal": 58941
+ },
+ {
+ "icon_id": "24841493",
+ "name": "hand-thumbsup-filled",
+ "font_class": "hand-up-filled",
+ "unicode": "e63e",
+ "unicode_decimal": 58942
+ },
+ {
+ "icon_id": "24841494",
+ "name": "hand-thumbsup",
+ "font_class": "hand-up",
+ "unicode": "e63f",
+ "unicode_decimal": 58943
+ },
+ {
+ "icon_id": "24841496",
+ "name": "heart-filled",
+ "font_class": "heart-filled",
+ "unicode": "e641",
+ "unicode_decimal": 58945
+ },
+ {
+ "icon_id": "24841498",
+ "name": "mail-open",
+ "font_class": "mail-open",
+ "unicode": "e643",
+ "unicode_decimal": 58947
+ },
+ {
+ "icon_id": "24841488",
+ "name": "heart",
+ "font_class": "heart",
+ "unicode": "e639",
+ "unicode_decimal": 58937
+ },
+ {
+ "icon_id": "24839963",
+ "name": "loop",
+ "font_class": "loop",
+ "unicode": "e633",
+ "unicode_decimal": 58931
+ },
+ {
+ "icon_id": "24839866",
+ "name": "pulldown",
+ "font_class": "pulldown",
+ "unicode": "e632",
+ "unicode_decimal": 58930
+ },
+ {
+ "icon_id": "24813798",
+ "name": "scan",
+ "font_class": "scan",
+ "unicode": "e62a",
+ "unicode_decimal": 58922
+ },
+ {
+ "icon_id": "24813786",
+ "name": "bars",
+ "font_class": "bars",
+ "unicode": "e627",
+ "unicode_decimal": 58919
+ },
+ {
+ "icon_id": "24813788",
+ "name": "cart-filled",
+ "font_class": "cart-filled",
+ "unicode": "e629",
+ "unicode_decimal": 58921
+ },
+ {
+ "icon_id": "24813790",
+ "name": "checkbox",
+ "font_class": "checkbox",
+ "unicode": "e62b",
+ "unicode_decimal": 58923
+ },
+ {
+ "icon_id": "24813791",
+ "name": "checkbox-filled",
+ "font_class": "checkbox-filled",
+ "unicode": "e62c",
+ "unicode_decimal": 58924
+ },
+ {
+ "icon_id": "24813794",
+ "name": "shop",
+ "font_class": "shop",
+ "unicode": "e62f",
+ "unicode_decimal": 58927
+ },
+ {
+ "icon_id": "24813795",
+ "name": "headphones",
+ "font_class": "headphones",
+ "unicode": "e630",
+ "unicode_decimal": 58928
+ },
+ {
+ "icon_id": "24813796",
+ "name": "cart",
+ "font_class": "cart",
+ "unicode": "e631",
+ "unicode_decimal": 58929
+ }
+ ]
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
new file mode 100644
index 0000000..86e7444
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
@@ -0,0 +1,96 @@
+
+
+ {{unicode}}
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css
new file mode 100644
index 0000000..2f56eab
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css
@@ -0,0 +1,663 @@
+.uniui-color:before {
+ content: "\e6cf";
+}
+
+.uniui-wallet:before {
+ content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+ content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+ content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+ content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+ content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+ content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+ content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+ content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+ content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+ content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+ content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+ content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+ content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+ content: "\e6c3";
+}
+
+.uniui-gift-filled:before {
+ content: "\e6c4";
+}
+
+.uniui-fire-filled:before {
+ content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+ content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+ content: "\e6af";
+}
+
+.uniui-person-filled:before {
+ content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+ content: "\e698";
+}
+
+.uniui-back:before {
+ content: "\e6b9";
+}
+
+.uniui-forward:before {
+ content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+ content: "\e6bb";
+}
+
+.uniui-arrowthinright:before {
+ content: "\e6bb";
+}
+
+.uniui-arrow-left:before {
+ content: "\e6bc";
+}
+
+.uniui-arrowthinleft:before {
+ content: "\e6bc";
+}
+
+.uniui-arrow-up:before {
+ content: "\e6bd";
+}
+
+.uniui-arrowthinup:before {
+ content: "\e6bd";
+}
+
+.uniui-arrow-down:before {
+ content: "\e6be";
+}
+
+.uniui-arrowthindown:before {
+ content: "\e6be";
+}
+
+.uniui-bottom:before {
+ content: "\e6b8";
+}
+
+.uniui-arrowdown:before {
+ content: "\e6b8";
+}
+
+.uniui-right:before {
+ content: "\e6b5";
+}
+
+.uniui-arrowright:before {
+ content: "\e6b5";
+}
+
+.uniui-top:before {
+ content: "\e6b6";
+}
+
+.uniui-arrowup:before {
+ content: "\e6b6";
+}
+
+.uniui-left:before {
+ content: "\e6b7";
+}
+
+.uniui-arrowleft:before {
+ content: "\e6b7";
+}
+
+.uniui-eye:before {
+ content: "\e651";
+}
+
+.uniui-eye-filled:before {
+ content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+ content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+ content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+ content: "\e649";
+}
+
+.uniui-reload:before {
+ content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+ content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+ content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+ content: "\e6ad";
+}
+
+.uniui-location:before {
+ content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+ content: "\e683";
+}
+
+.uniui-star:before {
+ content: "\e688";
+}
+
+.uniui-star-filled:before {
+ content: "\e68f";
+}
+
+.uniui-calendar:before {
+ content: "\e6a0";
+}
+
+.uniui-fire:before {
+ content: "\e6a1";
+}
+
+.uniui-medal:before {
+ content: "\e6a2";
+}
+
+.uniui-font:before {
+ content: "\e6a3";
+}
+
+.uniui-gift:before {
+ content: "\e6a4";
+}
+
+.uniui-link:before {
+ content: "\e6a5";
+}
+
+.uniui-notification:before {
+ content: "\e6a6";
+}
+
+.uniui-staff:before {
+ content: "\e6a7";
+}
+
+.uniui-vip:before {
+ content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+ content: "\e6a9";
+}
+
+.uniui-tune:before {
+ content: "\e6aa";
+}
+
+.uniui-auth:before {
+ content: "\e6ab";
+}
+
+.uniui-person:before {
+ content: "\e699";
+}
+
+.uniui-email-filled:before {
+ content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+ content: "\e69b";
+}
+
+.uniui-phone:before {
+ content: "\e69c";
+}
+
+.uniui-email:before {
+ content: "\e69e";
+}
+
+.uniui-personadd:before {
+ content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+ content: "\e692";
+}
+
+.uniui-contact:before {
+ content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+ content: "\e694";
+}
+
+.uniui-contact-filled:before {
+ content: "\e695";
+}
+
+.uniui-chatboxes:before {
+ content: "\e696";
+}
+
+.uniui-chatbubble:before {
+ content: "\e697";
+}
+
+.uniui-upload-filled:before {
+ content: "\e68e";
+}
+
+.uniui-upload:before {
+ content: "\e690";
+}
+
+.uniui-weixin:before {
+ content: "\e691";
+}
+
+.uniui-compose:before {
+ content: "\e67f";
+}
+
+.uniui-qq:before {
+ content: "\e680";
+}
+
+.uniui-download-filled:before {
+ content: "\e681";
+}
+
+.uniui-pyq:before {
+ content: "\e682";
+}
+
+.uniui-sound:before {
+ content: "\e684";
+}
+
+.uniui-trash-filled:before {
+ content: "\e685";
+}
+
+.uniui-sound-filled:before {
+ content: "\e686";
+}
+
+.uniui-trash:before {
+ content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+ content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+ content: "\e68a";
+}
+
+.uniui-weibo:before {
+ content: "\e68b";
+}
+
+.uniui-videocam:before {
+ content: "\e68c";
+}
+
+.uniui-download:before {
+ content: "\e68d";
+}
+
+.uniui-help:before {
+ content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+ content: "\e67a";
+}
+
+.uniui-plusempty:before {
+ content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+ content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+ content: "\e67d";
+}
+
+.uniui-micoff:before {
+ content: "\e67e";
+}
+
+.uniui-closeempty:before {
+ content: "\e66c";
+}
+
+.uniui-clear:before {
+ content: "\e66d";
+}
+
+.uniui-navigate:before {
+ content: "\e66e";
+}
+
+.uniui-minus:before {
+ content: "\e66f";
+}
+
+.uniui-image:before {
+ content: "\e670";
+}
+
+.uniui-mic:before {
+ content: "\e671";
+}
+
+.uniui-paperplane:before {
+ content: "\e672";
+}
+
+.uniui-close:before {
+ content: "\e673";
+}
+
+.uniui-help-filled:before {
+ content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+ content: "\e675";
+}
+
+.uniui-plus:before {
+ content: "\e676";
+}
+
+.uniui-mic-filled:before {
+ content: "\e677";
+}
+
+.uniui-image-filled:before {
+ content: "\e678";
+}
+
+.uniui-locked-filled:before {
+ content: "\e668";
+}
+
+.uniui-info:before {
+ content: "\e669";
+}
+
+.uniui-locked:before {
+ content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+ content: "\e658";
+}
+
+.uniui-chat-filled:before {
+ content: "\e659";
+}
+
+.uniui-camera:before {
+ content: "\e65a";
+}
+
+.uniui-circle:before {
+ content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+ content: "\e65c";
+}
+
+.uniui-chat:before {
+ content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+ content: "\e65e";
+}
+
+.uniui-flag:before {
+ content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+ content: "\e660";
+}
+
+.uniui-gear-filled:before {
+ content: "\e661";
+}
+
+.uniui-home:before {
+ content: "\e662";
+}
+
+.uniui-home-filled:before {
+ content: "\e663";
+}
+
+.uniui-gear:before {
+ content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+ content: "\e665";
+}
+
+.uniui-map-filled:before {
+ content: "\e666";
+}
+
+.uniui-map:before {
+ content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+ content: "\e656";
+}
+
+.uniui-refresh:before {
+ content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+ content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+ content: "\e646";
+}
+
+.uniui-cloud-download:before {
+ content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+ content: "\e648";
+}
+
+.uniui-redo:before {
+ content: "\e64a";
+}
+
+.uniui-images-filled:before {
+ content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+ content: "\e64c";
+}
+
+.uniui-more:before {
+ content: "\e64d";
+}
+
+.uniui-more-filled:before {
+ content: "\e64e";
+}
+
+.uniui-undo:before {
+ content: "\e64f";
+}
+
+.uniui-images:before {
+ content: "\e650";
+}
+
+.uniui-paperclip:before {
+ content: "\e652";
+}
+
+.uniui-settings:before {
+ content: "\e653";
+}
+
+.uniui-search:before {
+ content: "\e654";
+}
+
+.uniui-redo-filled:before {
+ content: "\e655";
+}
+
+.uniui-list:before {
+ content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+ content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+ content: "\e63c";
+}
+
+.uniui-hand-down:before {
+ content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+ content: "\e63e";
+}
+
+.uniui-hand-up:before {
+ content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+ content: "\e641";
+}
+
+.uniui-mail-open:before {
+ content: "\e643";
+}
+
+.uniui-heart:before {
+ content: "\e639";
+}
+
+.uniui-loop:before {
+ content: "\e633";
+}
+
+.uniui-pulldown:before {
+ content: "\e632";
+}
+
+.uniui-scan:before {
+ content: "\e62a";
+}
+
+.uniui-bars:before {
+ content: "\e627";
+}
+
+.uniui-cart-filled:before {
+ content: "\e629";
+}
+
+.uniui-checkbox:before {
+ content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+ content: "\e62c";
+}
+
+.uniui-shop:before {
+ content: "\e62f";
+}
+
+.uniui-headphones:before {
+ content: "\e630";
+}
+
+.uniui-cart:before {
+ content: "\e631";
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
new file mode 100644
index 0000000..835f33b
Binary files /dev/null and b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf differ
diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json
new file mode 100644
index 0000000..d1c4e77
--- /dev/null
+++ b/uni_modules/uni-icons/package.json
@@ -0,0 +1,86 @@
+{
+ "id": "uni-icons",
+ "displayName": "uni-icons 图标",
+ "version": "1.3.5",
+ "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "icon",
+ "图标"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": "^3.2.14"
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md
new file mode 100644
index 0000000..86234ba
--- /dev/null
+++ b/uni_modules/uni-icons/readme.md
@@ -0,0 +1,8 @@
+## Icons 图标
+> **组件名:uni-icons**
+> 代码块: `uIcons`
+
+用于展示 icons 图标 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
diff --git a/uni_modules/uni-tag/changelog.md b/uni_modules/uni-tag/changelog.md
new file mode 100644
index 0000000..c0c5839
--- /dev/null
+++ b/uni_modules/uni-tag/changelog.md
@@ -0,0 +1,21 @@
+## 2.1.0(2021-11-19)
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-tag](https://uniapp.dcloud.io/component/uniui/uni-tag)
+## 2.0.0(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+- 移除 插槽
+- 移除 type 属性的 royal 选项
+## 1.1.1(2021-08-11)
+- type 不是 default 时,size 为 small 字体大小显示不正确
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.7(2021-06-18)
+- 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug
+## 1.0.6(2021-06-04)
+- 修复 未定义 sass 变量 "$uni-color-royal" 的bug
+## 1.0.5(2021-05-10)
+- 修复 royal 类型无效的bug
+- 修复 uni-tag 宽度不自适应的bug
+- 新增 uni-tag 支持属性 custom-style 自定义样式
+## 1.0.4(2021-02-05)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-tag/components/uni-tag/uni-tag.vue b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue
new file mode 100644
index 0000000..6378a0b
--- /dev/null
+++ b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue
@@ -0,0 +1,252 @@
+
+ {{text}}
+
+
+
+
+
diff --git a/uni_modules/uni-tag/package.json b/uni_modules/uni-tag/package.json
new file mode 100644
index 0000000..1878088
--- /dev/null
+++ b/uni_modules/uni-tag/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-tag",
+ "displayName": "uni-tag 标签",
+ "version": "2.1.0",
+ "description": "Tag 组件,用于展示1个或多个文字标签,可点击切换选中、不选中的状态。",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "",
+ "tag",
+ "标签"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "directories": {
+ "example": "../../temps/example_temps"
+ },
+ "dcloudext": {
+ "category": [
+ "前端组件",
+ "通用组件"
+ ],
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+ },
+ "uni_modules": {
+ "dependencies": ["uni-scss"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-tag/readme.md b/uni_modules/uni-tag/readme.md
new file mode 100644
index 0000000..6e78ff5
--- /dev/null
+++ b/uni_modules/uni-tag/readme.md
@@ -0,0 +1,13 @@
+
+
+## Tag 标签
+> **组件名:uni-tag**
+> 代码块: `uTag`
+
+
+用于展示1个或多个文字标签,可点击切换选中、不选中的状态 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tag)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+
diff --git a/utils/city.js b/utils/city.js
new file mode 100644
index 0000000..2b28a2c
--- /dev/null
+++ b/utils/city.js
@@ -0,0 +1,1514 @@
+export default {
+ list:[
+ {
+ "letter":"A",
+ "data": []
+ },
+ {
+ "letter":"A",
+ "data":[
+ {
+ "cityName":"阿坝",
+ "keyword":"阿坝ABA"
+ },
+ {
+ "cityName":"阿克苏",
+ "keyword":"阿克苏AKESU"
+ },
+ {
+ "cityName":"阿拉善",
+ "keyword":"阿拉善ALASHAN"
+ },
+ {
+ "cityName":"阿勒泰",
+ "keyword":"阿勒泰ALETAI"
+ },
+ {
+ "cityName":"阿里",
+ "keyword":"阿里ALI"
+ },
+ {
+ "cityName":"安康",
+ "keyword":"安康ANKANG"
+ },
+ {
+ "cityName":"安庆",
+ "keyword":"安庆ANQING"
+ },
+ {
+ "cityName":"鞍山",
+ "keyword":"鞍山ANSHAN"
+ },
+ {
+ "cityName":"马鞍山",
+ "keyword":"马鞍山MAANSHAN"
+ },
+ {
+ "cityName":"安顺",
+ "keyword":"安顺ANSHUN"
+ },
+ {
+ "cityName":"安阳",
+ "keyword":"安阳ANYANG"
+ }
+ ]
+ },
+ {
+ "letter":"B",
+ "data":[
+ {
+ "cityName":"白城",
+ "keyword":"白城BAICHENG"
+ },
+ {
+ "cityName":"白山",
+ "keyword":"白山BAISHAN"
+ },
+ {
+ "cityName":"白银",
+ "keyword":"白银BAIYIN"
+ },
+ {
+ "cityName":"保定",
+ "keyword":"保定BAODING"
+ },
+ {
+ "cityName":"宝鸡",
+ "keyword":"宝鸡BAOJI"
+ },
+ {
+ "cityName":"保山",
+ "keyword":"保山BAOSHAN"
+ },
+ {
+ "cityName":"包头",
+ "keyword":"包头BAOTOU"
+ },
+ {
+ "cityName":"巴彦淖尔",
+ "keyword":"巴彦淖尔BAYANNAOER"
+ },
+ {
+ "cityName":"巴音郭楞",
+ "keyword":"巴音郭楞BAYINGUOLENG"
+ },
+ {
+ "cityName":"巴中",
+ "keyword":"巴中BAZHONG"
+ },
+ {
+ "cityName":"北海",
+ "keyword":"北海BEIHAI"
+ },
+ {
+ "cityName":"北京",
+ "keyword":"北京BEIJING"
+ },
+ {
+ "cityName":"蚌埠",
+ "keyword":"蚌埠BENGBU"
+ },
+ {
+ "cityName":"本溪",
+ "keyword":"本溪BENXI"
+ },
+ {
+ "cityName":"毕节",
+ "keyword":"毕节BIJIE"
+ },
+ {
+ "cityName":"滨州",
+ "keyword":"滨州BINZHOU"
+ },
+ {
+ "cityName":"博尔塔拉",
+ "keyword":"博尔塔拉BOERTALA"
+ },
+ {
+ "cityName":"百色",
+ "keyword":"百色BOSE"
+ },
+ {
+ "cityName":"亳州",
+ "keyword":"亳州BOZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"C",
+ "data":[
+ {
+ "cityName":"沧州",
+ "keyword":"沧州CANGZHOU"
+ },
+ {
+ "cityName":"长春",
+ "keyword":"长春CHANGCHUN"
+ },
+ {
+ "cityName":"常德",
+ "keyword":"常德CHANGDE"
+ },
+ {
+ "cityName":"昌都",
+ "keyword":"昌都CHANGDU"
+ },
+ {
+ "cityName":"昌吉",
+ "keyword":"昌吉CHANGJI"
+ },
+ {
+ "cityName":"长沙",
+ "keyword":"长沙CHANGSHA"
+ },
+ {
+ "cityName":"长治",
+ "keyword":"长治CHANGZHI"
+ },
+ {
+ "cityName":"常州",
+ "keyword":"常州CHANGZHOU"
+ },
+ {
+ "cityName":"潮州",
+ "keyword":"潮州CHAOZHOU"
+ },
+ {
+ "cityName":"承德",
+ "keyword":"承德CHENGDE"
+ },
+ {
+ "cityName":"成都",
+ "keyword":"成都CHENGDU"
+ },
+ {
+ "cityName":"郴州",
+ "keyword":"郴州CHENZHOU"
+ },
+ {
+ "cityName":"赤峰",
+ "keyword":"赤峰CHIFENG"
+ },
+ {
+ "cityName":"池州",
+ "keyword":"池州CHIZHOU"
+ },
+ {
+ "cityName":"重庆",
+ "keyword":"重庆CHONGQING"
+ },
+ {
+ "cityName":"崇左",
+ "keyword":"崇左CHONGZUO"
+ },
+ {
+ "cityName":"楚雄",
+ "keyword":"楚雄CHUXIONG"
+ },
+ {
+ "cityName":"滁州",
+ "keyword":"滁州CHUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"D",
+ "data":[
+ {
+ "cityName":"大理",
+ "keyword":"大理DALI"
+ },
+ {
+ "cityName":"大连",
+ "keyword":"大连DALIAN"
+ },
+ {
+ "cityName":"丹东",
+ "keyword":"丹东DANDONG"
+ },
+ {
+ "cityName":"儋州",
+ "keyword":"儋州DANZHOU"
+ },
+ {
+ "cityName":"大庆",
+ "keyword":"大庆DAQING"
+ },
+ {
+ "cityName":"大同",
+ "keyword":"大同DATONG"
+ },
+ {
+ "cityName":"大兴安岭",
+ "keyword":"大兴安岭DAXINGANLING"
+ },
+ {
+ "cityName":"达州",
+ "keyword":"达州DAZHOU"
+ },
+ {
+ "cityName":"德宏",
+ "keyword":"德宏DEHONG"
+ },
+ {
+ "cityName":"德阳",
+ "keyword":"德阳DEYANG"
+ },
+ {
+ "cityName":"德州",
+ "keyword":"德州DEZHOU"
+ },
+ {
+ "cityName":"定西",
+ "keyword":"定西DINGXI"
+ },
+ {
+ "cityName":"迪庆",
+ "keyword":"迪庆DIQING"
+ },
+ {
+ "cityName":"东莞",
+ "keyword":"东莞DONGGUAN"
+ },
+ {
+ "cityName":"东营",
+ "keyword":"东营DONGYING"
+ }
+ ]
+ },
+ {
+ "letter":"E",
+ "data":[
+ {
+ "cityName":"鄂尔多斯",
+ "keyword":"鄂尔多斯EERDUOSI"
+ },
+ {
+ "cityName":"恩施",
+ "keyword":"恩施ENSHI"
+ },
+ {
+ "cityName":"鄂州",
+ "keyword":"鄂州EZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"F",
+ "data":[
+ {
+ "cityName":"防城港",
+ "keyword":"防城港FANGCHENGGANG"
+ },
+ {
+ "cityName":"佛山",
+ "keyword":"佛山FOSHAN"
+ },
+ {
+ "cityName":"抚顺",
+ "keyword":"抚顺FUSHUN"
+ },
+ {
+ "cityName":"阜新",
+ "keyword":"阜新FUXIN"
+ },
+ {
+ "cityName":"阜阳",
+ "keyword":"阜阳FUYANG"
+ },
+ {
+ "cityName":"抚州",
+ "keyword":"抚州FUZHOU"
+ },
+ {
+ "cityName":"福州",
+ "keyword":"福州FUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"G",
+ "data":[
+ {
+ "cityName":"甘南",
+ "keyword":"甘南GANNAN"
+ },
+ {
+ "cityName":"赣州",
+ "keyword":"赣州GANZHOU"
+ },
+ {
+ "cityName":"甘孜",
+ "keyword":"甘孜GANZI"
+ },
+ {
+ "cityName":"广安",
+ "keyword":"广安GUANGAN"
+ },
+ {
+ "cityName":"广元",
+ "keyword":"广元GUANGYUAN"
+ },
+ {
+ "cityName":"广州",
+ "keyword":"广州GUANGZHOU"
+ },
+ {
+ "cityName":"贵港",
+ "keyword":"贵港GUIGANG"
+ },
+ {
+ "cityName":"桂林",
+ "keyword":"桂林GUILIN"
+ },
+ {
+ "cityName":"贵阳",
+ "keyword":"贵阳GUIYANG"
+ },
+ {
+ "cityName":"果洛",
+ "keyword":"果洛GUOLUO"
+ },
+ {
+ "cityName":"固原",
+ "keyword":"固原GUYUAN"
+ }
+ ]
+ },
+ {
+ "letter":"H",
+ "data":[
+ {
+ "cityName":"哈尔滨",
+ "keyword":"哈尔滨HAERBIN"
+ },
+ {
+ "cityName":"海北",
+ "keyword":"海北HAIBEI"
+ },
+ {
+ "cityName":"海东",
+ "keyword":"海东HAIDONG"
+ },
+ {
+ "cityName":"海口",
+ "keyword":"海口HAIKOU"
+ },
+ {
+ "cityName":"海南藏族自治州",
+ "keyword":"海南藏族自治州HAINAN"
+ },
+ {
+ "cityName":"海南",
+ "keyword":"海南藏族自治州HAINAN"
+ },
+ {
+ "cityName":"海南",
+ "keyword":"海南HAINAN"
+ },
+ {
+ "cityName":"海西",
+ "keyword":"海西HAIXI"
+ },
+ {
+ "cityName":"哈密",
+ "keyword":"哈密HAMI"
+ },
+ {
+ "cityName":"邯郸",
+ "keyword":"邯郸HANDAN"
+ },
+ {
+ "cityName":"杭州",
+ "keyword":"杭州HANGZHOU"
+ },
+ {
+ "cityName":"汉中",
+ "keyword":"汉中HANZHONG"
+ },
+ {
+ "cityName":"河北",
+ "keyword":"河北HEBEI"
+ },
+ {
+ "cityName":"鹤壁",
+ "keyword":"鹤壁HEBI"
+ },
+ {
+ "cityName":"河池",
+ "keyword":"河池HECHI"
+ },
+ {
+ "cityName":"合肥",
+ "keyword":"合肥HEFEI"
+ },
+ {
+ "cityName":"鹤岗",
+ "keyword":"鹤岗HEGANG"
+ },
+ {
+ "cityName":"黑河",
+ "keyword":"黑河HEIHE"
+ },
+ {
+ "cityName":"河南",
+ "keyword":"河南HENAN"
+ },
+ {
+ "cityName":"衡水",
+ "keyword":"衡水HENGSHUI"
+ },
+ {
+ "cityName":"衡阳",
+ "keyword":"衡阳HENGYANG"
+ },
+ {
+ "cityName":"和田",
+ "keyword":"和田HETIAN"
+ },
+ {
+ "cityName":"河源",
+ "keyword":"河源HEYUAN"
+ },
+ {
+ "cityName":"菏泽",
+ "keyword":"菏泽HEZE"
+ },
+ {
+ "cityName":"贺州",
+ "keyword":"贺州HEZHOU"
+ },
+ {
+ "cityName":"红河",
+ "keyword":"红河HONGHE"
+ },
+ {
+ "cityName":"淮安",
+ "keyword":"淮安HUAIAN"
+ },
+ {
+ "cityName":"淮北",
+ "keyword":"淮北HUAIBEI"
+ },
+ {
+ "cityName":"怀化",
+ "keyword":"怀化HUAIHUA"
+ },
+ {
+ "cityName":"淮南",
+ "keyword":"淮南HUAINAN"
+ },
+ {
+ "cityName":"黄冈",
+ "keyword":"黄冈HUANGGANG"
+ },
+ {
+ "cityName":"黄南",
+ "keyword":"黄南HUANGNAN"
+ },
+ {
+ "cityName":"黄山",
+ "keyword":"黄山HUANGSHAN"
+ },
+ {
+ "cityName":"黄石",
+ "keyword":"黄石HUANGSHI"
+ },
+ {
+ "cityName":"湖北",
+ "keyword":"湖北HUBEI"
+ },
+ {
+ "cityName":"呼和浩特",
+ "keyword":"呼和浩特HUHEHAOTE"
+ },
+ {
+ "cityName":"惠州",
+ "keyword":"惠州HUIZHOU"
+ },
+ {
+ "cityName":"葫芦岛",
+ "keyword":"葫芦岛HULUDAO"
+ },
+ {
+ "cityName":"呼伦贝尔",
+ "keyword":"呼伦贝尔HULUNBEIER"
+ },
+ {
+ "cityName":"湖州",
+ "keyword":"湖州HUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"I",
+ "data":[
+
+ ]
+ },
+ {
+ "letter":"J",
+ "data":[
+ {
+ "cityName":"佳木斯",
+ "keyword":"佳木斯JIAMUSI"
+ },
+ {
+ "cityName":"吉安",
+ "keyword":"吉安JIAN"
+ },
+ {
+ "cityName":"江门",
+ "keyword":"江门JIANGMEN"
+ },
+ {
+ "cityName":"焦作",
+ "keyword":"焦作JIAOZUO"
+ },
+ {
+ "cityName":"嘉兴",
+ "keyword":"嘉兴JIAXING"
+ },
+ {
+ "cityName":"嘉峪关",
+ "keyword":"嘉峪关JIAYUGUAN"
+ },
+ {
+ "cityName":"揭阳",
+ "keyword":"揭阳JIEYANG"
+ },
+ {
+ "cityName":"吉林",
+ "keyword":"吉林JILIN"
+ },
+ {
+ "cityName":"济南",
+ "keyword":"济南JINAN"
+ },
+ {
+ "cityName":"金昌",
+ "keyword":"金昌JINCHANG"
+ },
+ {
+ "cityName":"晋城",
+ "keyword":"晋城JINCHENG"
+ },
+ {
+ "cityName":"景德镇",
+ "keyword":"景德镇JINGDEZHEN"
+ },
+ {
+ "cityName":"荆门",
+ "keyword":"荆门JINGMEN"
+ },
+ {
+ "cityName":"荆州",
+ "keyword":"荆州JINGZHOU"
+ },
+ {
+ "cityName":"金华",
+ "keyword":"金华JINHUA"
+ },
+ {
+ "cityName":"济宁",
+ "keyword":"济宁JINING"
+ },
+ {
+ "cityName":"晋中",
+ "keyword":"晋中JINZHONG"
+ },
+ {
+ "cityName":"锦州",
+ "keyword":"锦州JINZHOU"
+ },
+ {
+ "cityName":"九江",
+ "keyword":"九江JIUJIANG"
+ },
+ {
+ "cityName":"酒泉",
+ "keyword":"酒泉JIUQUAN"
+ },
+ {
+ "cityName":"鸡西",
+ "keyword":"鸡西JIXI"
+ }
+ ]
+ },
+ {
+ "letter":"K",
+ "data":[
+ {
+ "cityName":"开封",
+ "keyword":"开封KAIFENG"
+ },
+ {
+ "cityName":"喀什",
+ "keyword":"喀什KASHI"
+ },
+ {
+ "cityName":"克拉玛依",
+ "keyword":"克拉玛依KELAMAYI"
+ },
+ {
+ "cityName":"克孜勒苏",
+ "keyword":"克孜勒苏KEZILESU"
+ },
+ {
+ "cityName":"昆明",
+ "keyword":"昆明KUNMING"
+ }
+ ]
+ },
+ {
+ "letter":"L",
+ "data":[
+ {
+ "cityName":"来宾",
+ "keyword":"来宾LAIBIN"
+ },
+ {
+ "cityName":"莱芜",
+ "keyword":"莱芜LAIWU"
+ },
+ {
+ "cityName":"廊坊",
+ "keyword":"廊坊LANGFANG"
+ },
+ {
+ "cityName":"兰州",
+ "keyword":"兰州LANZHOU"
+ },
+ {
+ "cityName":"拉萨",
+ "keyword":"拉萨LASA"
+ },
+ {
+ "cityName":"乐山",
+ "keyword":"乐山LESHAN"
+ },
+ {
+ "cityName":"凉山",
+ "keyword":"凉山LIANGSHAN"
+ },
+ {
+ "cityName":"连云港",
+ "keyword":"连云港LIANYUNGANG"
+ },
+ {
+ "cityName":"聊城",
+ "keyword":"聊城LIAOCHENG"
+ },
+ {
+ "cityName":"辽阳",
+ "keyword":"辽阳LIAOYANG"
+ },
+ {
+ "cityName":"辽源",
+ "keyword":"辽源LIAOYUAN"
+ },
+ {
+ "cityName":"丽江",
+ "keyword":"丽江LIJIANG"
+ },
+ {
+ "cityName":"临沧",
+ "keyword":"临沧LINCANG"
+ },
+ {
+ "cityName":"临汾",
+ "keyword":"临汾LINFEN"
+ },
+ {
+ "cityName":"临夏",
+ "keyword":"临夏LINXIA"
+ },
+ {
+ "cityName":"临沂",
+ "keyword":"临沂LINYI"
+ },
+ {
+ "cityName":"林芝",
+ "keyword":"林芝LINZHI"
+ },
+ {
+ "cityName":"丽水",
+ "keyword":"丽水LISHUI"
+ },
+ {
+ "cityName":"六盘水",
+ "keyword":"六盘水LIUPANSHUI"
+ },
+ {
+ "cityName":"柳州",
+ "keyword":"柳州LIUZHOU"
+ },
+ {
+ "cityName":"陇南",
+ "keyword":"陇南LONGNAN"
+ },
+ {
+ "cityName":"龙岩",
+ "keyword":"龙岩LONGYAN"
+ },
+ {
+ "cityName":"娄底",
+ "keyword":"娄底LOUDI"
+ },
+ {
+ "cityName":"六安",
+ "keyword":"六安LUAN"
+ },
+ {
+ "cityName":"洛阳",
+ "keyword":"洛阳LUOYANG"
+ },
+ {
+ "cityName":"泸州",
+ "keyword":"泸州LUZHOU"
+ },
+ {
+ "cityName":"吕梁",
+ "keyword":"吕梁LVLIANG"
+ }
+ ]
+ },
+ {
+ "letter":"M",
+ "data":[
+ {
+ "cityName":"马鞍山",
+ "keyword":"马鞍山MAANSHAN"
+ },
+ {
+ "cityName":"茂名",
+ "keyword":"茂名MAOMING"
+ },
+ {
+ "cityName":"眉山",
+ "keyword":"眉山MEISHAN"
+ },
+ {
+ "cityName":"梅州",
+ "keyword":"梅州MEIZHOU"
+ },
+ {
+ "cityName":"绵阳",
+ "keyword":"绵阳MIANYANG"
+ },
+ {
+ "cityName":"牡丹江",
+ "keyword":"牡丹江MUDANJIANG"
+ }
+ ]
+ },
+ {
+ "letter":"N",
+ "data":[
+ {
+ "cityName":"南昌",
+ "keyword":"南昌NANCHANG"
+ },
+ {
+ "cityName":"南充",
+ "keyword":"南充NANCHONG"
+ },
+ {
+ "cityName":"南京",
+ "keyword":"南京NANJING"
+ },
+ {
+ "cityName":"南宁",
+ "keyword":"南宁NANNING"
+ },
+ {
+ "cityName":"南平",
+ "keyword":"南平NANPING"
+ },
+ {
+ "cityName":"南通",
+ "keyword":"南通NANTONG"
+ },
+ {
+ "cityName":"南阳",
+ "keyword":"南阳NANYANG"
+ },
+ {
+ "cityName":"那曲",
+ "keyword":"那曲NAQU"
+ },
+ {
+ "cityName":"内江",
+ "keyword":"内江NEIJIANG"
+ },
+ {
+ "cityName":"宁波",
+ "keyword":"宁波NINGBO"
+ },
+ {
+ "cityName":"宁德",
+ "keyword":"宁德NINGDE"
+ },
+ {
+ "cityName":"怒江",
+ "keyword":"怒江NUJIANG"
+ }
+ ]
+ },
+ {
+ "letter":"O",
+ "data":[
+
+ ]
+ },
+ {
+ "letter":"P",
+ "data":[
+ {
+ "cityName":"盘锦",
+ "keyword":"盘锦PANJIN"
+ },
+ {
+ "cityName":"攀枝花",
+ "keyword":"攀枝花PANZHIHUA"
+ },
+ {
+ "cityName":"平顶山",
+ "keyword":"平顶山PINGDINGSHAN"
+ },
+ {
+ "cityName":"平凉",
+ "keyword":"平凉PINGLIANG"
+ },
+ {
+ "cityName":"萍乡",
+ "keyword":"萍乡PINGXIANG"
+ },
+ {
+ "cityName":"普洱",
+ "keyword":"普洱PUER"
+ },
+ {
+ "cityName":"莆田",
+ "keyword":"莆田PUTIAN"
+ },
+ {
+ "cityName":"濮阳",
+ "keyword":"濮阳PUYANG"
+ }
+ ]
+ },
+ {
+ "letter":"Q",
+ "data":[
+ {
+ "cityName":"黔东南",
+ "keyword":"黔东南QIANDONGNAN"
+ },
+ {
+ "cityName":"黔南",
+ "keyword":"黔南QIANNAN"
+ },
+ {
+ "cityName":"黔西南",
+ "keyword":"黔西南QIANXINAN"
+ },
+ {
+ "cityName":"青岛",
+ "keyword":"青岛QINGDAO"
+ },
+ {
+ "cityName":"庆阳",
+ "keyword":"庆阳QINGYANG"
+ },
+ {
+ "cityName":"清远",
+ "keyword":"清远QINGYUAN"
+ },
+ {
+ "cityName":"秦皇岛",
+ "keyword":"秦皇岛QINHUANGDAO"
+ },
+ {
+ "cityName":"钦州",
+ "keyword":"钦州QINZHOU"
+ },
+ {
+ "cityName":"齐齐哈尔",
+ "keyword":"齐齐哈尔QIQIHAER"
+ },
+ {
+ "cityName":"七台河",
+ "keyword":"七台河QITAIHE"
+ },
+ {
+ "cityName":"泉州",
+ "keyword":"泉州QUANZHOU"
+ },
+ {
+ "cityName":"曲靖",
+ "keyword":"曲靖QUJING"
+ },
+ {
+ "cityName":"衢州",
+ "keyword":"衢州QUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"R",
+ "data":[
+ {
+ "cityName":"日喀则",
+ "keyword":"日喀则RIKAZE"
+ },
+ {
+ "cityName":"日照",
+ "keyword":"日照RIZHAO"
+ }
+ ]
+ },
+ {
+ "letter":"S",
+ "data":[
+ {
+ "cityName":"三门峡",
+ "keyword":"三门峡SANMENXIA"
+ },
+ {
+ "cityName":"三明",
+ "keyword":"三明SANMING"
+ },
+ {
+ "cityName":"三沙",
+ "keyword":"三沙SANSHA"
+ },
+ {
+ "cityName":"三亚",
+ "keyword":"三亚SANYA"
+ },
+ {
+ "cityName":"上海",
+ "keyword":"上海SHANGHAI"
+ },
+ {
+ "cityName":"商洛",
+ "keyword":"商洛SHANGLUO"
+ },
+ {
+ "cityName":"商丘",
+ "keyword":"商丘SHANGQIU"
+ },
+ {
+ "cityName":"上饶",
+ "keyword":"上饶SHANGRAO"
+ },
+ {
+ "cityName":"山南",
+ "keyword":"山南SHANNAN"
+ },
+ {
+ "cityName":"汕头",
+ "keyword":"汕头SHANTOU"
+ },
+ {
+ "cityName":"汕尾",
+ "keyword":"汕尾SHANWEI"
+ },
+ {
+ "cityName":"韶关",
+ "keyword":"韶关SHAOGUAN"
+ },
+ {
+ "cityName":"绍兴",
+ "keyword":"绍兴SHAOXING"
+ },
+ {
+ "cityName":"邵阳",
+ "keyword":"邵阳SHAOYANG"
+ },
+ {
+ "cityName":"沈阳",
+ "keyword":"沈阳SHENYANG"
+ },
+ {
+ "cityName":"深圳",
+ "keyword":"深圳SHENZHEN"
+ },
+ {
+ "cityName":"石家庄",
+ "keyword":"石家庄SHIJIAZHUANG"
+ },
+ {
+ "cityName":"十堰",
+ "keyword":"十堰SHIYAN"
+ },
+ {
+ "cityName":"石嘴山",
+ "keyword":"石嘴山SHIZUISHAN"
+ },
+ {
+ "cityName":"双鸭山",
+ "keyword":"双鸭山SHUANGYASHAN"
+ },
+ {
+ "cityName":"朔州",
+ "keyword":"朔州SHUOZHOU"
+ },
+ {
+ "cityName":"四平",
+ "keyword":"四平SIPING"
+ },
+ {
+ "cityName":"松原",
+ "keyword":"松原SONGYUAN"
+ },
+ {
+ "cityName":"绥化",
+ "keyword":"绥化SUIHUA"
+ },
+ {
+ "cityName":"遂宁",
+ "keyword":"遂宁SUINING"
+ },
+ {
+ "cityName":"随州",
+ "keyword":"随州SUIZHOU"
+ },
+ {
+ "cityName":"宿迁",
+ "keyword":"宿迁SUQIAN"
+ },
+ {
+ "cityName":"苏州",
+ "keyword":"苏州SUZHOU"
+ },
+ {
+ "cityName":"宿州",
+ "keyword":"宿州SUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"T",
+ "data":[
+ {
+ "cityName":"塔城",
+ "keyword":"塔城TACHENG"
+ },
+ {
+ "cityName":"漯河",
+ "keyword":"漯河TAHE"
+ },
+ {
+ "cityName":"泰安",
+ "keyword":"泰安TAIAN"
+ },
+ {
+ "cityName":"太原",
+ "keyword":"太原TAIYUAN"
+ },
+ {
+ "cityName":"泰州",
+ "keyword":"泰州TAIZHOU"
+ },
+ {
+ "cityName":"台州",
+ "keyword":"台州TAIZHOU"
+ },
+ {
+ "cityName":"唐山",
+ "keyword":"唐山TANGSHAN"
+ },
+ {
+ "cityName":"天津",
+ "keyword":"天津TIANJIN"
+ },
+ {
+ "cityName":"天水",
+ "keyword":"天水TIANSHUI"
+ },
+ {
+ "cityName":"铁岭",
+ "keyword":"铁岭TIELING"
+ },
+ {
+ "cityName":"铜川",
+ "keyword":"铜川TONGCHUAN"
+ },
+ {
+ "cityName":"通化",
+ "keyword":"通化TONGHUA"
+ },
+ {
+ "cityName":"通辽",
+ "keyword":"通辽TONGLIAO"
+ },
+ {
+ "cityName":"铜陵",
+ "keyword":"铜陵TONGLING"
+ },
+ {
+ "cityName":"铜仁",
+ "keyword":"铜仁TONGREN"
+ },
+ {
+ "cityName":"吐鲁番",
+ "keyword":"吐鲁番TULUFAN"
+ }
+ ]
+ },
+ {
+ "letter":"W",
+ "data":[
+ {
+ "cityName":"潍坊",
+ "keyword":"潍坊WEIFANG"
+ },
+ {
+ "cityName":"威海",
+ "keyword":"威海WEIHAI"
+ },
+ {
+ "cityName":"渭南",
+ "keyword":"渭南WEINAN"
+ },
+ {
+ "cityName":"文山",
+ "keyword":"文山WENSHAN"
+ },
+ {
+ "cityName":"温州",
+ "keyword":"温州WENZHOU"
+ },
+ {
+ "cityName":"乌海",
+ "keyword":"乌海WUHAI"
+ },
+ {
+ "cityName":"武汉",
+ "keyword":"武汉WUHAN"
+ },
+ {
+ "cityName":"芜湖",
+ "keyword":"芜湖WUHU"
+ },
+ {
+ "cityName":"乌兰察布",
+ "keyword":"乌兰察布WULANCHABU"
+ },
+ {
+ "cityName":"乌鲁木齐",
+ "keyword":"乌鲁木齐WULUMUQI"
+ },
+ {
+ "cityName":"武威",
+ "keyword":"武威WUWEI"
+ },
+ {
+ "cityName":"无锡",
+ "keyword":"无锡WUXI"
+ },
+ {
+ "cityName":"吴忠",
+ "keyword":"吴忠WUZHONG"
+ },
+ {
+ "cityName":"梧州",
+ "keyword":"梧州WUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"X",
+ "data":[
+ {
+ "cityName":"厦门",
+ "keyword":"厦门XIAMEN"
+ },
+ {
+ "cityName":"西安",
+ "keyword":"西安XIAN"
+ },
+ {
+ "cityName":"湘潭",
+ "keyword":"湘潭XIANGTAN"
+ },
+ {
+ "cityName":"湘西",
+ "keyword":"湘西XIANGXI"
+ },
+ {
+ "cityName":"襄阳",
+ "keyword":"襄阳XIANGYANG"
+ },
+ {
+ "cityName":"咸宁",
+ "keyword":"咸宁XIANNING"
+ },
+ {
+ "cityName":"咸阳",
+ "keyword":"咸阳XIANYANG"
+ },
+ {
+ "cityName":"孝感",
+ "keyword":"孝感XIAOGAN"
+ },
+ {
+ "cityName":"锡林郭勒",
+ "keyword":"锡林郭勒XILINGUOLE"
+ },
+ {
+ "cityName":"兴安",
+ "keyword":"大兴安岭DAXINGANLING"
+ },
+ {
+ "cityName":"兴安",
+ "keyword":"兴安XINGAN"
+ },
+ {
+ "cityName":"邢台",
+ "keyword":"邢台XINGTAI"
+ },
+ {
+ "cityName":"西宁",
+ "keyword":"西宁XINING"
+ },
+ {
+ "cityName":"新疆",
+ "keyword":"新疆XINJIANG"
+ },
+ {
+ "cityName":"新乡",
+ "keyword":"新乡XINXIANG"
+ },
+ {
+ "cityName":"信阳",
+ "keyword":"信阳XINYANG"
+ },
+ {
+ "cityName":"新余",
+ "keyword":"新余XINYU"
+ },
+ {
+ "cityName":"忻州",
+ "keyword":"忻州XINZHOU"
+ },
+ {
+ "cityName":"西双版纳",
+ "keyword":"西双版纳XISHUANGBANNA"
+ },
+ {
+ "cityName":"宣城",
+ "keyword":"宣城XUANCHENG"
+ },
+ {
+ "cityName":"许昌",
+ "keyword":"许昌XUCHANG"
+ },
+ {
+ "cityName":"徐州",
+ "keyword":"徐州XUZHOU"
+ }
+ ]
+ },
+ {
+ "letter":"Y",
+ "data":[
+ {
+ "cityName":"雅安",
+ "keyword":"雅安YAAN"
+ },
+ {
+ "cityName":"延安",
+ "keyword":"延安YANAN"
+ },
+ {
+ "cityName":"延边",
+ "keyword":"延边YANBIAN"
+ },
+ {
+ "cityName":"盐城",
+ "keyword":"盐城YANCHENG"
+ },
+ {
+ "cityName":"阳江",
+ "keyword":"阳江YANGJIANG"
+ },
+ {
+ "cityName":"阳泉",
+ "keyword":"阳泉YANGQUAN"
+ },
+ {
+ "cityName":"扬州",
+ "keyword":"扬州YANGZHOU"
+ },
+ {
+ "cityName":"烟台",
+ "keyword":"烟台YANTAI"
+ },
+ {
+ "cityName":"宜宾",
+ "keyword":"宜宾YIBIN"
+ },
+ {
+ "cityName":"宜昌",
+ "keyword":"宜昌YICHANG"
+ },
+ {
+ "cityName":"伊春",
+ "keyword":"伊春YICHUN"
+ },
+ {
+ "cityName":"宜春",
+ "keyword":"宜春YICHUN"
+ },
+ {
+ "cityName":"伊犁",
+ "keyword":"伊犁YILI"
+ },
+ {
+ "cityName":"银川",
+ "keyword":"银川YINCHUAN"
+ },
+ {
+ "cityName":"营口",
+ "keyword":"营口YINGKOU"
+ },
+ {
+ "cityName":"鹰潭",
+ "keyword":"鹰潭YINGTAN"
+ },
+ {
+ "cityName":"益阳",
+ "keyword":"益阳YIYANG"
+ },
+ {
+ "cityName":"永州",
+ "keyword":"永州YONGZHOU"
+ },
+ {
+ "cityName":"岳阳",
+ "keyword":"岳阳YUEYANG"
+ },
+ {
+ "cityName":"玉林",
+ "keyword":"玉林YULIN"
+ },
+ {
+ "cityName":"榆林",
+ "keyword":"榆林YULIN"
+ },
+ {
+ "cityName":"运城",
+ "keyword":"运城YUNCHENG"
+ },
+ {
+ "cityName":"云浮",
+ "keyword":"云浮YUNFU"
+ },
+ {
+ "cityName":"玉树",
+ "keyword":"玉树YUSHU"
+ },
+ {
+ "cityName":"玉溪",
+ "keyword":"玉溪YUXI"
+ }
+ ]
+ },
+ {
+ "letter":"Z",
+ "data":[
+ {
+ "cityName":"枣庄",
+ "keyword":"枣庄ZAOZHUANG"
+ },
+ {
+ "cityName":"张家界",
+ "keyword":"张家界ZHANGJIAJIE"
+ },
+ {
+ "cityName":"张家口",
+ "keyword":"张家口ZHANGJIAKOU"
+ },
+ {
+ "cityName":"张掖",
+ "keyword":"张掖ZHANGYE"
+ },
+ {
+ "cityName":"漳州",
+ "keyword":"漳州ZHANGZHOU"
+ },
+ {
+ "cityName":"湛江",
+ "keyword":"湛江ZHANJIANG"
+ },
+ {
+ "cityName":"肇庆",
+ "keyword":"肇庆ZHAOQING"
+ },
+ {
+ "cityName":"昭通",
+ "keyword":"昭通ZHAOTONG"
+ },
+ {
+ "cityName":"朝阳",
+ "keyword":"朝阳ZHAOYANG"
+ },
+ {
+ "cityName":"郑州",
+ "keyword":"郑州ZHENGZHOU"
+ },
+ {
+ "cityName":"镇江",
+ "keyword":"镇江ZHENJIANG"
+ },
+ {
+ "cityName":"中山",
+ "keyword":"中山ZHONGSHAN"
+ },
+ {
+ "cityName":"中卫",
+ "keyword":"中卫ZHONGWEI"
+ },
+ {
+ "cityName":"周口",
+ "keyword":"周口ZHOUKOU"
+ },
+ {
+ "cityName":"舟山",
+ "keyword":"舟山ZHOUSHAN"
+ },
+ {
+ "cityName":"珠海",
+ "keyword":"珠海ZHUHAI"
+ },
+ {
+ "cityName":"驻马店",
+ "keyword":"驻马店ZHUMADIAN"
+ },
+ {
+ "cityName":"株洲",
+ "keyword":"株洲ZHUZHOU"
+ },
+ {
+ "cityName":"淄博",
+ "keyword":"淄博ZIBO"
+ },
+ {
+ "cityName":"自贡",
+ "keyword":"自贡ZIGONG"
+ },
+ {
+ "cityName":"资阳",
+ "keyword":"资阳ZIYANG"
+ },
+ {
+ "cityName":"遵义",
+ "keyword":"遵义ZUNYI"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/utils/emoji.js b/utils/emoji.js
new file mode 100644
index 0000000..6826959
--- /dev/null
+++ b/utils/emoji.js
@@ -0,0 +1,22 @@
+export default {
+ cn: ["[开心]", "[高兴]", "[哈哈]", "[灿烂]", "[大笑]", "[汗臭]", "[地板上笑]", "[笑哭]", "[微笑]", "[颠倒]", "[眨眼]", "[面带笑容]", "[晕笑]", "[爱心笑]", "[喜欢]", "[开眼界]", "[飞吻]",
+ "[亲亲]", "[面带微笑]", "[闭眼亲亲]", "[笑脸亲亲]", "[面对食物]", "[吐舌]", "[眨眼吐舌]", "[赞尼]", "[鬼脸]", "[钱嘴]",
+ "[拥抱]", "[偷笑]", "[嘘]", "[思考]", "[闭嘴]", "[翘眉毛]", "[中性]", "[无表情]", "[无嘴脸]", "[傻笑]", "[无趣]", "[白眼]", "[尴尬]", "[说谎]", "[舒缓]", "[沉思]", "[沉睡]", "[流口水]", "[睡觉]",
+ "[感冒]", "[发热]", "[受伤]", "[恶心]", "[呕吐]", "[打喷嚏]", "[炎热]", "[寒冷]", "[毛茸茸]", "[头晕]",
+ "[爆炸头]", "[牛仔帽]", "[聚会]", "[酷]", "[书呆子]", "[观察]", "[困惑]", "[担心]", "[皱眉]", "[不开心]", "[张嘴]", "[寂静]", "[惊讶]", "[害羞]", "[恳求]", "[丧气]", "[痛苦]", "[可怕]", "[焦虑]",
+ "[悲伤]", "[哭泣]", "[聚会]", "[恐惧]", "[极度困惑]", "[执着]", "[失望]", "[垂头丧气]", "[疲倦]", "[十分疲倦]",
+ "[打哈欠]", "[出气]", "[愤怒]", "[生气]", "[咒骂]"
+ ],
+ en: ["emoji_01", "emoji_02", "emoji_03", "emoji_04", "emoji_05", "emoji_06", "emoji_07", "emoji_08", "emoji_09",
+ "emoji_10", "emoji_11", "emoji_12", "emoji_13", "emoji_14", "emoji_15", "emoji_16", "emoji_17", "emoji_18",
+ "emoji_19", "emoji_20", "emoji_21", "emoji_22", "emoji_23", "emoji_24", "emoji_25", "emoji_26", "emoji_27",
+ "emoji_28", "emoji_29", "emoji_30", "emoji_31", "emoji_32", "emoji_33", "emoji_34", "emoji_35", "emoji_36",
+ "emoji_37", "emoji_38", "emoji_39", "emoji_40", "emoji_41", "emoji_42", "emoji_43", "emoji_44", "emoji_45",
+ "emoji_46", "emoji_47", "emoji_48", "emoji_49", "emoji_50", "emoji_51", "emoji_52", "emoji_53", "emoji_54",
+ "emoji_55", "emoji_56", "emoji_57", "emoji_58", "emoji_59", "emoji_60", "emoji_61", "emoji_62", "emoji_63",
+ "emoji_64", "emoji_65", "emoji_66", "emoji_67", "emoji_68", "emoji_69", "emoji_70", "emoji_71", "emoji_72",
+ "emoji_73", "emoji_74", "emoji_75", "emoji_76", "emoji_77", "emoji_78", "emoji_79", "emoji_80", "emoji_81",
+ "emoji_82", "emoji_83", "emoji_84", "emoji_85", "emoji_86", "emoji_87", "emoji_88", "emoji_89", "emoji_90"
+ ]
+
+};
\ No newline at end of file
diff --git a/utils/index.list.js b/utils/index.list.js
new file mode 100644
index 0000000..aaf4007
--- /dev/null
+++ b/utils/index.list.js
@@ -0,0 +1,585 @@
+export default {
+ list: [{
+ "letter": "A",
+ "data": [{
+ "name": "阿拉斯加",
+ "mobile": "13588889999",
+ "keyword": "阿拉斯加ABA13588889999"
+ },
+ {
+ "name": "阿克苏",
+ "mobile": "0551-4386721",
+ "keyword": "阿克苏AKESU0551-4386721"
+ },
+ {
+ "name": "阿拉善",
+ "mobile": "4008009100",
+ "keyword": "阿拉善ALASHAN4008009100"
+ },
+ {
+ "name": "阿勒泰",
+ "mobile": "13588889999",
+ "keyword": "阿勒泰ALETAI13588889999"
+ },
+ {
+ "name": "阿里",
+ "mobile": "13588889999",
+ "keyword": "阿里ALI13588889999"
+ },
+ {
+ "name": "安阳",
+ "mobile": "13588889999",
+ "keyword": "13588889999安阳ANYANG"
+ }
+ ]
+ },
+ {
+ "letter": "B",
+ "data": [{
+ "name": "白城",
+ "mobile": "该主子没有留电话~",
+ "keyword": "白城BAICHENG"
+ },
+ {
+ "name": "白山",
+ "mobile": "13588889999",
+ "keyword": "白山BAISHAN13588889999"
+ },
+ {
+ "name": "白银",
+ "mobile": "13588889999",
+ "keyword": "白银BAIYIN13588889999"
+ },
+ {
+ "name": "保定",
+ "mobile": "13588889999",
+ "keyword": "保定BAODING13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "C",
+ "data": [{
+ "name": "沧州",
+ "mobile": "13588889999",
+ "keyword": "沧州CANGZHOU13588889999"
+ },
+ {
+ "name": "长春",
+ "mobile": "13588889999",
+ "keyword": "长春CHANGCHUN13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "D",
+ "data": [{
+ "name": "大理",
+ "mobile": "13588889999",
+ "keyword": "大理DALI13588889999"
+ },
+ {
+ "name": "大连",
+ "mobile": "13588889999",
+ "keyword": "大连DALIAN13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "E",
+ "data": [{
+ "name": "鄂尔多斯",
+ "mobile": "13588889999",
+ "keyword": "鄂尔多斯EERDUOSI13588889999"
+ },
+ {
+ "name": "恩施",
+ "mobile": "13588889999",
+ "keyword": "恩施ENSHI13588889999"
+ },
+ {
+ "name": "鄂州",
+ "mobile": "13588889999",
+ "keyword": "鄂州EZHOU13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "F",
+ "data": [{
+ "name": "防城港",
+ "mobile": "该主子没有留电话~",
+ "keyword": "防城港FANGCHENGGANG"
+ },
+ {
+ "name": "抚顺",
+ "mobile": "13588889999",
+ "keyword": "抚顺FUSHUN13588889999"
+ },
+ {
+ "name": "阜新",
+ "mobile": "13588889999",
+ "keyword": "阜新FUXIN13588889999"
+ },
+ {
+ "name": "阜阳",
+ "mobile": "13588889999",
+ "keyword": "阜阳FUYANG13588889999"
+ },
+ {
+ "name": "抚州",
+ "mobile": "13588889999",
+ "keyword": "抚州FUZHOU13588889999"
+ },
+ {
+ "name": "福州",
+ "mobile": "13588889999",
+ "keyword": "福州FUZHOU13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "G",
+ "data": [{
+ "name": "甘南",
+ "mobile": "13588889999",
+ "keyword": "甘南GANNAN13588889999"
+ },
+ {
+ "name": "赣州",
+ "mobile": "13588889999",
+ "keyword": "赣州GANZHOU13588889999"
+ },
+ {
+ "name": "甘孜",
+ "mobile": "13588889999",
+ "keyword": "甘孜GANZI13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "H",
+ "data": [{
+ "name": "哈尔滨",
+ "mobile": "13588889999",
+ "keyword": "哈尔滨HAERBIN13588889999"
+ },
+ {
+ "name": "海北",
+ "mobile": "13588889999",
+ "keyword": "海北HAIBEI13588889999"
+ },
+ {
+ "name": "海东",
+ "mobile": "13588889999",
+ "keyword": "海东HAIDONG13588889999"
+ },
+ {
+ "name": "海口",
+ "mobile": "13588889999",
+ "keyword": "海口HAIKOU13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "I",
+ "data": [{
+ "name": "ice",
+ "mobile": "13588889999",
+ "keyword": "佳木斯JIAMUSI13588889999"
+ }]
+ },
+ {
+ "letter": "J",
+ "data": [{
+ "name": "佳木斯",
+ "mobile": "13588889999",
+ "keyword": "佳木斯JIAMUSI13588889999"
+ },
+ {
+ "name": "吉安",
+ "mobile": "13588889999",
+ "keyword": "吉安JIAN13588889999"
+ },
+ {
+ "name": "江门",
+ "mobile": "13588889999",
+ "keyword": "江门JIANGMEN13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "K",
+ "data": [{
+ "name": "开封",
+ "mobile": "13588889999",
+ "keyword": "开封KAIFENG13588889999"
+ },
+ {
+ "name": "喀什",
+ "mobile": "13588889999",
+ "keyword": "喀什KASHI13588889999"
+ },
+ {
+ "name": "克拉玛依",
+ "mobile": "13588889999",
+ "keyword": "克拉玛依KELAMAYI13588889999"
+ }
+ ]
+ },
+ {
+ "letter": "L",
+ "data": [{
+ "name": "来宾",
+ "mobile": "13588889999",
+ "keyword": "来宾LAIBIN13588889999"
+ },
+ {
+ "name": "兰州",
+ "mobile": "13588889999",
+ "keyword": "兰州LANZHOU13588889999"
+ },
+ {
+ "name": "拉萨",
+ "mobile": "13588889999",
+ "keyword": "拉萨LASA13588889999"
+ },
+ {
+ "name": "乐山",
+ "mobile": "13588889999",
+ "keyword": "乐山LESHAN13588889999"
+ },
+ {
+ "name": "凉山",
+ "mobile": "13588889999",
+ "keyword": "凉山LIANGSHAN13588889999"
+ },
+ {
+ "name": "连云港",
+ "mobile": "13588889999",
+ "keyword": "连云港LIANYUNGANG13588889999"
+ },
+ {
+ "name": "聊城",
+ "mobile": "18322223333",
+ "keyword": "聊城LIAOCHENG18322223333"
+ },
+ {
+ "name": "辽阳",
+ "mobile": "18322223333",
+ "keyword": "辽阳LIAOYANG18322223333"
+ },
+ {
+ "name": "辽源",
+ "mobile": "18322223333",
+ "keyword": "辽源LIAOYUAN18322223333"
+ },
+ {
+ "name": "丽江",
+ "mobile": "18322223333",
+ "keyword": "丽江LIJIANG18322223333"
+ },
+ {
+ "name": "临沧",
+ "mobile": "18322223333",
+ "keyword": "临沧LINCANG18322223333"
+ },
+ {
+ "name": "临汾",
+ "mobile": "18322223333",
+ "keyword": "临汾LINFEN18322223333"
+ },
+ {
+ "name": "临夏",
+ "mobile": "18322223333",
+ "keyword": "临夏LINXIA18322223333"
+ },
+ {
+ "name": "临沂",
+ "mobile": "18322223333",
+ "keyword": "临沂LINYI18322223333"
+ },
+ {
+ "name": "林芝",
+ "mobile": "18322223333",
+ "keyword": "林芝LINZHI18322223333"
+ },
+ {
+ "name": "丽水",
+ "mobile": "18322223333",
+ "keyword": "丽水LISHUI18322223333"
+ }
+ ]
+ },
+ {
+ "letter": "M",
+ "data": [{
+ "name": "眉山",
+ "mobile": "15544448888",
+ "keyword": "眉山MEISHAN15544448888"
+ },
+ {
+ "name": "梅州",
+ "mobile": "15544448888",
+ "keyword": "梅州MEIZHOU15544448888"
+ },
+ {
+ "name": "绵阳",
+ "mobile": "15544448888",
+ "keyword": "绵阳MIANYANG15544448888"
+ },
+ {
+ "name": "牡丹江",
+ "mobile": "15544448888",
+ "keyword": "牡丹江MUDANJIANG15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "N",
+ "data": [{
+ "name": "南昌",
+ "mobile": "15544448888",
+ "keyword": "南昌NANCHANG15544448888"
+ },
+ {
+ "name": "南充",
+ "mobile": "15544448888",
+ "keyword": "南充NANCHONG15544448888"
+ },
+ {
+ "name": "南京",
+ "mobile": "15544448888",
+ "keyword": "南京NANJING15544448888"
+ },
+ {
+ "name": "南宁",
+ "mobile": "15544448888",
+ "keyword": "南宁NANNING15544448888"
+ },
+ {
+ "name": "南平",
+ "mobile": "15544448888",
+ "keyword": "南平NANPING15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "O",
+ "data": [{
+ "name": "欧阳",
+ "mobile": "15544448888",
+ "keyword": "欧阳ouyang15544448888"
+ }]
+ },
+ {
+ "letter": "P",
+ "data": [{
+ "name": "盘锦",
+ "mobile": "15544448888",
+ "keyword": "盘锦PANJIN15544448888"
+ },
+ {
+ "name": "攀枝花",
+ "mobile": "15544448888",
+ "keyword": "攀枝花PANZHIHUA15544448888"
+ },
+ {
+ "name": "平顶山",
+ "mobile": "15544448888",
+ "keyword": "平顶山PINGDINGSHAN15544448888"
+ },
+ {
+ "name": "平凉",
+ "mobile": "15544448888",
+ "keyword": "平凉PINGLIANG15544448888"
+ },
+ {
+ "name": "萍乡",
+ "mobile": "15544448888",
+ "keyword": "萍乡PINGXIANG15544448888"
+ },
+ {
+ "name": "普洱",
+ "mobile": "15544448888",
+ "keyword": "普洱PUER15544448888"
+ },
+ {
+ "name": "莆田",
+ "mobile": "15544448888",
+ "keyword": "莆田PUTIAN15544448888"
+ },
+ {
+ "name": "濮阳",
+ "mobile": "15544448888",
+ "keyword": "濮阳PUYANG15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "Q",
+ "data": [{
+ "name": "黔东南",
+ "mobile": "15544448888",
+ "keyword": "黔东南QIANDONGNAN15544448888"
+ },
+ {
+ "name": "黔南",
+ "mobile": "15544448888",
+ "keyword": "黔南QIANNAN15544448888"
+ },
+ {
+ "name": "黔西南",
+ "mobile": "15544448888",
+ "keyword": "黔西南QIANXINAN15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "R",
+ "data": [{
+ "name": "日喀则",
+ "mobile": "15544448888",
+ "keyword": "日喀则RIKAZE15544448888"
+ },
+ {
+ "name": "日照",
+ "mobile": "15544448888",
+ "keyword": "日照RIZHAO15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "S",
+ "data": [{
+ "name": "三门峡",
+ "mobile": "15544448888",
+ "keyword": "三门峡SANMENXIA15544448888"
+ },
+ {
+ "name": "三明",
+ "mobile": "15544448888",
+ "keyword": "三明SANMING15544448888"
+ },
+ {
+ "name": "三沙",
+ "mobile": "15544448888",
+ "keyword": "三沙SANSHA15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "T",
+ "data": [{
+ "name": "塔城",
+ "mobile": "15544448888",
+ "keyword": "塔城TACHENG15544448888"
+ },
+ {
+ "name": "漯河",
+ "mobile": "15544448888",
+ "keyword": "漯河TAHE15544448888"
+ },
+ {
+ "name": "泰安",
+ "mobile": "15544448888",
+ "keyword": "泰安TAIAN15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "W",
+ "data": [{
+ "name": "潍坊",
+ "mobile": "15544448888",
+ "keyword": "潍坊WEIFANG15544448888"
+ },
+ {
+ "name": "威海",
+ "mobile": "15544448888",
+ "keyword": "威海WEIHAI15544448888"
+ },
+ {
+ "name": "渭南",
+ "mobile": "15544448888",
+ "keyword": "渭南WEINAN15544448888"
+ },
+ {
+ "name": "文山",
+ "mobile": "15544448888",
+ "keyword": "文山WENSHAN15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "X",
+ "data": [{
+ "name": "厦门",
+ "mobile": "15544448888",
+ "keyword": "厦门XIAMEN15544448888"
+ },
+ {
+ "name": "西安",
+ "mobile": "15544448888",
+ "keyword": "西安XIAN15544448888"
+ },
+ {
+ "name": "湘潭",
+ "mobile": "15544448888",
+ "keyword": "湘潭XIANGTAN15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "Y",
+ "data": [{
+ "name": "雅安",
+ "mobile": "15544448888",
+ "keyword": "雅安YAAN15544448888"
+ },
+ {
+ "name": "延安",
+ "mobile": "15544448888",
+ "keyword": "延安YANAN15544448888"
+ },
+ {
+ "name": "延边",
+ "mobile": "15544448888",
+ "keyword": "延边YANBIAN15544448888"
+ },
+ {
+ "name": "盐城",
+ "mobile": "15544448888",
+ "keyword": "盐城YANCHENG15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "Z",
+ "data": [{
+ "name": "枣庄",
+ "mobile": "15544448888",
+ "keyword": "枣庄ZAOZHUANG15544448888"
+ },
+ {
+ "name": "张家界",
+ "mobile": "15544448888",
+ "keyword": "张家界ZHANGJIAJIE15544448888"
+ },
+ {
+ "name": "张家口",
+ "mobile": "15544448888",
+ "keyword": "张家口ZHANGJIAKOU15544448888"
+ }
+ ]
+ },
+ {
+ "letter": "well",
+ "data": [{
+ "name": "☆echo.",
+ "mobile": "16666666666",
+ "keyword": "echo16666666666"
+ }]
+ }
+ ]
+}
diff --git a/utils/picker.city.js b/utils/picker.city.js
new file mode 100644
index 0000000..a12f665
--- /dev/null
+++ b/utils/picker.city.js
@@ -0,0 +1,405 @@
+//测试数据,数据并非完整,只验证功能
+export default [{
+ "text": "北京市",
+ "value": "110000",
+ "children": [{
+ "text": "北京市市辖区",
+ "value": "110100",
+ "children": [{
+ "text": "东城区",
+ "value": "110101"
+ }, {
+ "text": "西城区",
+ "value": "110102"
+ }, {
+ "text": "朝阳区",
+ "value": "110105"
+ }]
+ }]
+ },
+ {
+ "text": "安徽省",
+ "value": "340000",
+ "children": [{
+ "text": "合肥市",
+ "value": "340100",
+ "children": [{
+ "text": "瑶海区",
+ "value": "340102"
+ }, {
+ "text": "庐阳区",
+ "value": "340103"
+ }, {
+ "text": "蜀山区",
+ "value": "340104"
+ }, {
+ "text": "包河区",
+ "value": "340111"
+ }, {
+ "text": "长丰县",
+ "value": "340121"
+ }, {
+ "text": "肥东县",
+ "value": "340122"
+ }, {
+ "text": "肥西县",
+ "value": "340123"
+ }, {
+ "text": "庐江县",
+ "value": "340124"
+ }, {
+ "text": "巢湖市",
+ "value": "340181"
+ }]
+ }, {
+ "text": "芜湖市",
+ "value": "340200",
+ "children": [{
+ "text": "镜湖区",
+ "value": "340202"
+ }, {
+ "text": "弋江区",
+ "value": "340203"
+ }, {
+ "text": "鸠江区",
+ "value": "340207"
+ }, {
+ "text": "三山区",
+ "value": "340208"
+ }, {
+ "text": "芜湖县",
+ "value": "340221"
+ }, {
+ "text": "繁昌县",
+ "value": "340222"
+ }, {
+ "text": "南陵县",
+ "value": "340223"
+ }, {
+ "text": "无为县",
+ "value": "340225"
+ }]
+ }, {
+ "text": "蚌埠市",
+ "value": "340300",
+ "children": [{
+ "text": "龙子湖区",
+ "value": "340302"
+ }, {
+ "text": "蚌山区",
+ "value": "340303"
+ }, {
+ "text": "禹会区",
+ "value": "340304"
+ }, {
+ "text": "淮上区",
+ "value": "340311"
+ }, {
+ "text": "怀远县",
+ "value": "340321"
+ }, {
+ "text": "五河县",
+ "value": "340322"
+ }, {
+ "text": "固镇县",
+ "value": "340323"
+ }]
+ }, {
+ "text": "淮南市",
+ "value": "340400",
+ "children": [{
+ "text": "大通区",
+ "value": "340402"
+ }, {
+ "text": "田家庵区",
+ "value": "340403"
+ }, {
+ "text": "谢家集区",
+ "value": "340404"
+ }, {
+ "text": "八公山区",
+ "value": "340405"
+ }, {
+ "text": "潘集区",
+ "value": "340406"
+ }, {
+ "text": "凤台县",
+ "value": "340421"
+ }, {
+ "text": "寿县",
+ "value": "340422"
+ }]
+ }, {
+ "text": "马鞍山市",
+ "value": "340500",
+ "children": [{
+ "text": "花山区",
+ "value": "340503"
+ }, {
+ "text": "雨山区",
+ "value": "340504"
+ }, {
+ "text": "博望区",
+ "value": "340506"
+ }, {
+ "text": "当涂县",
+ "value": "340521"
+ }, {
+ "text": "含山县",
+ "value": "340522"
+ }, {
+ "text": "和县",
+ "value": "340523"
+ }]
+ }, {
+ "text": "淮北市",
+ "value": "340600",
+ "children": [{
+ "text": "杜集区",
+ "value": "340602"
+ }, {
+ "text": "相山区",
+ "value": "340603"
+ }, {
+ "text": "烈山区",
+ "value": "340604"
+ }, {
+ "text": "濉溪县",
+ "value": "340621"
+ }]
+ }, {
+ "text": "铜陵市",
+ "value": "340700",
+ "children": [{
+ "text": "铜官区",
+ "value": "340705"
+ }, {
+ "text": "义安区",
+ "value": "340706"
+ }, {
+ "text": "郊区",
+ "value": "340711"
+ }, {
+ "text": "枞阳县",
+ "value": "340722"
+ }]
+ }, {
+ "text": "安庆市",
+ "value": "340800",
+ "children": [{
+ "text": "迎江区",
+ "value": "340802"
+ }, {
+ "text": "大观区",
+ "value": "340803"
+ }, {
+ "text": "宜秀区",
+ "value": "340811"
+ }, {
+ "text": "怀宁县",
+ "value": "340822"
+ }, {
+ "text": "潜山县",
+ "value": "340824"
+ }, {
+ "text": "太湖县",
+ "value": "340825"
+ }, {
+ "text": "宿松县",
+ "value": "340826"
+ }, {
+ "text": "望江县",
+ "value": "340827"
+ }, {
+ "text": "岳西县",
+ "value": "340828"
+ }, {
+ "text": "桐城市",
+ "value": "340881"
+ }]
+ }, {
+ "text": "黄山市",
+ "value": "341000",
+ "children": [{
+ "text": "屯溪区",
+ "value": "341002"
+ }, {
+ "text": "黄山区",
+ "value": "341003"
+ }, {
+ "text": "徽州区",
+ "value": "341004"
+ }, {
+ "text": "歙县",
+ "value": "341021"
+ }, {
+ "text": "休宁县",
+ "value": "341022"
+ }, {
+ "text": "黟县",
+ "value": "341023"
+ }, {
+ "text": "祁门县",
+ "value": "341024"
+ }]
+ }, {
+ "text": "滁州市",
+ "value": "341100",
+ "children": [{
+ "text": "琅琊区",
+ "value": "341102"
+ }, {
+ "text": "南谯区",
+ "value": "341103"
+ }, {
+ "text": "来安县",
+ "value": "341122"
+ }, {
+ "text": "全椒县",
+ "value": "341124"
+ }, {
+ "text": "定远县",
+ "value": "341125"
+ }, {
+ "text": "凤阳县",
+ "value": "341126"
+ }, {
+ "text": "天长市",
+ "value": "341181"
+ }, {
+ "text": "明光市",
+ "value": "341182"
+ }]
+ }, {
+ "text": "阜阳市",
+ "value": "341200",
+ "children": [{
+ "text": "颍州区",
+ "value": "341202"
+ }, {
+ "text": "颍东区",
+ "value": "341203"
+ }, {
+ "text": "颍泉区",
+ "value": "341204"
+ }, {
+ "text": "临泉县",
+ "value": "341221"
+ }, {
+ "text": "太和县",
+ "value": "341222"
+ }, {
+ "text": "阜南县",
+ "value": "341225"
+ }, {
+ "text": "颍上县",
+ "value": "341226"
+ }, {
+ "text": "界首市",
+ "value": "341282"
+ }]
+ }, {
+ "text": "宿州市",
+ "value": "341300",
+ "children": [{
+ "text": "埇桥区",
+ "value": "341302"
+ }, {
+ "text": "砀山县",
+ "value": "341321"
+ }, {
+ "text": "萧县",
+ "value": "341322"
+ }, {
+ "text": "灵璧县",
+ "value": "341323"
+ }, {
+ "text": "泗县",
+ "value": "341324"
+ }]
+ }, {
+ "text": "六安市",
+ "value": "341500",
+ "children": [{
+ "text": "金安区",
+ "value": "341502"
+ }, {
+ "text": "裕安区",
+ "value": "341503"
+ }, {
+ "text": "叶集区",
+ "value": "341504"
+ }, {
+ "text": "霍邱县",
+ "value": "341522"
+ }, {
+ "text": "舒城县",
+ "value": "341523"
+ }, {
+ "text": "金寨县",
+ "value": "341524"
+ }, {
+ "text": "霍山县",
+ "value": "341525"
+ }]
+ }, {
+ "text": "亳州市",
+ "value": "341600",
+ "children": [{
+ "text": "谯城区",
+ "value": "341602"
+ }, {
+ "text": "涡阳县",
+ "value": "341621"
+ }, {
+ "text": "蒙城县",
+ "value": "341622"
+ }, {
+ "text": "利辛县",
+ "value": "341623"
+ }]
+ }, {
+ "text": "池州市",
+ "value": "341700",
+ "children": [{
+ "text": "贵池区",
+ "value": "341702"
+ }, {
+ "text": "东至县",
+ "value": "341721"
+ }, {
+ "text": "石台县",
+ "value": "341722"
+ }, {
+ "text": "青阳县",
+ "value": "341723"
+ }]
+ }, {
+ "text": "宣城市",
+ "value": "341800",
+ "children": [{
+ "text": "宣州区",
+ "value": "341802"
+ }, {
+ "text": "郎溪县",
+ "value": "341821"
+ }, {
+ "text": "广德县",
+ "value": "341822"
+ }, {
+ "text": "泾县",
+ "value": "341823"
+ }, {
+ "text": "绩溪县",
+ "value": "341824"
+ }, {
+ "text": "旌德县",
+ "value": "341825"
+ }, {
+ "text": "宁国市",
+ "value": "341881"
+ }]
+ }]
+ }
+
+];
\ No newline at end of file
diff --git a/utils/util.js b/utils/util.js
new file mode 100644
index 0000000..28dcd5d
--- /dev/null
+++ b/utils/util.js
@@ -0,0 +1,92 @@
+/**
+ * 数据处理
+ * @author echo.
+ * @version 1.5.0
+ **/
+const utils = {
+ //去空格
+ trim: function(value) {
+ return value.replace(/(^\s*)|(\s*$)/g, "");
+ },
+ //内容替换
+ replaceAll: function(text, repstr, newstr) {
+ return text.replace(new RegExp(repstr, "gm"), newstr);
+ },
+ //格式化手机号码
+ formatNumber: function(num) {
+ return num.length === 11 ? num.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') : num;
+ },
+ //金额格式化
+ rmoney: function(money) {
+ return parseFloat(money).toFixed(2).toString().split('').reverse().join('').replace(/(\d{3})/g, '$1,').replace(
+ /\,$/, '').split('').reverse().join('');
+ },
+ //日期格式化
+ formatDate: function(formatStr, fdate) {
+ if (fdate) {
+ if (~fdate.indexOf('.')) {
+ fdate = fdate.substring(0, fdate.indexOf('.'));
+ }
+ fdate = fdate.toString().replace('T', ' ').replace(/\-/g, '/');
+ var fTime, fStr = 'ymdhis';
+ if (!formatStr)
+ formatStr = "y-m-d h:i:s";
+ if (fdate)
+ fTime = new Date(fdate);
+ else
+ fTime = new Date();
+ var month = fTime.getMonth() + 1;
+ var day = fTime.getDate();
+ var hours = fTime.getHours();
+ var minu = fTime.getMinutes();
+ var second = fTime.getSeconds();
+ month = month < 10 ? '0' + month : month;
+ day = day < 10 ? '0' + day : day;
+ hours = hours < 10 ? ('0' + hours) : hours;
+ minu = minu < 10 ? '0' + minu : minu;
+ second = second < 10 ? '0' + second : second;
+ var formatArr = [
+ fTime.getFullYear().toString(),
+ month.toString(),
+ day.toString(),
+ hours.toString(),
+ minu.toString(),
+ second.toString()
+ ]
+ for (var i = 0; i < formatArr.length; i++) {
+ formatStr = formatStr.replace(fStr.charAt(i), formatArr[i]);
+ }
+ return formatStr;
+ } else {
+ return "";
+ }
+ },
+ rgbToHex: function (r, g, b) {
+ return "#" + utils.toHex(r) + utils.toHex(g) + utils.toHex(b)
+ },
+ toHex: function (n) {
+ n = parseInt(n, 10);
+ if (isNaN(n)) return "00";
+ n = Math.max(0, Math.min(n, 255));
+ return "0123456789ABCDEF".charAt((n - n % 16) / 16) +
+ "0123456789ABCDEF".charAt(n % 16);
+ },
+ hexToRgb(hex) {
+ let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+ return result ? {
+ r: parseInt(result[1], 16),
+ g: parseInt(result[2], 16),
+ b: parseInt(result[3], 16)
+ } : null;
+ }
+}
+
+export default {
+ trim: utils.trim,
+ replaceAll: utils.replaceAll,
+ formatNumber: utils.formatNumber,
+ rmoney: utils.rmoney,
+ formatDate: utils.formatDate,
+ rgbToHex: utils.rgbToHex,
+ hexToRgb: utils.hexToRgb
+}