From 6023eac4fe783f1051aa6ccf827099955e4cbd3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=B2=E4=B9=88=E4=BA=86?= Date: Thu, 16 Nov 2023 15:13:28 +0800 Subject: [PATCH] first commit --- .gitignore | 10 + App.vue | 66 + androidPrivacy.json | 3 + appid | 1 + components/back.vue | 152 + components/echarts/echarts.simple.min.js | 22 + components/keyboard.vue | 104 + components/loading/loading.vue | 24 + components/mpvue-echarts/src/echarts.vue | 123 + components/mpvue-echarts/src/wx-canvas.js | 73 + components/personalModule.vue | 52 + components/quit.vue | 74 + components/u-charts/component.vue | 165 + components/u-charts/u-charts.js | 5633 ++++++++++++++++ components/u-charts/u-charts.min.js | 1 + components/uni-calendar/calendar.js | 546 ++ components/uni-calendar/uni-calendar-item.vue | 152 + components/uni-calendar/uni-calendar.vue | 383 ++ components/uni-calendar/util.js | 327 + components/xuan-loading/xuan-loading.vue | 221 + main.js | 135 + manifest.json | 137 + pages.json | 227 + pages/chooseLine/chooseLine.css | 393 ++ pages/chooseLine/chooseLine.vue | 452 ++ pages/companyIntroduce/companyIntroduce.vue | 30 + pages/condition/condition.css | 54 + pages/condition/condition.vue | 149 + pages/data/data.css | 621 ++ pages/data/data.vue | 1062 +++ .../dataIntegrityDetails.css | 168 + .../dataIntegrityDetails.vue | 241 + pages/fastLogin/fastLogin.css | 107 + pages/fastLogin/fastLogin.vue | 134 + .../fastLoginSetPassword.css | 67 + .../fastLoginSetPassword.vue | 195 + pages/fastLoginVercode/fastLoginVercode.css | 93 + pages/fastLoginVercode/fastLoginVercode.vue | 210 + pages/forgetPassword/forgetPassword.css | 78 + pages/forgetPassword/forgetPassword.vue | 90 + .../forgetPasswordVercode.css | 96 + .../forgetPasswordVercode.vue | 197 + pages/history/history.css | 160 + pages/history/history.vue | 352 + pages/index/index.css | 102 + pages/index/index.vue | 56 + pages/information/information.css | 253 + pages/information/information.vue | 797 +++ pages/levelUp/levelUp.css | 47 + pages/levelUp/levelUp.vue | 115 + pages/login/login.css | 199 + pages/login/login.vue | 407 ++ pages/me/me.css | 194 + pages/me/me.vue | 190 + pages/modifyPassword/modifyPassword.css | 93 + pages/modifyPassword/modifyPassword.vue | 149 + .../modifyPasswordSetpassword.css | 136 + .../modifyPasswordSetpassword.vue | 299 + .../modifyUserPhoneNum/modifyUserPhoneNum.css | 93 + .../modifyUserPhoneNum/modifyUserPhoneNum.vue | 200 + .../modifyUserPhoneNumSetPhoneNum.css | 132 + .../modifyUserPhoneNumSetPhoneNum.vue | 275 + pages/myApply/myApply.css | 72 + pages/myApply/myApply.vue | 173 + pages/preview/preview.css | 11 + pages/preview/preview.vue | 33 + pages/privacyAgreement/privacyAgreement.vue | 30 + pages/report/report.css | 360 + pages/report/report.vue | 1098 +++ pages/setNewMessage/setNewMessage.css | 21 + pages/setNewMessage/setNewMessage.vue | 200 + pages/setNewPassword/setNewPassword.css | 136 + pages/setNewPassword/setNewPassword.vue | 291 + pages/setting/setting.css | 16 + pages/setting/setting.vue | 50 + pages/spectrum/spectrum.css | 107 + pages/spectrum/spectrum.vue | 560 ++ pages/steady/steady.css | 113 + pages/steady/steady.vue | 108 + pages/steadyDetails/steadyDetails.css | 92 + pages/steadyDetails/steadyDetails.vue | 111 + pages/steadyIndex/steadyIndex.css | 59 + pages/steadyIndex/steadyIndex.vue | 143 + pages/systemIntroduce/systemIntroduce.vue | 30 + pages/terminal/terminal.css | 119 + pages/terminal/terminal.vue | 129 + pages/terminalDetails/terminalDetails.css | 199 + pages/terminalDetails/terminalDetails.vue | 148 + pages/terminalHistory/terminalHistory.css | 129 + pages/terminalHistory/terminalHistory.vue | 202 + pages/terminalStatus/terminalStatus.css | 184 + pages/terminalStatus/terminalStatus.vue | 278 + pages/terminalStatusAll/terminalStatusAll.css | 21 + pages/terminalStatusAll/terminalStatusAll.vue | 101 + pages/transientDetails/transientDetails.css | 463 ++ pages/transientDetails/transientDetails.vue | 861 +++ pages/transientWave/transientWave.css | 34 + pages/transientWave/transientWave.vue | 135 + pages/us/us.css | 24 + pages/us/us.vue | 33 + pages/userAgreement/userAgreement.vue | 30 + pages/vercode/vercode.css | 123 + pages/vercode/vercode.vue | 193 + static/js/aes.js | 36 + static/js/crypto.js | 5988 +++++++++++++++++ static/js/des.js | 24 + static/js/errorMsg.js | 31 + static/logo.png | Bin 0 -> 4023 bytes static/pic/A_A.png | Bin 0 -> 6336 bytes static/pic/A_B.png | Bin 0 -> 6454 bytes static/pic/A_C.png | Bin 0 -> 6479 bytes static/pic/KV_A.png | Bin 0 -> 6480 bytes static/pic/KV_B.png | Bin 0 -> 6452 bytes static/pic/KV_C.png | Bin 0 -> 6401 bytes static/pic/aboutUs.png | Bin 0 -> 38027 bytes static/pic/aboutUs.png的替身 | Bin 0 -> 1072 bytes static/pic/aboutUs的副本.png | Bin 0 -> 38027 bytes static/pic/asc.png | Bin 0 -> 614 bytes static/pic/back.png | Bin 0 -> 1104 bytes static/pic/background.png | Bin 0 -> 17901 bytes static/pic/background_done.png | Bin 0 -> 32742 bytes static/pic/calendar.png | Bin 0 -> 709 bytes static/pic/change_phoneNum.png | Bin 0 -> 571 bytes static/pic/choose.png | Bin 0 -> 1297 bytes static/pic/choose2.png | Bin 0 -> 1319 bytes static/pic/close.png | Bin 0 -> 339 bytes static/pic/company_introduce.png | Bin 0 -> 1151 bytes static/pic/current.png | Bin 0 -> 583 bytes static/pic/dashboard.png | Bin 0 -> 35651 bytes static/pic/data.png | Bin 0 -> 1723 bytes static/pic/data_background.png | Bin 0 -> 33223 bytes static/pic/data_click.png | Bin 0 -> 2830 bytes static/pic/delete.png | Bin 0 -> 1484 bytes static/pic/desc.png | Bin 0 -> 613 bytes static/pic/dot.png | Bin 0 -> 563 bytes static/pic/download.png | Bin 0 -> 1144 bytes static/pic/head.png | Bin 0 -> 4734 bytes static/pic/history.png | Bin 0 -> 608 bytes static/pic/history_click.png | Bin 0 -> 1238 bytes static/pic/information.png | Bin 0 -> 587 bytes static/pic/information_click.png | Bin 0 -> 1115 bytes static/pic/inner_buy.png | Bin 0 -> 1529 bytes static/pic/jump.png | Bin 0 -> 622 bytes static/pic/level.png | Bin 0 -> 1760 bytes static/pic/level_up.png | Bin 0 -> 10315 bytes static/pic/level_up_background.png | Bin 0 -> 7869 bytes static/pic/me.png | Bin 0 -> 1803 bytes static/pic/me_click.png | Bin 0 -> 1489 bytes static/pic/modify_password.png | Bin 0 -> 1282 bytes static/pic/no.png | Bin 0 -> 3478 bytes static/pic/nochoose.png | Bin 0 -> 1112 bytes static/pic/normal.png | Bin 0 -> 534 bytes static/pic/number.png | Bin 0 -> 1023 bytes static/pic/pointer1.png | Bin 0 -> 1466 bytes static/pic/pointer2.png | Bin 0 -> 1497 bytes static/pic/pointer3.png | Bin 0 -> 1359 bytes static/pic/pointerAA.png | Bin 0 -> 2441 bytes static/pic/pointerAB.png | Bin 0 -> 2253 bytes static/pic/pointerAC.png | Bin 0 -> 2365 bytes static/pic/pointerKVA.png | Bin 0 -> 1476 bytes static/pic/pointerKVB.png | Bin 0 -> 1513 bytes static/pic/pointerKVC.png | Bin 0 -> 1421 bytes static/pic/pull.png | Bin 0 -> 396 bytes static/pic/pull_up.png | Bin 0 -> 260 bytes static/pic/rectangle.png | Bin 0 -> 88 bytes static/pic/report.png | Bin 0 -> 946 bytes static/pic/report_click.png | Bin 0 -> 1845 bytes static/pic/search.png | Bin 0 -> 2012 bytes static/pic/see.png | Bin 0 -> 1026 bytes static/pic/see_close.png | Bin 0 -> 1310 bytes static/pic/set_new_message.png | Bin 0 -> 1113 bytes static/pic/setting.png | Bin 0 -> 2513 bytes static/pic/steady.png | Bin 0 -> 43196 bytes static/pic/sys_introduce.png | Bin 0 -> 913 bytes static/pic/terminal.png | Bin 0 -> 36318 bytes static/pic/terminalStatus.png | Bin 0 -> 374 bytes static/pic/time.png | Bin 0 -> 1923 bytes static/pic/transient.png | Bin 0 -> 24553 bytes static/pic/user_agreement.png | Bin 0 -> 1027 bytes static/pic/voltage.png | Bin 0 -> 1633 bytes static/pic/yes.png | Bin 0 -> 3573 bytes uni.scss | 76 + uni_modules/uni-icons/changelog.md | 22 + .../uni-icons/components/uni-icons/icons.js | 1169 ++++ .../components/uni-icons/uni-icons.vue | 96 + .../components/uni-icons/uniicons.css | 663 ++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 86 + uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-indexed-list/changelog.md | 17 + .../uni-indexed-list-item.vue | 144 + .../uni-indexed-list/uni-indexed-list.vue | 367 + uni_modules/uni-indexed-list/package.json | 89 + uni_modules/uni-indexed-list/readme.md | 11 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + 209 files changed, 34095 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 androidPrivacy.json create mode 100644 appid create mode 100644 components/back.vue create mode 100644 components/echarts/echarts.simple.min.js create mode 100644 components/keyboard.vue create mode 100644 components/loading/loading.vue create mode 100644 components/mpvue-echarts/src/echarts.vue create mode 100644 components/mpvue-echarts/src/wx-canvas.js create mode 100644 components/personalModule.vue create mode 100644 components/quit.vue create mode 100644 components/u-charts/component.vue create mode 100644 components/u-charts/u-charts.js create mode 100644 components/u-charts/u-charts.min.js create mode 100644 components/uni-calendar/calendar.js create mode 100644 components/uni-calendar/uni-calendar-item.vue create mode 100644 components/uni-calendar/uni-calendar.vue create mode 100644 components/uni-calendar/util.js create mode 100644 components/xuan-loading/xuan-loading.vue create mode 100644 main.js create mode 100644 manifest.json create mode 100644 pages.json create mode 100644 pages/chooseLine/chooseLine.css create mode 100644 pages/chooseLine/chooseLine.vue create mode 100644 pages/companyIntroduce/companyIntroduce.vue create mode 100644 pages/condition/condition.css create mode 100644 pages/condition/condition.vue create mode 100644 pages/data/data.css create mode 100644 pages/data/data.vue create mode 100644 pages/dataIntegrityDetails/dataIntegrityDetails.css create mode 100644 pages/dataIntegrityDetails/dataIntegrityDetails.vue create mode 100644 pages/fastLogin/fastLogin.css create mode 100644 pages/fastLogin/fastLogin.vue create mode 100644 pages/fastLoginSetPassword/fastLoginSetPassword.css create mode 100644 pages/fastLoginSetPassword/fastLoginSetPassword.vue create mode 100644 pages/fastLoginVercode/fastLoginVercode.css create mode 100644 pages/fastLoginVercode/fastLoginVercode.vue create mode 100644 pages/forgetPassword/forgetPassword.css create mode 100644 pages/forgetPassword/forgetPassword.vue create mode 100644 pages/forgetPasswordVercode/forgetPasswordVercode.css create mode 100644 pages/forgetPasswordVercode/forgetPasswordVercode.vue create mode 100644 pages/history/history.css create mode 100644 pages/history/history.vue create mode 100644 pages/index/index.css create mode 100644 pages/index/index.vue create mode 100644 pages/information/information.css create mode 100644 pages/information/information.vue create mode 100644 pages/levelUp/levelUp.css create mode 100644 pages/levelUp/levelUp.vue create mode 100644 pages/login/login.css create mode 100644 pages/login/login.vue create mode 100644 pages/me/me.css create mode 100644 pages/me/me.vue create mode 100644 pages/modifyPassword/modifyPassword.css create mode 100644 pages/modifyPassword/modifyPassword.vue create mode 100644 pages/modifyPasswordSetpassword/modifyPasswordSetpassword.css create mode 100644 pages/modifyPasswordSetpassword/modifyPasswordSetpassword.vue create mode 100644 pages/modifyUserPhoneNum/modifyUserPhoneNum.css create mode 100644 pages/modifyUserPhoneNum/modifyUserPhoneNum.vue create mode 100644 pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.css create mode 100644 pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.vue create mode 100644 pages/myApply/myApply.css create mode 100644 pages/myApply/myApply.vue create mode 100644 pages/preview/preview.css create mode 100644 pages/preview/preview.vue create mode 100644 pages/privacyAgreement/privacyAgreement.vue create mode 100644 pages/report/report.css create mode 100644 pages/report/report.vue create mode 100644 pages/setNewMessage/setNewMessage.css create mode 100644 pages/setNewMessage/setNewMessage.vue create mode 100644 pages/setNewPassword/setNewPassword.css create mode 100644 pages/setNewPassword/setNewPassword.vue create mode 100644 pages/setting/setting.css create mode 100644 pages/setting/setting.vue create mode 100644 pages/spectrum/spectrum.css create mode 100644 pages/spectrum/spectrum.vue create mode 100644 pages/steady/steady.css create mode 100644 pages/steady/steady.vue create mode 100644 pages/steadyDetails/steadyDetails.css create mode 100644 pages/steadyDetails/steadyDetails.vue create mode 100644 pages/steadyIndex/steadyIndex.css create mode 100644 pages/steadyIndex/steadyIndex.vue create mode 100644 pages/systemIntroduce/systemIntroduce.vue create mode 100644 pages/terminal/terminal.css create mode 100644 pages/terminal/terminal.vue create mode 100644 pages/terminalDetails/terminalDetails.css create mode 100644 pages/terminalDetails/terminalDetails.vue create mode 100644 pages/terminalHistory/terminalHistory.css create mode 100644 pages/terminalHistory/terminalHistory.vue create mode 100644 pages/terminalStatus/terminalStatus.css create mode 100644 pages/terminalStatus/terminalStatus.vue create mode 100644 pages/terminalStatusAll/terminalStatusAll.css create mode 100644 pages/terminalStatusAll/terminalStatusAll.vue create mode 100644 pages/transientDetails/transientDetails.css create mode 100644 pages/transientDetails/transientDetails.vue create mode 100644 pages/transientWave/transientWave.css create mode 100644 pages/transientWave/transientWave.vue create mode 100644 pages/us/us.css create mode 100644 pages/us/us.vue create mode 100644 pages/userAgreement/userAgreement.vue create mode 100644 pages/vercode/vercode.css create mode 100644 pages/vercode/vercode.vue create mode 100644 static/js/aes.js create mode 100644 static/js/crypto.js create mode 100644 static/js/des.js create mode 100644 static/js/errorMsg.js create mode 100644 static/logo.png create mode 100644 static/pic/A_A.png create mode 100644 static/pic/A_B.png create mode 100644 static/pic/A_C.png create mode 100644 static/pic/KV_A.png create mode 100644 static/pic/KV_B.png create mode 100644 static/pic/KV_C.png create mode 100644 static/pic/aboutUs.png create mode 100644 static/pic/aboutUs.png的替身 create mode 100644 static/pic/aboutUs的副本.png create mode 100644 static/pic/asc.png create mode 100644 static/pic/back.png create mode 100644 static/pic/background.png create mode 100644 static/pic/background_done.png create mode 100644 static/pic/calendar.png create mode 100644 static/pic/change_phoneNum.png create mode 100644 static/pic/choose.png create mode 100644 static/pic/choose2.png create mode 100644 static/pic/close.png create mode 100644 static/pic/company_introduce.png create mode 100644 static/pic/current.png create mode 100644 static/pic/dashboard.png create mode 100644 static/pic/data.png create mode 100644 static/pic/data_background.png create mode 100644 static/pic/data_click.png create mode 100644 static/pic/delete.png create mode 100644 static/pic/desc.png create mode 100644 static/pic/dot.png create mode 100644 static/pic/download.png create mode 100644 static/pic/head.png create mode 100644 static/pic/history.png create mode 100644 static/pic/history_click.png create mode 100644 static/pic/information.png create mode 100644 static/pic/information_click.png create mode 100644 static/pic/inner_buy.png create mode 100644 static/pic/jump.png create mode 100644 static/pic/level.png create mode 100644 static/pic/level_up.png create mode 100644 static/pic/level_up_background.png create mode 100644 static/pic/me.png create mode 100644 static/pic/me_click.png create mode 100644 static/pic/modify_password.png create mode 100644 static/pic/no.png create mode 100644 static/pic/nochoose.png create mode 100644 static/pic/normal.png create mode 100644 static/pic/number.png create mode 100644 static/pic/pointer1.png create mode 100644 static/pic/pointer2.png create mode 100644 static/pic/pointer3.png create mode 100644 static/pic/pointerAA.png create mode 100644 static/pic/pointerAB.png create mode 100644 static/pic/pointerAC.png create mode 100644 static/pic/pointerKVA.png create mode 100644 static/pic/pointerKVB.png create mode 100644 static/pic/pointerKVC.png create mode 100644 static/pic/pull.png create mode 100644 static/pic/pull_up.png create mode 100644 static/pic/rectangle.png create mode 100644 static/pic/report.png create mode 100644 static/pic/report_click.png create mode 100644 static/pic/search.png create mode 100644 static/pic/see.png create mode 100644 static/pic/see_close.png create mode 100644 static/pic/set_new_message.png create mode 100644 static/pic/setting.png create mode 100644 static/pic/steady.png create mode 100644 static/pic/sys_introduce.png create mode 100644 static/pic/terminal.png create mode 100644 static/pic/terminalStatus.png create mode 100644 static/pic/time.png create mode 100644 static/pic/transient.png create mode 100644 static/pic/user_agreement.png create mode 100644 static/pic/voltage.png create mode 100644 static/pic/yes.png create mode 100644 uni.scss create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-indexed-list/changelog.md create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 uni_modules/uni-indexed-list/package.json create mode 100644 uni_modules/uni-indexed-list/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d919598 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +.idea +unpackage/ +node_modules/ +node_modules +/.vscode +.hbuilderx +.vscode +jsconfig.json +.svn \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..5bb4efd --- /dev/null +++ b/App.vue @@ -0,0 +1,66 @@ + + + diff --git a/androidPrivacy.json b/androidPrivacy.json new file mode 100644 index 0000000..12df862 --- /dev/null +++ b/androidPrivacy.json @@ -0,0 +1,3 @@ +{ + "prompt": "template" +} diff --git a/appid b/appid new file mode 100644 index 0000000..b143ee1 --- /dev/null +++ b/appid @@ -0,0 +1 @@ +uni.UNI9894FCF \ No newline at end of file diff --git a/components/back.vue b/components/back.vue new file mode 100644 index 0000000..807381e --- /dev/null +++ b/components/back.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/components/echarts/echarts.simple.min.js b/components/echarts/echarts.simple.min.js new file mode 100644 index 0000000..0725b8f --- /dev/null +++ b/components/echarts/echarts.simple.min.js @@ -0,0 +1,22 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";var e=2311,n=function(){return e++},m="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:function(t){var e={},n=t.match(/Firefox\/([\d.]+)/),i=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),r=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);n&&(e.firefox=!0,e.version=n[1]);i&&(e.ie=!0,e.version=i[1]);r&&(e.edge=!0,e.version=r[1]);a&&(e.weChat=!0);return{browser:e,os:{},node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!e.ie&&!e.edge,pointerEventsSupported:"onpointerdown"in window&&(e.edge||e.ie&&11<=e.version),domSupported:"undefined"!=typeof document}}(navigator.userAgent);var s={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},l={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},h=Object.prototype.toString,i=Array.prototype,o=i.forEach,u=i.filter,r=i.slice,c=i.map,d=i.reduce,a={};function b(t){if(null==t||"object"!=typeof t)return t;var e=t,n=h.call(t);if("[object Array]"===n){if(!q(t)){e=[];for(var i=0,r=t.length;i>1)%2;s.cssText=["position:absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","width:0","height:0",i[l]+":0",r[h]+":0",i[1-l]+":auto",r[1-h]+":auto",""].join("!important;"),t.appendChild(o),n.push(o)}return n}(t,o),o);if(s)return s(xt,i,r),n.zrX=xt[0],void(n.zrY=xt[1])}n.zrX=n.zrY=0}function St(t,e,n){if(null!=(e=e||window.event).zrX)return e;var i=e.type;if(i&&0<=i.indexOf("touch")){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&wt(t,r,e,n)}else wt(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&yt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function Mt(){this._track=[]}var It=mt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function Tt(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}Mt.prototype={constructor:Mt,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,o=i.length;a=this._maxSize&&0>4|(3840&i)>>8,240&i|(240&i)>>4,15&i|(15&i)<<4,1),de(t,e),e):void le(e,0,0,0,1):7===r.length?0<=(i=parseInt(r.substr(1),16))&&i<=16777215?(le(e,(16711680&i)>>16,(65280&i)>>8,255&i,1),de(t,e),e):void le(e,0,0,0,1):void 0;var a=r.indexOf("("),o=r.indexOf(")");if(-1!==a&&o+1===r.length){var s=r.substr(0,a),l=r.substr(a+1,o-(a+1)).split(","),h=1;switch(s){case"rgba":if(4!==l.length)return void le(e,0,0,0,1);h=oe(l.pop());case"rgb":return 3!==l.length?void le(e,0,0,0,1):(le(e,ae(l[0]),ae(l[1]),ae(l[2]),h),de(t,e),e);case"hsla":return 4!==l.length?void le(e,0,0,0,1):(l[3]=oe(l[3]),pe(l,e),de(t,e),e);case"hsl":return 3!==l.length?void le(e,0,0,0,1):(pe(l,e),de(t,e),e);default:return}}le(e,0,0,0,1)}}function pe(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=oe(t[1]),r=oe(t[2]),a=r<=.5?r*(i+1):r+i-r*i,o=2*r-a;return le(e=e||[],ie(255*se(o,a,n+1/3)),ie(255*se(o,a,n)),ie(255*se(o,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function ge(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var ve=Array.prototype.slice;function me(t,e){return t[e]}function ye(t,e,n){t[e]=n}function _e(t,e,n){return(e-t)*n+t}function xe(t,e,n){return.5e);n++);n=Math.min(n-1,h-2)}D=e;var i=g[(k=n)+1]-g[n];if(0!=i)if(S=(e-g[n])/i,l)if(I=v[n],M=v[0===n?n:n-1],T=v[h-2=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new Ue(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Ue.create=function(t){return new Ue(t.x,t.y,t.width,t.height)};var Ye=function(t){for(var e in t=t||{},ze.call(this,t),t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Ye.prototype={constructor:Ye,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n>>1])<0?l=a:s=1+a;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;0>>1);0>>1);a(t,e[n+u])<0?l=u:o=u+1}return l}function Je(p,g){var o,s,v=je,l=0,m=[];function e(t){var e=o[t],n=s[t],i=o[t+1],r=s[t+1];s[t]=n+r,t===l-3&&(o[t+1]=o[t+2],s[t+1]=s[t+2]),l--;var a=Qe(p[i],p,e,n,0,g);e+=a,0!==(n-=a)&&0!==(r=Ke(p[e+n-1],p,i,r,r-1,g))&&(n<=r?function(t,e,n,i){var r=0;for(r=0;rs[t+1])break;e(t)}},this.forceMergeRuns=function(){for(;1>=1;return t+e}(r);do{if((a=Ze(t,n,i,e))=e.maxIterations){t+=e.ellipsis;break}var s=0===o?Fn(t,r,e.ascCharWidth,e.cnCharWidth):0f)return{lines:[],width:0,height:0};D.textWidth=Ln(D.text,w);var S=_.textWidth,M=null==S||"auto"===S;if("string"==typeof S&&"%"===S.charAt(S.length-1))D.percentWidth=S,h.push(D),S=0;else{if(M){S=D.textWidth;var I=_.textBackgroundColor,T=I&&I.image;T&&Mn(T=wn(T))&&(S=Math.max(S,T.width*b/T.height))}var C=x?x[1]+x[3]:0;S+=C;var k=null!=d?d-m:null;null!=k&&ki[0]){for(o=0;ot);o++);a=n[i[o]]}if(i.splice(o+1,0,t),!(n[t]=e).virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else Ee("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i=a.length&&a.push({option:t})}}),a}function Ui(t){var e=t.name;return!(!e||!e.indexOf(Fi))}function Yi(t){return zi(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function qi(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?C(t.dataIndex)?A(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?C(t.name)?A(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function ji(){var e="__\0ec_inner_"+Zi+++"_"+Math.random().toFixed(5);return function(t){return t[e]||(t[e]={})}}var Zi=0;function $i(s,l,h){if(L(l)){var t={};t[l+"Index"]=0,l=t}var e=h&&h.defaultMainType;!e||Ki(l,e+"Index")||Ki(l,e+"Id")||Ki(l,e+"Name")||(l[e+"Index"]=0);var u={};return Bi(l,function(t,e){t=l[e];if("dataIndex"!==e&&"dataIndexInside"!==e){var n=e.match(/^(\w+)(Index|Id|Name)$/)||[],i=n[1],r=(n[2]||"").toLowerCase();if(!(!i||!r||null==t||"index"===r&&"none"===t||h&&h.includeMainTypes&&v(h.includeMainTypes,i)<0)){var a={mainType:i};"index"===r&&"all"===t||(a[r]=t);var o=s.queryComponents(a);u[i+"Models"]=o,u[i+"Model"]=o[0]}}else u[e]=t}),u}function Ki(t,e){return t&&t.hasOwnProperty(e)}function Qi(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}var Ji=".",tr="___EC__COMPONENT__CONTAINER___";function er(t){var e={main:"",sub:""};return t&&(t=t.split(Ji),e.main=t[0]||"",e.sub=t[1]||""),e}function nr(t){(t.$constructor=t).extend=function(t){function e(){t.$constructor?t.$constructor.apply(this,arguments):n.apply(this,arguments)}var n=this;return S(e.prototype,t),e.extend=this.extend,e.superCall=ar,e.superApply=or,y(e,this),e.superClass=n,e}}var ir=0;function rr(t){var e=["__\0is_clz",ir++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function ar(t,e){var n=W(arguments,2);return this.superClass.prototype[e].apply(t,n)}function or(t,e,n){return this.superClass.prototype[e].apply(t,n)}function sr(n,t){t=t||{};var r={};if(n.registerClass=function(t,e){if(e)if(function(t){G(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}(e),(e=er(e)).sub){if(e.sub!==tr){(function(t){var e=r[t.main];e&&e[tr]||((e=r[t.main]={})[tr]=!0);return e})(e)[e.sub]=t}}else r[e.main]=t;return t},n.getClass=function(t,e,n){var i=r[t];if(i&&i[tr]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},n.getClassesByMainType=function(t){t=er(t);var n=[],e=r[t.main];return e&&e[tr]?D(e,function(t,e){e!==tr&&n.push(t)}):n.push(e),n},n.hasClass=function(t){return t=er(t),!!r[t.main]},n.getAllClassMainTypes=function(){var n=[];return D(r,function(t,e){n.push(e)}),n},n.hasSubTypes=function(t){t=er(t);var e=r[t.main];return e&&e[tr]},n.parseClassType=er,t.registerWhenExtend){var i=n.extend;i&&(n.extend=function(t){var e=i.call(this,t);return n.registerClass(e,t.type)})}return n}function lr(s){for(var t=0;tthis._ux||ea(e-this._yi)>this._uy||this._len<5;return this.addData(Ur.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,a){return this.addData(Ur.C,t,e,n,i,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,n,i){return this.addData(Ur.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,a){return this.addData(Ur.A,t,e,n,n,i,r-i,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=Qr(r)*n+t,this._yi=Jr(r)*n+e,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(Ur.R,t,e,n,i),this},closePath:function(){this.addData(Ur.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t;for(var e=this._dashIdx=0,n=0;ne.length&&(this._expandData(),e=this.data);for(var n=0;nl||ea(o-r)>h||c===u-1)&&(t.lineTo(a,o),i=a,r=o);break;case Ur.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case Ur.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case Ur.A:var f=s[c++],p=s[c++],g=s[c++],v=s[c++],m=s[c++],y=s[c++],_=s[c++],x=s[c++],w=v=ga[i=0]+t&&o<=ga[1]+t?u:0}if(a){l=i;i=la(r),r=la(l)}else i=la(i),r=la(r);rMath.PI/2&&p<1.5*Math.PI&&(u=-u),c+=u)}}return c}function xa(t,e,n,i,r){for(var a=0,o=0,s=0,l=0,h=0,u=0;uMath.abs(a[1])?0=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]}function Cs(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?function(t){return t.replace(/^\s+|\s+$/g,"")}(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function ks(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Ds(t){var e=t.toString(),n=e.indexOf("e");if(0"'])/g,Fs={"&":"&","<":"<",">":">",'"':""","'":"'"};function Vs(t){return null==t?"":(t+"").replace(Rs,function(t,e){return Fs[e]})}function Ws(t,e){return"{"+t+(null==e?"":e)+"}"}var Hs=["a","b","c","d","e","f","g"];function Gs(t,e){var n=(t=L(t)?{color:t,extraCssText:e}:t||{}).color,i=t.type,r=(e=t.extraCssText,t.renderMode||"html"),a=t.markerId||"X";return n?"html"===r?"subItem"===i?'':'':{renderMode:r,content:"{marker"+a+"|} ",style:{color:n}}:""}function Xs(t,e){return"0000".substr(0,e-(t+="").length)+t}function Us(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Os(e),r=n?"UTC":"",a=i["get"+r+"FullYear"](),o=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),h=i["get"+r+"Minutes"](),u=i["get"+r+"Seconds"](),c=i["get"+r+"Milliseconds"]();return t=t.replace("MM",Xs(o,2)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",Xs(s,2)).replace("d",s).replace("hh",Xs(l,2)).replace("h",l).replace("mm",Xs(h,2)).replace("m",h).replace("ss",Xs(u,2)).replace("s",u).replace("SSS",Xs(c,3))}var Ys=Bn,qs=D,js=["left","right","top","bottom","width","height"],Zs=[["width","left","right"],["height","top","bottom"]];function $s(u,c,d,f,p){var g=0,v=0;null==f&&(f=1/0),null==p&&(p=1/0);var m=0;c.eachChild(function(t,e){var n,i,r=t.position,a=t.getBoundingRect(),o=c.childAt(e+1),s=o&&o.getBoundingRect();if("horizontal"===u){var l=a.width+(s?-s.x+a.x:0);m=f<(n=g+l)||t.newline?(g=0,n=l,v+=m+d,a.height):Math.max(m,a.height)}else{var h=a.height+(s?-s.y+a.y:0);m=p<(i=v+h)||t.newline?(g+=m+d,v=0,i=h,a.width):Math.max(m,a.width)}t.newline||(r[0]=g,r[1]=v,"horizontal"===u?g=n+d:v=i+d)})}I($s,"vertical"),I($s,"horizontal");function Ks(l,h,t){O(t)||(t={});var u=t.ignoreSize;C(u)||(u=[u,u]);var e=i(Zs[0],0),n=i(Zs[1],1);function i(t,e){var n={},i=0,r={},a=0;if(qs(t,function(t){r[t]=l[t]}),qs(t,function(t){c(h,t)&&(n[t]=r[t]=h[t]),d(n,t)&&i++,d(r,t)&&a++}),u[e])return d(h,t[1])?r[t[2]]=null:d(h,t[2])&&(r[t[1]]=null),r;if(2!==a&&i){if(2<=i)return n;for(var o=0;oe)return t[i];return t[n-1]}(s,n):o;if((l=l||o)&&l.length){var h=l[r];return t&&(a[t]=h),i.colorIdx=(r+1)%l.length,h}}};function hl(t){var e=t.get("coordinateSystem"),n={coordSysName:e,coordSysDims:[],axisMap:Z(),categoryAxisMap:Z()},i=ul[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}var ul={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis")[0],a=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",a),cl(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),cl(a)&&(i.set("y",a),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],n.set("single",r),cl(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar")[0],a=r.findAxisModel("radiusAxis"),o=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",a),n.set("angle",o),cl(a)&&(i.set("radius",a),e.firstCategoryDimIndex=0),cl(o)&&(i.set("angle",o),e.firstCategoryDimIndex=1)},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,r,a,o){var s=t.ecModel,e=s.getComponent("parallel",t.get("parallelIndex")),l=r.coordSysDims=e.dimensions.slice();D(e.parallelAxisIndex,function(t,e){var n=s.getComponent("parallelAxis",t),i=l[e];a.set(i,n),cl(n)&&null==r.firstCategoryDimIndex&&(o.set(i,n),r.firstCategoryDimIndex=e)})}};function cl(t){return"category"===t.get("type")}var dl="original",fl="arrayRows",pl="objectRows",gl="keyedColumns",vl="unknown",ml="typedArray",yl="column",_l="row";function xl(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===gl?{}:[]),this.sourceFormat=t.sourceFormat||vl,this.seriesLayoutBy=t.seriesLayoutBy||yl,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&Z(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}xl.seriesDataToSource=function(t){return new xl({data:t,sourceFormat:N(t)?ml:dl,fromDataset:!1})},rr(xl);var wl=ji();function bl(t){var e=t.option,n=e.data,i=N(n)?ml:dl,r=!1,a=e.seriesLayoutBy,o=e.sourceHeader,s=e.dimensions,l=function(t){var e=t.option;if(!e.data)return t.ecModel.getComponent("dataset",e.datasetIndex||0)}(t);if(l){var h=l.option;n=h.source,i=wl(l).sourceFormat,r=!0,a=a||h.seriesLayoutBy,null==o&&(o=h.sourceHeader),s=s||h.dimensions}var u=function(t,e,n,i,r){if(!t)return{dimensionsDefine:Sl(r)};var a,o,s,l;if(e===fl)"auto"===i||null==i?Ml(function(t){null!=t&&"-"!==t&&(L(t)?null==o&&(o=1):o=0)},n,t,10):o=i?1:0,r||1!==o||(r=[],Ml(function(t,e){r[e]=null!=t?t:""},n,t)),a=r?r.length:n===_l?t.length:t[0]?t[0].length:null;else if(e===pl)r||(r=function(t){var e,n=0;for(;n":"\n",f="richText"===c,p={},g=0;function n(t){return{renderMode:c,content:Vs(Bs(t)),style:p}}var v=this.getData(),a=v.mapDimension("defaultedTooltip",!0),i=a.length,o=this.getRawValue(r),s=C(o),m=v.getItemVisual(r,"color");O(m)&&m.colorStops&&(m=(m.colorStops[0]||{}).color),m=m||"transparent";var l=(1":"",i=n+h.join(n||", ");return{renderMode:c,content:i,style:p}}(o):n(i?ph(v,r,a[0]):s?o[0]:o)).content,h=d.seriesIndex+"at"+g,y=Gs({color:m,type:"item",renderMode:c,markerId:h});p[h]=m,++g;var _=v.getName(r),x=this.name;Ui(this)||(x=""),x=x?Vs(x)+(u?": ":e):"";var w="string"==typeof y?y:y.content;return{html:u?w+x+l:x+w+(_?Vs(_)+": "+l:l),markers:p}},isAnimationEnabled:function(){if(m.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,n){var i=this.ecModel,r=ll.getColorFromPalette.call(this,t,e,n);return r=r||i.getColorFromPalette(t,e,n)},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});function Oh(t){var e=t.name;Ui(t)||(t.name=function(t){var n=t.getRawData(),e=n.mapDimension("seriesName",!0),i=[];return D(e,function(t){var e=n.getDimensionInfo(t);e.displayName&&i.push(e.displayName)}),i.join(" ")}(t)||e)}function Eh(t){return t.model.getRawData().count()}function Nh(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),Bh}function Bh(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function zh(e,n){D(e.CHANGABLE_METHODS,function(t){e.wrapMethod(t,I(Rh,n))})}function Rh(t){var e=Fh(t);e&&e.setOutputEnd(this.count())}function Fh(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}_(Ph,mh),_(Ph,ll);var Vh=function(){this.group=new Ye,this.uid=Ms("viewComponent")};Vh.prototype={constructor:Vh,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){},filterForExposedEvent:null};var Wh=Vh.prototype;Wh.updateView=Wh.updateLayout=Wh.updateVisual=function(t,e,n,i){},nr(Vh),sr(Vh,{registerWhenExtend:!0});function Hh(){var s=ji();return function(t){var e=s(t),n=t.pipelineContext,i=e.large,r=e.progressiveRender,a=e.large=n.large,o=e.progressiveRender=n.progressiveRender;return!!(i^a||r^o)&&"reset"}}var Gh=ji(),Xh=Hh();function Uh(){this.group=new Ye,this.uid=Ms("viewChart"),this.renderTask=yh({plan:Zh,reset:$h}),this.renderTask.context={view:this}}var Yh=Uh.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){jh(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){jh(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};function qh(t,e,n){if(t&&(t.trigger(e,n),t.isGroup&&!$o(t)))for(var i=0,r=t.childCount();ic?n+=p(g("data.partialData"),{displayCnt:c}):n+=g("data.allData");for(var o=[],s=0;sn.blockIndex?n.step:null,a=i&&i.modDataCount;return{step:r,modBy:null!=a?Math.ceil(a/r):null,modDataCount:a}}},ru.getPipeline=function(t){return this._pipelineMap.get(t)},ru.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,a=t.get("large")&&i>=t.get("largeThreshold"),o="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:o,large:a}},ru.restorePipelines=function(t){var i=this,r=i._pipelineMap=Z();t.eachSeries(function(t){var e=t.getProgressive(),n=t.uid;r.set(n,{id:n,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:e&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(e||700),count:0}),vu(i,t,t.dataTask)})},ru.prepareStageTasks=function(){var n=this._stageTaskMap,i=this.ecInstance.getModel(),r=this.api;D(this._allHandlers,function(t){var e=n.get(t.uid)||n.set(t.uid,[]);t.reset&&function(i,r,t,a,o){var s=t.seriesTaskMap||(t.seriesTaskMap=Z()),e=r.seriesType,n=r.getTargetSeries;r.createOnAllSeries?a.eachRawSeries(l):e?a.eachRawSeriesByType(e,l):n&&n(a,o).each(l);function l(t){var e=t.uid,n=s.get(e)||s.set(e,yh({plan:cu,reset:du,count:gu}));n.context={model:t,ecModel:a,api:o,useClearVisual:r.isVisual&&!r.isLayout,plan:r.plan,reset:r.reset,scheduler:i},vu(i,t,n)}var h=i._pipelineMap;s.each(function(t,e){h.get(e)||(t.dispose(),s.removeKey(e))})}(this,t,e,i,r),t.overallReset&&function(i,t,e,n,r){var a=e.overallTask=e.overallTask||yh({reset:su});a.context={ecModel:n,api:r,overallReset:t.overallReset,scheduler:i};var o=a.agentStubMap=a.agentStubMap||Z(),s=t.seriesType,l=t.getTargetSeries,h=!0,u=t.modifyOutputEnd;s?n.eachRawSeriesByType(s,c):l?l(n,r).each(c):(h=!1,D(n.getSeries(),c));function c(t){var e=t.uid,n=o.get(e);n||(n=o.set(e,yh({reset:lu,onDirty:uu})),a.dirty()),n.context={model:t,overallProgress:h,modifyOutputEnd:u},n.agent=a,n.__block=h,vu(i,t,n)}var d=i._pipelineMap;o.each(function(t,e){d.get(e)||(t.dispose(),a.dirty(),o.removeKey(e))})}(this,t,e,i,r)},this)},ru.prepareView=function(t,e,n,i){var r=t.renderTask,a=r.context;a.model=e,a.ecModel=n,a.api=i,r.__block=!t.incrementalPrepareRender,vu(this,e,r)},ru.performDataProcessorTasks=function(t,e){au(this,this._dataProcessorHandlers,t,e,{block:!0})},ru.performVisualTasks=function(t,e,n){au(this,this._visualHandlers,t,e,n)},ru.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},ru.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var ou=ru.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};function su(t){t.overallReset(t.ecModel,t.api,t.payload)}function lu(t,e){return t.overallProgress&&hu}function hu(){this.agent.dirty(),this.getDownstream().dirty()}function uu(){this.agent&&this.agent.dirty()}function cu(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function du(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Vi(t.reset(t.model,t.ecModel,t.api,t.payload));return 1t.get("hoverLayerThreshold")&&!m.node&&t.eachSeries(function(t){if(!t.preventUsingHoverLayer){var e=n._chartsMap[t.__viewId];e.__alive&&e.group.traverse(function(t){t.useHoverLayer=!0})}})}(i,t),eu(i._zr.dom,t)}function gc(e,n){Uu(Sc,function(t){t(e,n)})}nc.resize=function(t){if(!this._disposed){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this[$u]=!0,n&&ac(this),rc.update.call(this),this[$u]=!1,hc.call(this,i),uc.call(this,i)}}},nc.showLoading=function(t,e){if(!this._disposed&&(qu(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Tc[t])){var n=Tc[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},nc.hideLoading=function(){this._disposed||(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},nc.makeActionFromEvent=function(t){var e=S({},t);return e.type=xc[t.type],e},nc.dispatchAction=function(t,e){this._disposed||(qu(e)||(e={silent:!!e}),_c[t.type]&&this._model&&(this[$u]?this._pendingActions.push(t):(lc.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&m.browser.weChat&&this._throttledZrFlush(),hc.call(this,e.silent),uc.call(this,e.silent))))},nc.appendData=function(t){if(!this._disposed){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0}},nc.on=Ju("on",!1),nc.off=Ju("off",!1),nc.one=Ju("one",!1);var vc=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function mc(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function yc(){this.eventInfo}nc._initEvents=function(){Uu(vc,function(h){function t(t){var e,n=this.getModel(),i=t.target;if("globalout"===h)e={};else if(i&&null!=i.dataIndex){var r=i.dataModel||n.getSeriesByIndex(i.seriesIndex);e=r&&r.getDataParams(i.dataIndex,i.dataType,i)||{}}else i&&i.eventData&&(e=S({},i.eventData));if(e){var a=e.componentType,o=e.componentIndex;"markLine"!==a&&"markPoint"!==a&&"markArea"!==a||(a="series",o=e.seriesIndex);var s=a&&null!=o&&n.getComponent(a,o),l=s&&this["series"===s.mainType?"_chartsMap":"_componentsMap"][s.__viewId];e.event=t,e.type=h,this._ecEventProcessor.eventInfo={targetEl:i,packedEvent:e,model:s,view:l},this.trigger(h,e)}}t.zrEventfulCallAtLast=!0,this._zr.on(h,t,this)},this),Uu(xc,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},nc.isDisposed=function(){return this._disposed},nc.clear=function(){this._disposed||this.setOption({series:[]},!0)},nc.dispose=function(){if(!this._disposed){this._disposed=!0,Qi(this.getDom(),Lc,"");var e=this._api,n=this._model;Uu(this._componentsViews,function(t){t.dispose(n,e)}),Uu(this._chartsViews,function(t){t.dispose(n,e)}),this._zr.dispose(),delete Cc[this.id]}},_(ec,ft),yc.prototype={constructor:yc,normalizeQuery:function(t){var s={},l={},h={};if(L(t)){var e=ju(t);s.mainType=e.main||null,s.subType=e.sub||null}else{var u=["Index","Name","Id"],c={name:1,dataIndex:1,dataType:1};D(t,function(t,e){for(var n=!1,i=0;i_[1]&&(_[1]=y)}e&&(this._nameList[d]=e[f])}this._rawCount=this._count=l,this._extent={},ud(this)},ld._initDataFromProvider=function(t,e){if(!(e<=t)){for(var n,i=this._chunkSize,r=this._rawData,a=this._storage,o=this.dimensions,s=o.length,l=this._dimensionInfos,h=this._nameList,u=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=0;pM[1]&&(M[1]=S)}if(!r.pure){var I=h[m];if(v&&null==I)if(null!=v.name)h[m]=I=v.name;else if(null!=n){var T=o[n],C=a[T][y];if(C){I=C[_];var k=l[T].ordinalMeta;k&&k.categories.length&&(I=k.categories[I])}}var D=null==v?null:v.id;null==D&&null!=I&&(d[I]=d[I]||0,0=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return a;r=a-1}}return-1},ld.indicesOfNearest=function(t,e,n){var i=[];if(!this._storage[t])return i;null==n&&(n=1/0);for(var r=Number.MAX_VALUE,a=-1,o=0,s=this.count();ot[I][1])&&(M=!1)}M&&(a[o++]=this.getRawIndex(v))}return ow[1]&&(w[1]=x)}}}return r},ld.downSample=function(t,e,n,i){for(var r=vd(this,[t]),a=r._storage,o=[],s=Math.floor(1/e),l=a[t],h=this.count(),u=this._chunkSize,c=r._rawExtent[t],d=new(id(this))(h),f=0,p=0;pc[1]&&(c[1]=_),d[f++]=x}return r._count=f,r._indices=d,r.getRawIndex=fd,r},ld.getItemModel=function(t){var e=this.hostModel;return new xs(this.getRawDataItem(t),e,e&&e.ecModel)},ld.diff=function(e){var n=this;return new qc(e?e.getIndices():[],this.getIndices(),function(t){return pd(e,t)},function(t){return pd(n,t)})},ld.getVisual=function(t){var e=this._visual;return e&&e[t]},ld.setVisual=function(t,e){if(Kc(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},ld.setLayout=function(t,e){if(Kc(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},ld.getLayout=function(t){return this._layout[t]},ld.getItemLayout=function(t){return this._itemLayouts[t]},ld.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?S(this._itemLayouts[t]||{},e):e},ld.clearItemLayouts=function(){this._itemLayouts.length=0},ld.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},ld.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{},r=this.hasItemVisual;if(this._itemVisuals[t]=i,Kc(e))for(var a in e)e.hasOwnProperty(a)&&(i[a]=e[a],r[a]=!0);else i[e]=n,r[e]=!0},ld.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};function _d(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType}function xd(t,e,n){xl.isInstance(e)||(e=xl.seriesDataToSource(e)),n=n||{},t=(t||[]).slice();for(var i=(n.dimsDef||[]).slice(),l=Z(n.encodeDef),r=Z(),a=Z(),h=[],o=function(t,e,n,i){var r=Math.max(t.dimensionsDetectCount||1,e.length,n.length,i||0);return D(e,function(t){var e=t.dimsDef;e&&(r=Math.max(r,e.length))}),r}(e,t,i,n.dimCount),s=0;si[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}var hf=Ma.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.points,i=0,r=n.length,a=lf(n,e.smoothConstraint);if(e.connectNulls){for(;0i)return!1;return!0}(a,e))){var o=e.mapDimension(a.dim),s={};return D(a.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(o,t))}}}}function mf(t,e,n){if("cartesian2d"!==t.type)return df(t,e,n);var i=t.getBaseAxis().isHorizontal(),r=cf(t,e,n);if(!n.get("clip",!0)){var a=r.shape,o=Math.max(a.width,a.height);i?(a.y-=o,a.height+=2*o):(a.x-=o,a.width+=2*o)}return r}Uh.extend({type:"line",init:function(){var t=new Ye,e=new Ud;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var i=t.coordinateSystem,r=this.group,a=t.getData(),o=t.getModel("lineStyle"),s=t.getModel("areaStyle"),l=a.mapArray(a.getItemLayout),h="polar"===i.type,u=this._coordSys,c=this._symbolDraw,d=this._polyline,f=this._polygon,p=this._lineGroup,g=t.get("animation"),v=!s.isEmpty(),m=s.get("origin"),y=function(t,e,n){if(!n.valueDim)return[];for(var i=[],r=0,a=e.count();ru[c-1].coord&&(u.reverse(),d.reverse());var f=u[0].coord-10,p=u[c-1].coord+10,g=p-f;if(g<.001)return"transparent";D(u,function(t){t.offset=(t.coord-f)/g}),u.push({offset:c?u[c-1].offset:.5,color:d[1]||"transparent"}),u.unshift({offset:c?u[0].offset:.5,color:d[0]||"transparent"});var v=new fo(0,0,0,0,u,!0);return v[i]=f,v[i+"2"]=p,v}}}(a,i)||a.getVisual("color");d.useStyle(k(o.getLineStyle(),{fill:"none",stroke:M,lineJoin:"bevel"}));var I=t.get("smooth");if(I=pf(t.get("smooth")),d.setShape({smooth:I,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),f){var T=a.getCalculationInfo("stackedOnSeries"),C=0;f.useStyle(k(s.getAreaStyle(),{fill:M,opacity:.7,lineJoin:"bevel"})),T&&(C=pf(T.get("smooth"))),f.setShape({smooth:I,stackedOnSmooth:C,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=i,this._stackedOnPoints=y,this._points=l,this._step=S,this._valueOrigin=m},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),a=qi(r,i);if(!(a instanceof Array)&&null!=a&&0<=a){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;(o=new Nd(r,a)).position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else Uh.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=qi(r,i);if(null!=a&&0<=a){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else Uh.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new hf({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new uf({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n},_updateAnimation:function(t,e,n,i,r,a){var o=this._polyline,s=this._polygon,l=t.hostModel,h=function(t,e,n,i,r,a,o,s){for(var l=function(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}(t,e),h=[],u=[],c=[],d=[],f=[],p=[],g=[],v=$d(r,e,o),m=$d(a,t,s),y=0;ye&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n=e[0]&&t<=e[1]},xf.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},xf.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},xf.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},xf.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},xf.prototype.getExtent=function(){return this._extent.slice()},xf.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},xf.prototype.isBlank=function(){return this._isBlank},xf.prototype.setBlank=function(t){this._isBlank=t},xf.prototype.getLabel=null,nr(xf),sr(xf,{registerWhenExtend:!0}),wf.createByAxisModel=function(t){var e=t.option,n=e.data,i=n&&A(n,Mf);return new wf({categories:i,needCollect:!i,deduplication:!1!==e.dedplication})};var bf=wf.prototype;function Sf(t){return t._map||(t._map=Z(t.categories))}function Mf(t){return O(t)&&null!=t.value?t.value:t+""}bf.getOrdinal=function(t){return Sf(this).get(t)},bf.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=Sf(this);return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e};var If=xf.prototype,Tf=xf.extend({type:"ordinal",init:function(t,e){t&&!C(t)||(t=new wf({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),If.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return If.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(If.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){if(!this.isBlank())return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:$,niceExtent:$});Tf.create=function(){return new Tf};var Cf=ks;function kf(t){return Ds(t)+2}function Df(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function Af(t,e){isFinite(t[0])||(t[0]=e[0]),isFinite(t[1])||(t[1]=e[1]),Df(t,0,e),Df(t,1,e),t[0]>t[1]&&(t[0]=t[1])}var Lf=ks,Pf=xf.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),Pf.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=kf(t)},getTicks:function(){return function(t,e,n,i){var r=[];if(!t)return r;e[0](r.length?r[r.length-1]:n[1])&&r.push(e[1]),r}(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=Ds(t)||0:"auto"===n&&(n=this._intervalPrecision),Bs(t=Lf(t,n,!0))},niceTicks:function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var a=function(t,e,n,i){var r={},a=t[1]-t[0],o=r.interval=Ns(a/e,!0);null!=n&&o>>1;t[r][1]s[1];d(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&d(s[0],e[0].coord)&&e.unshift({coord:s[0]});d(s[1],a.coord)&&(i?a.coord=s[1]:e.pop());i&&d(a.coord,s[1])&&e.push({coord:s[1]});function d(t,e){return t=ks(t),e=ks(e),c?ee[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},y(Cp,Mp);var kp={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},Dp={};Dp.categoryAxis=f({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},kp),Dp.valueAxis=f({boundaryGap:[0,0],splitNumber:5},kp),Dp.timeAxis=k({scale:!0,min:"dataMin",max:"dataMax"},Dp.valueAxis),Dp.logAxis=k({scale:!0,logBase:10},Dp.valueAxis);function Ap(a,t,o,e){D(Lp,function(r){t.extend({type:a+"Axis."+r,mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?Qs(t):{};f(t,e.getTheme().get(r+"Axis")),f(t,this.getDefaultOption()),t.type=o(a,t),n&&Ks(t,i,n)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=wf.createByAxisModel(this))},getCategories:function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:function(t,e){for(var n=t[0],i=1,r=t.length;ih[1]?-1:1,c=["start"===a?h[0]-u*l:"end"===a?h[1]+u*l:(h[0]+h[1])/2,Qp(a)?t.labelOffset+o*l:0],d=e.get("nameRotate");null!=d&&(d=d*Up/180),Qp(a)?i=jp(t.rotation,null!=d?d:t.rotation,o):(i=function(t,e,n,i){var r,a,o=As(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;r=Ls(o-Up/2)?(a=l?"bottom":"top","center"):Ls(o-1.5*Up)?(a=l?"top":"bottom","center"):(a="middle",o<1.5*Up&&Up/2l[1]&&l.reverse(),(null==o||o>l[1])&&(o=l[1]),ou&&(u=h[d],c=d);++s[c],h[c]=0,++l}return s[e]/r}(i,t,e.hostModel.get("percentPrecision")),n.$vars.push("percent"),n},_defaultLabelLine:function(t){Wi(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationTypeUpdate:"transition",animationEasing:"cubicOut"}});function Dg(t,e,n,i){var r=e.getData(),a=this.dataIndex,o=r.getName(a),s=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:o,seriesId:e.id}),r.each(function(t){Ag(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,n)})}function Ag(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=n?i:0,s=[Math.cos(a)*o,Math.sin(a)*o];r?t.animate().when(200,{position:s}).start("bounceOut"):t.attr("position",s)}function Lg(t,e){Ye.call(this);var n=new Ya({z2:2}),i=new Ka,r=new Ha;this.add(n),this.add(i),this.add(r),this.updateData(t,e,!0)}_(kg,Cg);var Pg=Lg.prototype;Pg.updateData=function(t,e,n){var i=this.childAt(0),r=this.childAt(1),a=this.childAt(2),o=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),h=S({},l);h.label=null;var u=o.getShallow("animationTypeUpdate");n?(i.setShape(h),"scale"===o.getShallow("animationType")?(i.shape.r=l.r0,ls(i,{shape:{r:l.r}},o,e)):(i.shape.endAngle=l.startAngle,ss(i,{shape:{endAngle:l.endAngle}},o,e))):"expansion"===u?i.setShape(h):ss(i,{shape:h},o,e);var c=t.getItemVisual(e,"color");i.useStyle(k({lineJoin:"bevel",fill:c},s.getModel("itemStyle").getItemStyle())),i.hoverStyle=s.getModel("emphasis.itemStyle").getItemStyle();var d=s.getShallow("cursor");d&&i.attr("cursor",d),Ag(this,t.getItemLayout(e),o.isSelected(null,e),o.get("selectedOffset"),o.get("animation"));var f=!n&&"transition"===u;this._updateLabel(t,e,f),this.highDownOnUpdate=s.get("hoverAnimation")&&o.isAnimationEnabled()?function(t,e){"emphasis"===e?(r.ignore=r.hoverIgnore,a.ignore=a.hoverIgnore,i.stopAnimation(!0),i.animateTo({shape:{r:l.r+o.get("hoverOffset")}},300,"elasticOut")):(r.ignore=r.normalIgnore,a.ignore=a.normalIgnore,i.stopAnimation(!0),i.animateTo({shape:{r:l.r}},300,"elasticOut"))}:null,jo(this)},Pg._updateLabel=function(t,e,n){var i=this.childAt(1),r=this.childAt(2),a=t.hostModel,o=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"color");if(!s||isNaN(s.x)||isNaN(s.y))r.ignore=r.normalIgnore=r.hoverIgnore=i.ignore=i.normalIgnore=i.hoverIgnore=!0;else{var h={points:s.linePoints||[[s.x,s.y],[s.x,s.y],[s.x,s.y]]},u={x:s.x,y:s.y};n?(ss(i,{shape:h},a,e),ss(r,{style:u},a,e)):(i.attr({shape:h}),r.attr({style:u})),r.attr({rotation:s.rotation,origin:[s.x,s.y],z2:10});var c=o.getModel("label"),d=o.getModel("emphasis.label"),f=o.getModel("labelLine"),p=o.getModel("emphasis.labelLine");l=t.getItemVisual(e,"color");Qo(r.style,r.hoverStyle={},c,d,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:l,useInsideStyle:!!s.inside},{textAlign:s.textAlign,textVerticalAlign:s.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),r.ignore=r.normalIgnore=!c.get("show"),r.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:l,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(f.getModel("lineStyle").getLineStyle()),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var g=f.get("smooth");g&&!0===g&&(g=.4),i.setShape({smooth:g})}},y(Lg,Ye);Uh.extend({type:"pie",init:function(){var t=new Ye;this._sectorGroup=t},render:function(t,e,n,i){if(!i||i.from!==this.uid){var r=t.getData(),a=this._data,o=this.group,s=e.get("animation"),l=!a,h=t.get("animationType"),u=t.get("animationTypeUpdate"),c=I(Dg,this.uid,t,s,n),d=t.get("selectedMode");if(r.diff(a).add(function(t){var e=new Lg(r,t);l&&"scale"!==h&&e.eachChild(function(t){t.stopAnimation(!0)}),d&&e.on("click",c),r.setItemGraphicEl(t,e),o.add(e)}).update(function(t,e){var n=a.getItemGraphicEl(e);l||"transition"===u||n.eachChild(function(t){t.stopAnimation(!0)}),n.updateData(r,t),n.off("click"),d&&n.on("click",c),o.add(n),r.setItemGraphicEl(t,n)}).remove(function(t){var e=a.getItemGraphicEl(t);o.remove(e)}).execute(),s&&0=n.r0}}});var Og=Math.PI/180;function Eg(r,t,e,n,i,a,o){function s(t,e,n){for(var i=t;ir[i].y+r[i].height)return void l(i,n/2);l(e-1,n/2)}function l(t,e){for(var n=t;0<=n&&(r[n].y-=e,!(0r[n-1].y+r[n-1].height));n--);}function h(t,e,n,i,r,a){for(var o=e?Number.MAX_VALUE:0,s=0,l=t.length;s=e?p.push(r[g]):f.push(r[g]);h(f,!1,t,e,n,i),h(p,!0,t,e,n,i)}function Ng(t){return"center"===t.position}function Bg(I,T,t,e,n){var C,k,D=I.getData(),A=[],L=!1,P=(I.get("minShowLabelAngle")||0)*Og;D.each(function(t){var e=D.getItemLayout(t),n=D.getItemModel(t),i=n.getModel("label"),r=i.get("position")||n.get("emphasis.label.position"),a=n.getModel("labelLine"),o=a.get("length"),s=a.get("length2");if(!(e.angle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/loading/loading.vue b/components/loading/loading.vue new file mode 100644 index 0000000..84eb051 --- /dev/null +++ b/components/loading/loading.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/components/mpvue-echarts/src/echarts.vue b/components/mpvue-echarts/src/echarts.vue new file mode 100644 index 0000000..e1cbb66 --- /dev/null +++ b/components/mpvue-echarts/src/echarts.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/components/mpvue-echarts/src/wx-canvas.js b/components/mpvue-echarts/src/wx-canvas.js new file mode 100644 index 0000000..ef58893 --- /dev/null +++ b/components/mpvue-echarts/src/wx-canvas.js @@ -0,0 +1,73 @@ +export default class WxCanvas { + constructor(ctx, canvasId) { + this.ctx = ctx; + this.canvasId = canvasId; + this.chart = null; + + WxCanvas.initStyle(ctx); + this.initEvent(); + } + + getContext(contextType) { + return contextType === '2d' ? this.ctx : null; + } + + setChart(chart) { + this.chart = chart; + } + + attachEvent() { + // noop + } + + detachEvent() { + // noop + } + + static initStyle(ctx) { + const styles = ['fillStyle', 'strokeStyle', 'globalAlpha', + 'textAlign', 'textBaseAlign', 'shadow', 'lineWidth', + 'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize']; + + styles.forEach((style) => { + Object.defineProperty(ctx, style, { + set: (value) => { + if ((style !== 'fillStyle' && style !== 'strokeStyle') + || (value !== 'none' && value !== null) + ) { + ctx[`set${style.charAt(0).toUpperCase()}${style.slice(1)}`](value); + } + }, + }); + }); + + ctx.createRadialGradient = () => ctx.createCircularGradient(arguments); + } + + initEvent() { + this.event = {}; + const eventNames = [{ + wxName: 'touchStart', + ecName: 'mousedown', + }, { + wxName: 'touchMove', + ecName: 'mousemove', + }, { + wxName: 'touchEnd', + ecName: 'mouseup', + }, { + wxName: 'touchEnd', + ecName: 'click', + }]; + + eventNames.forEach((name) => { + this.event[name.wxName] = (e) => { + const touch = e.mp.touches[0]; + this.chart._zr.handler.dispatch(name.ecName, { + zrX: name.wxName === 'tap' ? touch.clientX : touch.x, + zrY: name.wxName === 'tap' ? touch.clientY : touch.y, + }); + }; + }); + } +} diff --git a/components/personalModule.vue b/components/personalModule.vue new file mode 100644 index 0000000..d24321e --- /dev/null +++ b/components/personalModule.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/components/quit.vue b/components/quit.vue new file mode 100644 index 0000000..876dfdc --- /dev/null +++ b/components/quit.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/components/u-charts/component.vue b/components/u-charts/component.vue new file mode 100644 index 0000000..413c360 --- /dev/null +++ b/components/u-charts/component.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/components/u-charts/u-charts.js b/components/u-charts/u-charts.js new file mode 100644 index 0000000..1785ec4 --- /dev/null +++ b/components/u-charts/u-charts.js @@ -0,0 +1,5633 @@ +/* + * uCharts v1.9.3.20190922 + * uni-app平台高性能跨全端图表,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360) + * Copyright (c) 2019 QIUN秋云 https://www.ucharts.cn All rights reserved. + * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) + * + * uCharts官方网站 + * https://www.uCharts.cn + * + * 开源地址: + * https://gitee.com/uCharts/uCharts + * + * uni-app插件市场地址: + * http://ext.dcloud.net.cn/plugin?id=271 + * + */ + +'use strict'; + +var config = { + yAxisWidth: 15, + yAxisSplit: 5, + xAxisHeight: 15, + xAxisLineHeight: 15, + legendHeight: 15, + yAxisTitleWidth: 15, + padding: [10, 10, 10, 10], + pixelRatio: 1, + rotate: false, + columePadding: 3, + fontSize: 13, + //dataPointShape: ['diamond', 'circle', 'triangle', 'rect'], + dataPointShape: ['circle', 'circle', 'circle', 'circle'], + colors: ['#1890ff', '#2fc25b', '#facc14', '#f04864', '#8543e0', '#90ed7d'], + pieChartLinePadding: 15, + pieChartTextPadding: 5, + xAxisTextPadding: 3, + titleColor: '#333333', + titleFontSize: 20, + subtitleColor: '#999999', + subtitleFontSize: 15, + toolTipPadding: 3, + toolTipBackground: '#000000', + toolTipOpacity: 0.7, + toolTipLineHeight: 20, + radarLabelTextMargin: 15, + gaugeLabelTextMargin: 15 +}; + +let assign = function (target, ...varArgs) { + if (target == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!varArgs || varArgs.length <= 0) { + return target; + } + // 深度合并对象 + function deepAssign(obj1, obj2) { + for (let key in obj2) { + obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ? + deepAssign(obj1[key], obj2[key]) : obj1[key] = obj2[key]; + } + return obj1; + } + + varArgs.forEach(val => { + target = deepAssign(target, val); + }); + return target; +}; + +var util = { + toFixed: function toFixed(num, limit) { + limit = limit || 2; + if (this.isFloat(num)) { + num = num.toFixed(limit); + } + return num; + }, + isFloat: function isFloat(num) { + return num % 1 !== 0; + }, + approximatelyEqual: function approximatelyEqual(num1, num2) { + return Math.abs(num1 - num2) < 1e-10; + }, + isSameSign: function isSameSign(num1, num2) { + return Math.abs(num1) === num1 && Math.abs(num2) === num2 || Math.abs(num1) !== num1 && Math.abs(num2) !== num2; + }, + isSameXCoordinateArea: function isSameXCoordinateArea(p1, p2) { + return this.isSameSign(p1.x, p2.x); + }, + isCollision: function isCollision(obj1, obj2) { + obj1.end = {}; + obj1.end.x = obj1.start.x + obj1.width; + obj1.end.y = obj1.start.y - obj1.height; + obj2.end = {}; + obj2.end.x = obj2.start.x + obj2.width; + obj2.end.y = obj2.start.y - obj2.height; + var flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y; + return !flag; + } +}; + +//兼容H5点击事件 +function getH5Offset(e) { + e.mp = { + changedTouches: [] + }; + e.mp.changedTouches.push({ + x: e.offsetX, + y: e.offsetY + }); + return e; +} + +// hex 转 rgba +function hexToRgb(hexValue, opc) { + var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + var hex = hexValue.replace(rgx, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + var r = parseInt(rgb[1], 16); + var g = parseInt(rgb[2], 16); + var b = parseInt(rgb[3], 16); + return 'rgba(' + r + ',' + g + ',' + b + ',' + opc + ')'; +} + +function findRange(num, type, limit) { + if (isNaN(num)) { + throw new Error('[uCharts] unvalid series data!'); + } + limit = limit || 10; + type = type ? type : 'upper'; + var multiple = 1; + while (limit < 1) { + limit *= 10; + multiple *= 10; + } + if (type === 'upper') { + num = Math.ceil(num * multiple); + } else { + num = Math.floor(num * multiple); + } + while (num % limit !== 0) { + if (type === 'upper') { + num++; + } else { + num--; + } + } + return num / multiple; +} + +function calCandleMA(dayArr, nameArr, colorArr, kdata) { + let seriesTemp = []; + for (let k = 0; k < dayArr.length; k++) { + let seriesItem = { + data: [], + name: nameArr[k], + color: colorArr[k] + }; + for (let i = 0, len = kdata.length; i < len; i++) { + if (i < dayArr[k]) { + seriesItem.data.push(null); + continue; + } + let sum = 0; + for (let j = 0; j < dayArr[k]; j++) { + sum += kdata[i - j][1]; + } + seriesItem.data.push(+(sum / dayArr[k]).toFixed(3)); + } + seriesTemp.push(seriesItem); + } + return seriesTemp; +} + +function calValidDistance(self,distance, chartData, config, opts) { + var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3]; + var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length-1); + var validDistance = distance; + if (distance >= 0) { + validDistance = 0; + self.event.trigger('scrollLeft'); + } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) { + validDistance = dataChartAreaWidth - dataChartWidth; + self.event.trigger('scrollRight'); + } + return validDistance; +} + +function isInAngleRange(angle, startAngle, endAngle) { + function adjust(angle) { + while (angle < 0) { + angle += 2 * Math.PI; + } + while (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + return angle; + } + angle = adjust(angle); + startAngle = adjust(startAngle); + endAngle = adjust(endAngle); + if (startAngle > endAngle) { + endAngle += 2 * Math.PI; + if (angle < startAngle) { + angle += 2 * Math.PI; + } + } + return angle >= startAngle && angle <= endAngle; +} + +function calRotateTranslate(x, y, h) { + var xv = x; + var yv = h - y; + var transX = xv + (h - yv - xv) / Math.sqrt(2); + transX *= -1; + var transY = (h - yv) * (Math.sqrt(2) - 1) - (h - yv - xv) / Math.sqrt(2); + return { + transX: transX, + transY: transY + }; +} + +function createCurveControlPoints(points, i) { + + function isNotMiddlePoint(points, i) { + if (points[i - 1] && points[i + 1]) { + return points[i].y >= Math.max(points[i - 1].y, points[i + 1].y) || points[i].y <= Math.min(points[i - 1].y, + points[ + i + 1].y); + } else { + return false; + } + } + 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 (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; + } + return { + ctrA: { + x: pAx, + y: pAy + }, + ctrB: { + x: pBx, + y: pBy + } + }; +} + +function convertCoordinateOrigin(x, y, center) { + return { + x: center.x + x, + y: center.y - y + }; +} + +function avoidCollision(obj, target) { + if (target) { + // is collision test + while (util.isCollision(obj, target)) { + if (obj.start.x > 0) { + obj.start.y--; + } else if (obj.start.x < 0) { + obj.start.y++; + } else { + if (obj.start.y > 0) { + obj.start.y++; + } else { + obj.start.y--; + } + } + } + } + return obj; +} + +function fillSeries(series, opts, config) { + var index = 0; + return series.map(function(item) { + if (!item.color) { + item.color = config.colors[index]; + index = (index + 1) % config.colors.length; + } + if (!item.index) { + item.index = 0; + } + if (!item.type) { + item.type = opts.type; + } + if (typeof item.show == "undefined") { + item.show = true; + } + if (!item.type) { + item.type = opts.type; + } + if (!item.pointShape) { + item.pointShape = "circle"; + } + if (!item.legendShape) { + switch (item.type) { + case 'line': + item.legendShape = "line"; + break; + case 'column': + item.legendShape = "rect"; + break; + case 'area': + item.legendShape = "triangle"; + break; + default: + item.legendShape = "circle"; + } + } + return item; + }); +} + +function getDataRange(minData, maxData) { + var limit = 0; + var range = maxData - minData; + if (range >= 10000) { + limit = 1000; + } else if (range >= 1000) { + limit = 100; + } else if (range >= 100) { + limit = 10; + } else if (range >= 10) { + limit = 5; + } else if (range >= 1) { + limit = 1; + } else if (range >= 0.1) { + limit = 0.1; + } else if (range >= 0.01) { + limit = 0.01; + } else if (range >= 0.001) { + limit = 0.001; + } else if (range >= 0.0001) { + limit = 0.0001; + } else if (range >= 0.00001) { + limit = 0.00001; + } else { + limit = 0.000001; + } + return { + minRange: findRange(minData, 'lower', limit), + maxRange: findRange(maxData, 'upper', limit) + }; +} + +function measureText(text) { + var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config.fontSize; + text = String(text); + var text = text.split(''); + var width = 0; + for (let i = 0; i < text.length; i++) { + let item = text[i]; + if (/[a-zA-Z]/.test(item)) { + width += 7; + } else if (/[0-9]/.test(item)) { + width += 5.5; + } else if (/\./.test(item)) { + width += 2.7; + } else if (/-/.test(item)) { + width += 3.25; + } else if (/[\u4e00-\u9fa5]/.test(item)) { + width += 10; + } else if (/\(|\)/.test(item)) { + width += 3.73; + } else if (/\s/.test(item)) { + width += 2.5; + } else if (/%/.test(item)) { + width += 8; + } else { + width += 10; + } + } + return width * fontSize / 10; +} + +function dataCombine(series) { + return series.reduce(function(a, b) { + return (a.data ? a.data : a).concat(b.data); + }, []); +} + +function dataCombineStack(series, len) { + var sum = new Array(len); + for (var j = 0; j < sum.length; j++) { + sum[j] = 0; + } + for (var i = 0; i < series.length; i++) { + for (var j = 0; j < sum.length; j++) { + sum[j] += series[i].data[j]; + } + } + return series.reduce(function(a, b) { + return (a.data ? a.data : a).concat(b.data).concat(sum); + }, []); +} + +function getTouches(touches, opts, e) { + let x, y; + if (touches.clientX) { + if (opts.rotate) { + y = opts.height - touches.clientX * opts.pixelRatio; + x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) * + opts.pixelRatio; + } else { + x = touches.clientX * opts.pixelRatio; + y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) * + opts.pixelRatio; + } + } else { + if (opts.rotate) { + y = opts.height - touches.x * opts.pixelRatio; + x = touches.y * opts.pixelRatio; + } else { + x = touches.x * opts.pixelRatio; + y = touches.y * opts.pixelRatio; + } + } + return { + x: x, + y: y + } +} + +function getSeriesDataItem(series, index) { + var data = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + if (item.data[index] !== null && typeof item.data[index] !== 'undefined' && item.show) { + let seriesItem = {}; + seriesItem.color = item.color; + seriesItem.type = item.type; + seriesItem.style = item.style; + seriesItem.pointShape = item.pointShape; + seriesItem.disableLegend = item.disableLegend; + seriesItem.name = item.name; + seriesItem.show = item.show; + seriesItem.data = item.format ? item.format(item.data[index]) : item.data[index]; + data.push(seriesItem); + } + } + return data; +} + +function getMaxTextListLength(list) { + var lengthList = list.map(function(item) { + return measureText(item); + }); + return Math.max.apply(null, lengthList); +} + +function getRadarCoordinateSeries(length) { + var eachAngle = 2 * Math.PI / length; + var CoordinateSeries = []; + for (var i = 0; i < length; i++) { + CoordinateSeries.push(eachAngle * i); + } + + return CoordinateSeries.map(function(item) { + return -1 * item + Math.PI / 2; + }); +} + +function getToolTipData(seriesData, calPoints, index, categories) { + var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + var textList = seriesData.map(function(item) { + let titleText=[]; + if(categories){ + titleText=categories; + }else{ + titleText=item.data; + } + return { + text: option.format ? option.format(item, titleText[index]) : item.name + ': ' + item.data, + color: item.color + }; + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + for (let i = 0; i < validCalPoints.length; i++) { + let item = validCalPoints[i]; + offset.x = Math.round(item.x); + offset.y += item.y; + } + offset.y /= validCalPoints.length; + return { + textList: textList, + offset: offset + }; +} + +function getMixToolTipData(seriesData, calPoints, index, categories) { + var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + var textList = seriesData.map(function(item) { + return { + text: option.format ? option.format(item, categories[index]) : item.name + ': ' + item.data, + color: item.color, + disableLegend: item.disableLegend ? true : false + }; + }); + textList = textList.filter(function(item) { + if (item.disableLegend !== true) { + return item; + } + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + for (let i = 0; i < validCalPoints.length; i++) { + let item = validCalPoints[i]; + offset.x = Math.round(item.x); + offset.y += item.y; + } + offset.y /= validCalPoints.length; + return { + textList: textList, + offset: offset + }; +} + +function getCandleToolTipData(series, seriesData, calPoints, index, categories, extra) { + var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; + let upColor = extra.color.upFill; + let downColor = extra.color.downFill; + //颜色顺序为开盘,收盘,最低,最高 + let color = [upColor, upColor, downColor, upColor]; + var textList = []; + let text0 = { + text: categories[index], + color: null + }; + textList.push(text0); + seriesData.map(function(item) { + if (index == 0 && item.data[1] - item.data[0] < 0) { + color[1] = downColor; + } else { + if (item.data[0] < series[index - 1][1]) { + color[0] = downColor; + } + if (item.data[1] < item.data[0]) { + color[1] = downColor; + } + if (item.data[2] > series[index - 1][1]) { + color[2] = upColor; + } + if (item.data[3] < series[index - 1][1]) { + color[3] = downColor; + } + } + let text1 = { + text: '开盘:' + item.data[0], + color: color[0] + }; + let text2 = { + text: '收盘:' + item.data[1], + color: color[1] + }; + let text3 = { + text: '最低:' + item.data[2], + color: color[2] + }; + let text4 = { + text: '最高:' + item.data[3], + color: color[3] + }; + textList.push(text1, text2, text3, text4); + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + offset.x = Math.round(validCalPoints[0][0].x); + return { + textList: textList, + offset: offset + }; +} + +function filterSeries(series) { + let tempSeries = []; + for (let i = 0; i < series.length; i++) { + if (series[i].show == true) { + tempSeries.push(series[i]) + } + } + return tempSeries; +} + +function findCurrentIndex(currentPoints, calPoints, opts, config) { + var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var currentIndex = -1; + var spacing = 0; + let xAxisPoints=[]; + for(let i=0;i item) { + currentIndex = index; + } + }); + } + return currentIndex; +} + +function findLegendIndex(currentPoints, legendData, opts) { + let currentIndex = -1; + if (isInExactLegendArea(currentPoints, legendData.area)) { + let points = legendData.points; + let index = -1; + for (let i = 0, len = points.length; i < len; i++) { + let item = points[i]; + for (let j = 0; j < item.length; j++) { + index += 1; + let area = item[j]['area']; + if (currentPoints.x > area[0] && currentPoints.x < area[2] && currentPoints.y > area[1] && currentPoints.y < area[3]) { + currentIndex = index; + break; + } + } + } + return currentIndex; + } + return currentIndex; +} + +function isInExactLegendArea(currentPoints, area) { + return currentPoints.x > area.start.x && currentPoints.x < area.end.x && currentPoints.y > area.start.y && + currentPoints.y < area.end.y; +} + +function isInExactChartArea(currentPoints, opts, config) { + return currentPoints.x <= opts.width - opts.area[1] + 10 && currentPoints.x >= opts.area[3] -10 && currentPoints.y >= opts.area[0] && currentPoints.y <= opts.height - opts.area[2]; +} + +function findRadarChartCurrentIndex(currentPoints, radarData, count) { + var eachAngleArea = 2 * Math.PI / count; + var currentIndex = -1; + if (isInExactPieChartArea(currentPoints, radarData.center, radarData.radius)) { + var fixAngle = function fixAngle(angle) { + if (angle < 0) { + angle += 2 * Math.PI; + } + if (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + return angle; + }; + + var angle = Math.atan2(radarData.center.y - currentPoints.y, currentPoints.x - radarData.center.x); + angle = -1 * angle; + if (angle < 0) { + angle += 2 * Math.PI; + } + + var angleList = radarData.angleList.map(function(item) { + item = fixAngle(-1 * item); + + return item; + }); + + angleList.forEach(function(item, index) { + var rangeStart = fixAngle(item - eachAngleArea / 2); + var rangeEnd = fixAngle(item + eachAngleArea / 2); + if (rangeEnd < rangeStart) { + rangeEnd += 2 * Math.PI; + } + if (angle >= rangeStart && angle <= rangeEnd || angle + 2 * Math.PI >= rangeStart && angle + 2 * Math.PI <= + rangeEnd) { + currentIndex = index; + } + }); + } + + return currentIndex; +} + +function findFunnelChartCurrentIndex(currentPoints, funnelData) { + var currentIndex = -1; + for (var i = 0, len = funnelData.series.length; i < len; i++) { + var item = funnelData.series[i]; + if (currentPoints.x > item.funnelArea[0] && currentPoints.x < item.funnelArea[2] && currentPoints.y > item.funnelArea[1] && currentPoints.y < item.funnelArea[3]) { + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findWordChartCurrentIndex(currentPoints, wordData) { + var currentIndex = -1; + for (var i = 0, len = wordData.length; i < len; i++) { + var item = wordData[i]; + if (currentPoints.x > item.area[0] && currentPoints.x < item.area[2] && currentPoints.y > item.area[1] && currentPoints.y < item.area[3]) { + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findMapChartCurrentIndex(currentPoints, opts) { + var currentIndex = -1; + var cData=opts.chartData.mapData; + var data=opts.series; + var tmp=pointToCoordinate(currentPoints.y, currentPoints.x,cData.bounds,cData.scale,cData.xoffset,cData.yoffset); + var poi=[tmp.x, tmp.y]; + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i].geometry.coordinates; + if(isPoiWithinPoly(poi,item)){ + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findPieChartCurrentIndex(currentPoints, pieData) { + var currentIndex = -1; + if (isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) { + var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x); + angle = -angle; + for (var i = 0, len = pieData.series.length; i < len; i++) { + var item = pieData.series[i]; + if (isInAngleRange(angle, item._start_, item._start_ + item._proportion_ * 2 * Math.PI)) { + currentIndex = i; + break; + } + } + } + + return currentIndex; +} + +function isInExactPieChartArea(currentPoints, center, radius) { + return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2); +} + +function splitPoints(points) { + var newPoints = []; + var items = []; + points.forEach(function(item, index) { + if (item !== null) { + items.push(item); + } else { + if (items.length) { + newPoints.push(items); + } + items = []; + } + }); + if (items.length) { + newPoints.push(items); + } + + return newPoints; +} + +function calLegendData(series, opts, config, chartData) { + let legendData = { + area: { + start: { + x: 0, + y: 0 + }, + end: { + x: 0, + y: 0 + }, + width: 0, + height: 0, + wholeWidth: 0, + wholeHeight: 0 + }, + points: [], + widthArr: [], + heightArr: [] + }; + if (opts.legend.show === false) { + chartData.legendData = legendData; + return legendData; + } + + let padding = opts.legend.padding; + let margin = opts.legend.margin; + let fontSize = opts.legend.fontSize; + let shapeWidth = 15 * opts.pixelRatio; + let shapeRight = 5 * opts.pixelRatio; + let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize); + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + let legendList = []; + let widthCount = 0; + let widthCountArr = []; + let currentRow = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + let itemWidth = shapeWidth + shapeRight + measureText(item.name || 'undefined', fontSize) + opts.legend.itemGap; + if (widthCount + itemWidth > opts.width - opts.padding[1] - opts.padding[3]) { + legendList.push(currentRow); + widthCountArr.push(widthCount - opts.legend.itemGap); + widthCount = itemWidth; + currentRow = [item]; + } else { + widthCount += itemWidth; + currentRow.push(item); + } + } + if (currentRow.length) { + legendList.push(currentRow); + widthCountArr.push(widthCount - opts.legend.itemGap); + legendData.widthArr = widthCountArr; + let legendWidth = Math.max.apply(null, widthCountArr); + switch (opts.legend.float) { + case 'left': + legendData.area.start.x = opts.padding[3]; + legendData.area.end.x = opts.padding[3] + 2 * padding; + break; + case 'right': + legendData.area.start.x = opts.width - opts.padding[1] - legendWidth - 2 * padding; + legendData.area.end.x = opts.width - opts.padding[1]; + break; + default: + legendData.area.start.x = (opts.width - legendWidth) / 2 - padding; + legendData.area.end.x = (opts.width + legendWidth) / 2 + padding; + } + legendData.area.width = legendWidth + 2 * padding; + legendData.area.wholeWidth = legendWidth + 2 * padding; + legendData.area.height = legendList.length * lineHeight + 2 * padding; + legendData.area.wholeHeight = legendList.length * lineHeight + 2 * padding + 2 * margin; + legendData.points = legendList; + } + } else { + let len = series.length; + let maxHeight = opts.height - opts.padding[0] - opts.padding[2] - 2 * margin - 2 * padding; + let maxLength = Math.min(Math.floor(maxHeight / lineHeight), len); + legendData.area.height = maxLength * lineHeight + padding * 2; + legendData.area.wholeHeight = maxLength * lineHeight + padding * 2; + switch (opts.legend.float) { + case 'top': + legendData.area.start.y = opts.padding[0] + margin; + legendData.area.end.y = opts.padding[0] + margin + legendData.area.height; + break; + case 'bottom': + legendData.area.start.y = opts.height - opts.padding[2] - margin - legendData.area.height; + legendData.area.end.y = opts.height - opts.padding[2] - margin; + break; + default: + legendData.area.start.y = (opts.height - legendData.area.height) / 2; + legendData.area.end.y = (opts.height + legendData.area.height) / 2; + } + let lineNum = len % maxLength === 0 ? len / maxLength : Math.floor((len / maxLength) + 1); + let currentRow = []; + for (let i = 0; i < lineNum; i++) { + let temp = series.slice(i * maxLength, i * maxLength + maxLength); + currentRow.push(temp); + } + + legendData.points = currentRow; + + if (currentRow.length) { + for (let i = 0; i < currentRow.length; i++) { + let item = currentRow[i]; + let maxWidth = 0; + for (let j = 0; j < item.length; j++) { + let itemWidth = shapeWidth + shapeRight + measureText(item[j].name || 'undefined', fontSize) + opts.legend.itemGap; + if (itemWidth > maxWidth) { + maxWidth = itemWidth; + } + } + legendData.widthArr.push(maxWidth); + legendData.heightArr.push(item.length * lineHeight + padding * 2); + } + let legendWidth = 0 + for (let i = 0; i < legendData.widthArr.length; i++) { + legendWidth += legendData.widthArr[i]; + } + legendData.area.width = legendWidth - opts.legend.itemGap + 2 * padding; + legendData.area.wholeWidth = legendData.area.width + padding; + } + } + + switch (opts.legend.position) { + case 'top': + legendData.area.start.y = opts.padding[0] + margin; + legendData.area.end.y = opts.padding[0] + margin + legendData.area.height; + break; + case 'bottom': + legendData.area.start.y = opts.height - opts.padding[2] - legendData.area.height - margin; + legendData.area.end.y = opts.height - opts.padding[2] - margin; + break; + case 'left': + legendData.area.start.x = opts.padding[3]; + legendData.area.end.x = opts.padding[3] + legendData.area.width; + break; + case 'right': + legendData.area.start.x = opts.width - opts.padding[1] - legendData.area.width; + legendData.area.end.x = opts.width - opts.padding[1]; + break; + } + chartData.legendData = legendData; + return legendData; +} + +function calCategoriesData(categories, opts, config, eachSpacing) { + var result = { + angle: 0, + xAxisHeight: config.xAxisHeight + }; + var categoriesTextLenth = categories.map(function(item) { + return measureText(item,opts.xAxis.fontSize||config.fontSize); + }); + var maxTextLength = Math.max.apply(this, categoriesTextLenth); + + if (opts.xAxis.rotateLabel == true && maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) { + result.angle = 45 * Math.PI / 180; + result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle); + } + return result; +} + +function getXAxisTextList(series, opts, config) { + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var data = dataCombine(series); + var sorted = []; + // remove null from data + data = data.filter(function(item) { + //return item !== null; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + return item !== null; + } else { + return item.value !== null; + } + } else { + return item !== null; + } + }); + data.map(function(item) { + if (typeof item === 'object') { + if (item.constructor == Array) { + if(opts.type=='candle'){ + item.map(function(subitem) { + sorted.push(subitem); + }) + }else{ + sorted.push(item[0]); + } + } else { + sorted.push(item.value); + } + } else { + sorted.push(item); + } + }) + + var minData = 0; + var maxData = 0; + if (sorted.length > 0) { + minData = Math.min.apply(this, sorted); + maxData = Math.max.apply(this, sorted); + } + //为了兼容v1.9.0之前的项目 + if(index>-1){ + if (typeof opts.xAxis.data[index].min === 'number') { + minData = Math.min(opts.xAxis.data[index].min, minData); + } + if (typeof opts.xAxis.data[index].max === 'number') { + maxData = Math.max(opts.xAxis.data[index].max, maxData); + } + }else{ + if (typeof opts.xAxis.min === 'number') { + minData = Math.min(opts.xAxis.min, minData); + } + if (typeof opts.xAxis.max === 'number') { + maxData = Math.max(opts.xAxis.max, maxData); + } + } + + + if (minData === maxData) { + var rangeSpan = maxData || 10; + maxData += rangeSpan; + } + + var dataRange = getDataRange(minData, maxData); + var minRange = dataRange.minRange; + var maxRange = dataRange.maxRange; + + var range = []; + var eachRange = (maxRange - minRange) / opts.xAxis.splitNumber; + + for (var i = 0; i <= opts.xAxis.splitNumber; i++) { + range.push(minRange + eachRange * i); + } + return range; +} + +function calXAxisData(series, opts, config){ + var result = { + angle: 0, + xAxisHeight: config.xAxisHeight + }; + + result.ranges = getXAxisTextList(series, opts, config); + result.rangesFormat = result.ranges.map(function(item){ + item = opts.xAxis.format? opts.xAxis.format(item):util.toFixed(item, 2); + return item; + }); + var xAxisScaleValues = result.ranges.map(function (item) { + // 如果刻度值是浮点数,则保留两位小数 + item = util.toFixed(item, 2); + // 若有自定义格式则调用自定义的格式化函数 + item = opts.xAxis.format ? opts.xAxis.format(Number(item)) : item; + return item; + }); + + result = Object.assign(result,getXAxisPoints(xAxisScaleValues, opts, config)); + // 计算X轴刻度的属性譬如每个刻度的间隔,刻度的起始点\结束点以及总长 + var eachSpacing = result.eachSpacing; + + var textLength = xAxisScaleValues.map(function (item) { + return measureText(item); + }); + + // get max length of categories text + var maxTextLength = Math.max.apply(this, textLength); + + // 如果刻度值文本内容过长,则将其逆时针旋转45° + if (maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) { + result.angle = 45 * Math.PI / 180; + result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle); + } + + if (opts.xAxis.disabled === true) { + result.xAxisHeight = 0; + } + + return result; +} + +function getRadarDataPoints(angleList, center, radius, series, opts) { + var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; + + var radarOption = opts.extra.radar || {}; + radarOption.max = radarOption.max || 0; + var maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series))); + + var data = []; + for (let i = 0; i < series.length; i++) { + let each = series[i]; + let listItem = {}; + listItem.color = each.color; + listItem.legendShape = each.legendShape; + listItem.pointShape = each.pointShape; + listItem.data = []; + each.data.forEach(function(item, index) { + let tmp = {}; + tmp.angle = angleList[index]; + + tmp.proportion = item / maxData; + tmp.position = convertCoordinateOrigin(radius * tmp.proportion * process * Math.cos(tmp.angle), radius * tmp.proportion * + process * Math.sin(tmp.angle), center); + listItem.data.push(tmp); + }); + + data.push(listItem); + } + + return data; +} + +function getPieDataPoints(series, radius) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + var count = 0; + var _start_ = 0; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + count += item.data; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (count === 0) { + item._proportion_ = 1 / series.length * process; + } else { + item._proportion_ = item.data / count * process; + } + item._radius_ = radius; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item._start_ = _start_; + _start_ += 2 * item._proportion_ * Math.PI; + } + + return series; +} + +function getFunnelDataPoints(series, radius) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + series = series.sort(function(a,b){return parseInt(b.data)-parseInt(a.data);}); + for (let i = 0; i < series.length; i++) { + series[i].radius = series[i].data/series[0].data*radius*process; + series[i]._proportion_ = series[i].data/series[0].data; + } + return series.reverse(); +} + +function getRoseDataPoints(series, type, minRadius, radius) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var count = 0; + var _start_ = 0; + + var dataArr = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + count += item.data; + dataArr.push(item.data); + } + + var minData = Math.min.apply(null, dataArr); + var maxData = Math.max.apply(null, dataArr); + var radiusLength = radius - minRadius; + + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (count === 0 || type == 'area') { + item._proportion_ = item.data / count * process; + item._rose_proportion_ = 1 / series.length * process; + } else { + item._proportion_ = item.data / count * process; + item._rose_proportion_ = item.data / count * process; + } + item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData)); + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item._start_ = _start_; + _start_ += 2 * item._rose_proportion_ * Math.PI; + } + + return series; +} + +function getArcbarDataPoints(series, arcbarOption) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + if (process == 1) { + process = 0.999999; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + let totalAngle; + if (arcbarOption.type == 'circle') { + totalAngle = 2; + } else { + if (arcbarOption.endAngle < arcbarOption.startAngle) { + totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle; + } else{ + totalAngle = arcbarOption.startAngle - arcbarOption.endAngle; + } + } + item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle; + if (item._proportion_ >= 2) { + item._proportion_ = item._proportion_ % 2; + } + } + return series; +} + +function getGaugeAxisPoints(categories, startAngle, endAngle) { + let totalAngle = startAngle - endAngle + 1; + let tempStartAngle = startAngle; + for (let i = 0; i < categories.length; i++) { + categories[i].value = categories[i].value === null ? 0 : categories[i].value; + categories[i]._startAngle_ = tempStartAngle; + categories[i]._endAngle_ = totalAngle * categories[i].value + startAngle; + if (categories[i]._endAngle_ >= 2) { + categories[i]._endAngle_ = categories[i]._endAngle_ % 2; + } + tempStartAngle = categories[i]._endAngle_; + } + return categories; +} + +function getGaugeDataPoints(series, categories, gaugeOption) { + let process = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (gaugeOption.pointer.color == 'auto') { + for (let i = 0; i < categories.length; i++) { + if (item.data <= categories[i].value) { + item.color = categories[i].color; + break; + } + } + } else { + item.color = gaugeOption.pointer.color; + } + let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle; + item._oldAngle_ = gaugeOption.oldAngle; + if (gaugeOption.oldAngle < gaugeOption.endAngle) { + item._oldAngle_ += 2; + } + if (item.data >= gaugeOption.oldData) { + item._proportion_ = (item._endAngle_ - item._oldAngle_) * process + gaugeOption.oldAngle; + } else { + item._proportion_ = item._oldAngle_ - (item._oldAngle_ - item._endAngle_) * process; + } + if (item._proportion_ >= 2) { + item._proportion_ = item._proportion_ % 2; + } + } + return series; +} + +function getPieTextMaxLength(series) { + series = getPieDataPoints(series); + let maxLength = 0; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + let text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + '%'; + maxLength = Math.max(maxLength, measureText(text)); + } + + return maxLength; +} + +function fixColumeData(points, eachSpacing, columnLen, index, config, opts) { + return points.map(function(item) { + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / columnLen); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + if (item.width <= 0) { + item.width = 1; + } + item.x += (index + 0.5 - columnLen / 2) * item.width; + return item; + }); +} + +function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) { + return points.map(function(item) { + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + + if (index > 0) { + item.width -= 2 * border; + } + return item; + }); +} + +function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) { + + return points.map(function(item, indexn) { + + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + return item; + }); +} + +function getXAxisPoints(categories, opts, config) { + var spacingValid = opts.width - opts.area[1] - opts.area[3]; + var dataCount = opts.enableScroll ? Math.min(opts.xAxis.itemCount, categories.length) : categories.length; + if((opts.type=='line' || opts.type=='area') && dataCount>1 && opts.xAxis.boundaryGap=='justify'){ + dataCount -=1; + } + var eachSpacing = spacingValid / dataCount; + + var xAxisPoints = []; + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + categories.forEach(function(item, index) { + xAxisPoints.push(startX + index * eachSpacing); + }); + if(opts.xAxis.boundaryGap !=='justify'){ + if (opts.enableScroll === true) { + xAxisPoints.push(startX + categories.length * eachSpacing); + } else { + xAxisPoints.push(endX); + } + } + return { + xAxisPoints: xAxisPoints, + startX: startX, + endX: endX, + eachSpacing: eachSpacing + }; +} + +function getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) { + var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1; + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var cPoints = []; + item.forEach(function(items, indexs) { + var point = {}; + point.x = xAxisPoints[index] + Math.round(eachSpacing / 2); + var value = items.value || items; + var height = validHeight * (value - minRange) / (maxRange - minRange); + height *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + cPoints.push(point); + }); + points.push(cPoints); + } + }); + + return points; +} + +function getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) { + var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1; + var boundaryGap='center'; + if (opts.type == 'line'||opts.type == 'area'){ + boundaryGap=opts.xAxis.boundaryGap; + } + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + var validWidth = opts.width - opts.area[1] - opts.area[3]; + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var point = {}; + point.color = item.color; + point.x = xAxisPoints[index]; + var value = item; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + let xranges,xminRange,xmaxRange; + xranges = [].concat(opts.chartData.xAxisData.ranges); + + xminRange = xranges.shift(); + xmaxRange = xranges.pop(); + value = item[1]; + point.x = opts.area[3]+ validWidth * (item[0] - xminRange) / (xmaxRange - xminRange); + } else { + value = item.value; + } + } + if(boundaryGap=='center'){ + point.x += Math.round(eachSpacing / 2); + } + var height = validHeight * (value - minRange) / (maxRange - minRange); + height *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + points.push(point); + } + }); + + return points; +} + +function getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) { + var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1; + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var point = {}; + point.color = item.color; + point.x = xAxisPoints[index] + Math.round(eachSpacing / 2); + + if (seriesIndex > 0) { + var value = 0; + for (let i = 0; i <= seriesIndex; i++) { + value += stackSeries[i].data[index]; + } + var value0 = value - item; + var height = validHeight * (value - minRange) / (maxRange - minRange); + var height0 = validHeight * (value0 - minRange) / (maxRange - minRange); + } else { + var value = item; + var height = validHeight * (value - minRange) / (maxRange - minRange); + var height0 = 0; + } + var heightc = height0; + height *= process; + heightc *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + point.y0 = opts.height - Math.round(heightc) - opts.area[2]; + points.push(point); + } + }); + + return points; +} + +function getYAxisTextList(series, opts, config, stack) { + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var data; + if (stack == 'stack') { + data = dataCombineStack(series, opts.categories.length); + } else { + data = dataCombine(series); + } + var sorted = []; + // remove null from data + data = data.filter(function(item) { + //return item !== null; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + return item !== null; + } else { + return item.value !== null; + } + } else { + return item !== null; + } + }); + data.map(function(item) { + if (typeof item === 'object') { + if (item.constructor == Array) { + if(opts.type=='candle'){ + item.map(function(subitem) { + sorted.push(subitem); + }) + }else{ + sorted.push(item[1]); + } + } else { + sorted.push(item.value); + } + } else { + sorted.push(item); + } + }) + + var minData = 0; + var maxData = 0; + if (sorted.length > 0) { + minData = Math.min.apply(this, sorted); + maxData = Math.max.apply(this, sorted); + } + //为了兼容v1.9.0之前的项目 + if(index>-1){ + if (typeof opts.yAxis.data[index].min === 'number') { + minData = Math.min(opts.yAxis.data[index].min, minData); + } + if (typeof opts.yAxis.data[index].max === 'number') { + maxData = Math.max(opts.yAxis.data[index].max, maxData); + } + }else{ + if (typeof opts.yAxis.min === 'number') { + minData = Math.min(opts.yAxis.min, minData); + } + if (typeof opts.yAxis.max === 'number') { + maxData = Math.max(opts.yAxis.max, maxData); + } + } + + + if (minData === maxData) { + var rangeSpan = maxData || 10; + maxData += rangeSpan; + } + + var dataRange = getDataRange(minData, maxData); + var minRange = dataRange.minRange; + var maxRange = dataRange.maxRange; + + var range = []; + var eachRange = (maxRange - minRange) / opts.yAxis.splitNumber; + + for (var i = 0; i <= opts.yAxis.splitNumber; i++) { + range.push(minRange + eachRange * i); + } + return range.reverse(); +} + +function calYAxisData(series, opts, config) { + //堆叠图重算Y轴 + var columnstyle = assign({}, { + type: "" + }, opts.extra.column); + //如果是多Y轴,重新计算 + var YLength = opts.yAxis.data.length; + var newSeries=new Array(YLength); + if(YLength>0){ + for(let i=0;i= 2) { + nowAngle = nowAngle % 2; + } + nowNumber += splitNumber; + } + +} + +function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) { + var radarOption = opts.extra.radar || {}; + radius += config.radarLabelTextMargin; + + angleList.forEach(function(angle, index) { + var pos = { + x: radius * Math.cos(angle), + y: radius * Math.sin(angle) + }; + var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition); + var startX = posRelativeCanvas.x; + var startY = posRelativeCanvas.y; + if (util.approximatelyEqual(pos.x, 0)) { + startX -= measureText(opts.categories[index] || '') / 2; + } else if (pos.x < 0) { + startX -= measureText(opts.categories[index] || ''); + } + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(radarOption.labelColor || '#666666'); + context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2); + context.closePath(); + context.stroke(); + }); + +} + +function drawPieText(series, opts, config, context, radius, center) { + var lineRadius = config.pieChartLinePadding; + var textObjectCollection = []; + var lastTextObject = null; + + var seriesConvert = series.map(function(item) { + var text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_.toFixed(4) * 100) +'%'; + if(item._rose_proportion_) item._proportion_=item._rose_proportion_; + var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2); + var color = item.color; + var radius = item._radius_; + return { + arc: arc, + text: text, + color: color, + radius: radius, + textColor: item.textColor, + textSize: item.textSize, + }; + }); + for (let i = 0; i < seriesConvert.length; i++) { + let item = seriesConvert[i]; + // line end + let orginX1 = Math.cos(item.arc) * (item.radius + lineRadius); + let orginY1 = Math.sin(item.arc) * (item.radius + lineRadius); + + // line start + let orginX2 = Math.cos(item.arc) * item.radius; + let orginY2 = Math.sin(item.arc) * item.radius; + + // text start + let orginX3 = orginX1 >= 0 ? orginX1 + config.pieChartTextPadding : orginX1 - config.pieChartTextPadding; + let orginY3 = orginY1; + let textWidth = measureText(item.text,item.textSize||config.fontSize); + let startY = orginY3; + + if (lastTextObject && util.isSameXCoordinateArea(lastTextObject.start, { + x: orginX3 + })) { + if (orginX3 > 0) { + startY = Math.min(orginY3, lastTextObject.start.y); + } else if (orginX1 < 0) { + startY = Math.max(orginY3, lastTextObject.start.y); + } else { + if (orginY3 > 0) { + startY = Math.max(orginY3, lastTextObject.start.y); + } else { + startY = Math.min(orginY3, lastTextObject.start.y); + } + } + } + if (orginX3 < 0) { + orginX3 -= textWidth; + } + + let textObject = { + lineStart: { + x: orginX2, + y: orginY2 + }, + lineEnd: { + x: orginX1, + y: orginY1 + }, + start: { + x: orginX3, + y: startY + }, + width: textWidth, + height: config.fontSize, + text: item.text, + color: item.color, + textColor: item.textColor, + textSize: item.textSize + }; + lastTextObject = avoidCollision(textObject, lastTextObject); + textObjectCollection.push(lastTextObject); + } + + for (let i = 0; i < textObjectCollection.length; i++) { + let item = textObjectCollection[i]; + let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center); + let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center); + let textPosition = convertCoordinateOrigin(item.start.x, item.start.y, center); + context.setLineWidth(1 * opts.pixelRatio); + context.setFontSize(config.fontSize); + context.beginPath(); + context.setStrokeStyle(item.color); + context.setFillStyle(item.color); + context.moveTo(lineStartPoistion.x, lineStartPoistion.y); + let curveStartX = item.start.x < 0 ? textPosition.x + item.width : textPosition.x; + let textStartX = item.start.x < 0 ? textPosition.x - 5 : textPosition.x + 5; + context.quadraticCurveTo(lineEndPoistion.x, lineEndPoistion.y, curveStartX, textPosition.y); + context.moveTo(lineStartPoistion.x, lineStartPoistion.y); + context.stroke(); + context.closePath(); + context.beginPath(); + context.moveTo(textPosition.x + item.width, textPosition.y); + context.arc(curveStartX, textPosition.y, 2, 0, 2 * Math.PI); + context.closePath(); + context.fill(); + context.beginPath(); + context.setFontSize(item.textSize || config.fontSize); + context.setFillStyle(item.textColor || '#666666'); + context.fillText(item.text, textStartX, textPosition.y + 3); + context.closePath(); + context.stroke(); + context.closePath(); + } +} + +function drawToolTipSplitLine(offsetX, opts, config, context) { + var toolTipOption = opts.extra.tooltip || {}; + toolTipOption.gridType = toolTipOption.gridType == undefined ? 'solid' : toolTipOption.gridType; + toolTipOption.dashLength = toolTipOption.dashLength == undefined ? 4 : toolTipOption.dashLength; + var startY = opts.area[0]; + var endY = opts.height - opts.area[2]; + + if (toolTipOption.gridType == 'dash') { + context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]); + } + context.setStrokeStyle(toolTipOption.gridColor || '#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(offsetX, startY); + context.lineTo(offsetX, endY); + context.stroke(); + context.setLineDash([]); + + if (toolTipOption.xAxisLabel) { + let labelText = opts.categories[opts.tooltip.index]; + context.setFontSize(config.fontSize); + let textWidth = measureText(labelText, config.fontSize); + + let textX = offsetX - 0.5 * textWidth; + let textY = endY; + context.beginPath(); + context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity)); + context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground); + context.setLineWidth(1 * opts.pixelRatio); + context.rect(textX - config.toolTipPadding, textY, textWidth + 2 * config.toolTipPadding, config.fontSize + 2 * config.toolTipPadding); + context.closePath(); + context.stroke(); + context.fill(); + + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(toolTipOption.labelFontColor || config.fontColor); + context.fillText(String(labelText), textX, textY + config.toolTipPadding + config.fontSize); + context.closePath(); + context.stroke(); + } +} + +function drawMarkLine(opts, config, context) { + let markLineOption = assign({}, { + type: 'solid', + dashLength: 4, + data: [] + }, opts.extra.markLine); + let startX = opts.area[3]; + let endX = opts.width - opts.area[1]; + let points = calMarkLineData(markLineOption.data, opts); + + for (let i = 0; i < points.length; i++) { + let item = assign({}, { + lineColor: '#DE4A42', + showLabel: false, + labelFontColor: '#666666', + labelBgColor: '#DFE8FF', + labelBgOpacity: 0.8, + yAxisIndex: 0 + }, points[i]); + + if (markLineOption.type == 'dash') { + context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]); + } + context.setStrokeStyle(item.lineColor); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(startX, item.y); + context.lineTo(endX, item.y); + context.stroke(); + context.setLineDash([]); + if (item.showLabel) { + let labelText = opts.yAxis.format ? opts.yAxis.format(Number(item.value)) : item.value; + context.setFontSize(config.fontSize); + let textWidth = measureText(labelText, config.fontSize); + let bgStartX = opts.padding[3] + config.yAxisTitleWidth - config.toolTipPadding; + let bgEndX = Math.max(opts.area[3], textWidth + config.toolTipPadding * 2); + let bgWidth = bgEndX - bgStartX; + + let textX = bgStartX + (bgWidth - textWidth) / 2; + let textY = item.y; + context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity)); + context.setStrokeStyle(item.labelBgColor); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding); + context.closePath(); + context.stroke(); + context.fill(); + + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(item.labelFontColor); + context.fillText(String(labelText), textX, textY + 0.5 * config.fontSize); + context.stroke(); + } + } +} + +function drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) { + var toolTipOption = assign({}, { + gridType: 'solid', + dashLength: 4 + }, opts.extra.tooltip); + + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + + if (toolTipOption.gridType == 'dash') { + context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]); + } + context.setStrokeStyle(toolTipOption.gridColor || '#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(startX, opts.tooltip.offset.y); + context.lineTo(endX, opts.tooltip.offset.y); + context.stroke(); + context.setLineDash([]); + + if (toolTipOption.yAxisLabel) { + let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing); + let widthArr = opts.chartData.yAxisData.yAxisWidth; + let tStartLeft=opts.area[3]; + let tStartRight=opts.width-opts.area[1]; + for(let i=0;i opts.width) { + isOverRightBorder = true; + } + if (toolTipHeight + offset.y > opts.height) { + offset.y = opts.height - toolTipHeight; + } + // draw background rect + context.beginPath(); + context.setFillStyle(hexToRgb(toolTipOption.bgColor || config.toolTipBackground, toolTipOption.bgOpacity || config.toolTipOpacity)); + if (isOverRightBorder) { + context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio); + context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio); + context.lineTo(offset.x - arrowWidth, offset.y); + context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y); + context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y + toolTipHeight); + context.lineTo(offset.x - arrowWidth, offset.y + toolTipHeight); + context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio); + context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio); + } else { + context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio); + context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio); + context.lineTo(offset.x + arrowWidth, offset.y); + context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y); + context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y + toolTipHeight); + context.lineTo(offset.x + arrowWidth, offset.y + toolTipHeight); + context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio); + context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio); + } + + context.closePath(); + context.fill(); + + // draw legend + textList.forEach(function(item, index) { + if (item.color !== null) { + context.beginPath(); + context.setFillStyle(item.color); + var startX = offset.x + arrowWidth + 2 * config.toolTipPadding; + var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + + config.toolTipPadding + 1; + if (isOverRightBorder) { + startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding; + } + context.fillRect(startX, startY, legendWidth, config.fontSize); + context.closePath(); + } + }); + + // draw text list + + textList.forEach(function(item, index) { + var startX = offset.x + arrowWidth + 2 * config.toolTipPadding + legendWidth + legendMarginRight; + if (isOverRightBorder) { + startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding + +legendWidth + legendMarginRight; + } + var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + + config.toolTipPadding; + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(toolTipOption.fontColor); + context.fillText(item.text, startX, startY + config.fontSize); + context.closePath(); + context.stroke(); + }); +} + +function drawYAxisTitle(title, opts, config, context) { + var startX = config.xAxisHeight + (opts.height - config.xAxisHeight - measureText(title)) / 2; + context.save(); + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(opts.yAxis.titleFontColor || '#333333'); + context.translate(0, opts.height); + context.rotate(-90 * Math.PI / 180); + context.fillText(title, startX, opts.padding[3] + 0.5 * config.fontSize); + context.closePath(); + context.stroke(); + context.restore(); +} + +function drawColumnDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + let columnOption = assign({}, { + type: 'group', + width: eachSpacing / 2, + meter: { + border: 4, + fillColor: '#FFFFFF' + } + }, opts.extra.column); + + let calPoints = []; + context.save(); + + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + } + if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) { + drawToolTipSplitArea(opts.tooltip.offset.x, opts, config, context, eachSpacing); + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + switch (columnOption.type) { + case 'group': + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + var tooltipPoints = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process); + calPoints.push(tooltipPoints); + points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts); + for(let i=0;ileftNum && ileftNum && i 0) { + height -= height0; + } + context.moveTo(startX, item.y); + context.fillRect(startX, item.y, item.width - 2, height); + context.closePath(); + context.fill(); + } + }; + break; + case 'meter': + // 绘制温度计数据图 + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meter.border); + if (seriesIndex == 0) { + for(let i=0;ileftNum && i 0) { + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(columnOption.meter.border * opts.pixelRatio); + context.moveTo(startX + columnOption.meter.border * 0.5, item.y + height); + context.lineTo(startX + columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5); + context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5); + context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + height); + context.stroke(); + } + } + }; + } else { + for(let i=0;ileftNum && i 5 && arguments[5] !== undefined ? arguments[5] : 1; + var candleOption = assign({}, { + color: {}, + average: {} + }, opts.extra.candle); + candleOption.color = assign({}, { + upLine: '#f04864', + upFill: '#f04864', + downLine: '#2fc25b', + downFill: '#2fc25b' + }, candleOption.color); + candleOption.average = assign({}, { + show: false, + name: [], + day: [], + color: config.colors + }, candleOption.average); + opts.extra.candle = candleOption; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let calPoints = []; + + context.save(); + + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + //画均线 + if (candleOption.average.show) { + seriesMA.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + var splitPointList = splitPoints(points); + + for(let i=0;i leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + } + context.moveTo(points[0].x, points[0].y); + } + context.closePath(); + context.stroke(); + } + }); + } + //画K线 + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + var splitPointList = splitPoints(points); + + for(let i=0;ileftNum && i 0) { + context.setStrokeStyle(candleOption.color.upLine); + context.setFillStyle(candleOption.color.upFill); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(item[3].x, item[3].y); //顶点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点 + context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[2].x, item[2].y); //底点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点 + context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.moveTo(item[3].x, item[3].y); //顶点 + } else { + context.setStrokeStyle(candleOption.color.downLine); + context.setFillStyle(candleOption.color.downFill); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(item[3].x, item[3].y); //顶点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点 + context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[2].x, item[2].y); //底点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点 + context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.moveTo(item[3].x, item[3].y); //顶点 + } + context.closePath(); + context.fill(); + context.stroke(); + } + } + }); + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawAreaDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var areaOption = assign({},{ + type: 'straight', + opacity: 0.2, + addLine: false, + width: 2, + gradient:false + },opts.extra.area); + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let endY = opts.height - opts.area[2]; + let calPoints = []; + + context.save(); + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + let data = eachSeries.data; + let points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + + let splitPointList = splitPoints(points); + for (let i = 0; i < splitPointList.length; i++) { + let points = splitPointList[i]; + // 绘制区域数 + context.beginPath(); + context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity)); + if(areaOption.gradient){ + let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height-opts.area[2]); + gradient.addColorStop('0', hexToRgb(eachSeries.color, areaOption.opacity)); + gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1)); + context.setFillStyle(gradient); + }else{ + context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity)); + } + context.setLineWidth(areaOption.width * opts.pixelRatio); + if (points.length > 1) { + let firstPoint = points[0]; + let lastPoint = points[points.length - 1]; + context.moveTo(firstPoint.x, firstPoint.y); + let startPoint=0; + if (areaOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + let ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + + context.lineTo(lastPoint.x, endY); + context.lineTo(firstPoint.x, endY); + context.lineTo(firstPoint.x, firstPoint.y); + } else { + let item = points[0]; + context.moveTo(item.x - eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, endY); + context.lineTo(item.x - eachSpacing / 2, endY); + context.moveTo(item.x - eachSpacing / 2, item.y); + } + context.closePath(); + context.fill(); + + //画连线 + if (areaOption.addLine) { + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(areaOption.width * opts.pixelRatio); + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (areaOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + let ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.moveTo(points[0].x, points[0].y); + } + context.stroke(); + context.setLineDash([]); + } + } + + //画点 + if (opts.dataPointShape !== false) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + + }); + + if (opts.dataLabel !== false && process === 1) { + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + drawPointText(points, eachSeries, config, context); + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawLineDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var lineOption = assign({},{ + type: 'straight', + width: 2 + },opts.extra.line); + lineOption.width *=opts.pixelRatio; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + var calPoints = []; + + context.save(); + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + var splitPointList = splitPoints(points); + + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(lineOption.width); + + splitPointList.forEach(function(points, index) { + + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (lineOption.type === 'curve') { + for(let j=0;j 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 leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.moveTo(points[0].x, points[0].y); + } + + }); + + context.stroke(); + context.setLineDash([]); + + if (opts.dataPointShape !== false) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + + if (opts.dataLabel !== false && process === 1) { + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + drawPointText(points, eachSeries, config, context); + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawMixDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let endY = opts.height - opts.area[2]; + let calPoints = []; + + var columnIndex = 0; + var columnLength = 0; + series.forEach(function(eachSeries, seriesIndex) { + if (eachSeries.type == 'column') { + columnLength += 1; + } + }); + context.save(); + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + + // 绘制柱状数据图 + if (eachSeries.type == 'column') { + points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts); + for(let i=0;ileftNum && i 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 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 leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.lineTo(lastPoint.x, endY); + context.lineTo(firstPoint.x, endY); + context.lineTo(firstPoint.x, firstPoint.y); + } else { + let item = points[0]; + context.moveTo(item.x - eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, endY); + context.lineTo(item.x - eachSpacing / 2, endY); + context.moveTo(item.x - eachSpacing / 2, item.y); + } + context.closePath(); + context.fill(); + } + } + + // 绘制折线数据图 + if (eachSeries.type == 'line') { + var splitPointList = splitPoints(points); + splitPointList.forEach(function(points, index) { + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(2 * opts.pixelRatio); + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (eachSeries.style == 'curve') { + for(let j=0;j 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 leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + } + } + context.moveTo(points[0].x, points[0].y); + } + context.stroke(); + context.setLineDash([]); + }); + } + + // 绘制点数据图 + if (eachSeries.type == 'point') { + eachSeries.addPoint = true; + } + + if (eachSeries.addPoint == true && eachSeries.type !== 'column' ) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + if (opts.dataLabel !== false && process === 1) { + var columnIndex = 0; + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + if (eachSeries.type !== 'column') { + drawPointText(points, eachSeries, config, context); + } else { + points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts); + drawPointText(points, eachSeries, config, context); + columnIndex += 1; + } + + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing, + } +} + +function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) { + var toolTipOption = opts.extra.tooltip || {}; + if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'candle' || opts.type == 'mix')) { + drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) + } + context.save(); + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + } + if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) { + drawToolTip(opts.tooltip.textList, opts.tooltip.offset, opts, config, context, eachSpacing, xAxisPoints); + } + context.restore(); + +} + +function drawXAxis(categories, opts, config, context) { + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + startX = xAxisData.startX, + endX = xAxisData.endX, + eachSpacing = xAxisData.eachSpacing; + var boundaryGap='center'; + if (opts.type == 'line'||opts.type == 'area'){ + boundaryGap=opts.xAxis.boundaryGap; + } + var startY = opts.height - opts.area[2]; + var endY = opts.area[0]; + + //绘制滚动条 + if (opts.enableScroll && opts.xAxis.scrollShow) { + var scrollY = opts.height - opts.area[2] + config.xAxisHeight; + var scrollScreenWidth = endX - startX; + var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1); + var scrollWidth = scrollScreenWidth * scrollScreenWidth / scrollTotalWidth; + var scrollLeft = 0; + if (opts._scrollDistance_) { + scrollLeft = -opts._scrollDistance_ * (scrollScreenWidth) / scrollTotalWidth; + } + context.beginPath(); + context.setLineCap('round'); + context.setLineWidth(6 * opts.pixelRatio); + context.setStrokeStyle(opts.xAxis.scrollBackgroundColor || "#EFEBEF"); + context.moveTo(startX, scrollY); + context.lineTo(endX, scrollY); + context.stroke(); + context.closePath(); + context.beginPath(); + context.setLineCap('round'); + context.setLineWidth(6 * opts.pixelRatio); + context.setStrokeStyle(opts.xAxis.scrollColor || "#A6A6A6"); + context.moveTo(startX + scrollLeft, scrollY); + context.lineTo(startX + scrollLeft + scrollWidth, scrollY); + context.stroke(); + context.closePath(); + context.setLineCap('butt'); + } + + context.save(); + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) { + context.translate(opts._scrollDistance_, 0); + } + + //绘制X轴刻度线 + if (opts.xAxis.calibration === true) { + context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc"); + context.setLineCap('butt'); + context.setLineWidth(1 * opts.pixelRatio); + xAxisPoints.forEach(function(item, index) { + if (index > 0) { + context.beginPath(); + context.moveTo(item - eachSpacing / 2, startY); + context.lineTo(item - eachSpacing / 2, startY + 3 * opts.pixelRatio); + context.closePath(); + context.stroke(); + } + }); + } + //绘制X轴网格 + if (opts.xAxis.disableGrid !== true) { + context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc"); + context.setLineCap('butt'); + context.setLineWidth(1 * opts.pixelRatio); + if (opts.xAxis.gridType == 'dash') { + context.setLineDash([opts.xAxis.dashLength, opts.xAxis.dashLength]); + } + opts.xAxis.gridEval = opts.xAxis.gridEval || 1; + xAxisPoints.forEach(function(item, index) { + if (index % opts.xAxis.gridEval == 0) { + context.beginPath(); + context.moveTo(item, startY); + context.lineTo(item, endY); + context.stroke(); + } + }); + context.setLineDash([]); + } + + + //绘制X轴文案 + if (opts.xAxis.disabled !== true) { + // 对X轴列表做抽稀处理 + //默认全部显示X轴标签 + let maxXAxisListLength = categories.length; + //如果设置了X轴单屏数量 + if (opts.xAxis.labelCount) { + //如果设置X轴密度 + if (opts.xAxis.itemCount) { + maxXAxisListLength = Math.ceil(categories.length / opts.xAxis.itemCount * opts.xAxis.labelCount); + } else { + maxXAxisListLength = opts.xAxis.labelCount; + } + maxXAxisListLength -= 1; + } + + let ratio = Math.ceil(categories.length / maxXAxisListLength); + + let newCategories = []; + let cgLength = categories.length; + for (let i = 0; i < cgLength; i++) { + if (i % ratio !== 0) { + newCategories.push(""); + } else { + newCategories.push(categories[i]); + } + } + newCategories[cgLength - 1] = categories[cgLength - 1]; + + var xAxisFontSize = opts.xAxis.fontSize || config.fontSize; + if (config._xAxisTextAngle_ === 0) { + newCategories.forEach(function(item, index) { + var offset = - measureText(String(item), xAxisFontSize) / 2; + if(boundaryGap == 'center'){ + offset+=eachSpacing / 2; + } + var scrollHeight=0; + if(opts.xAxis.scrollShow){ + scrollHeight=6*opts.pixelRatio; + } + context.beginPath(); + context.setFontSize(xAxisFontSize); + context.setFillStyle(opts.xAxis.fontColor || '#666666'); + context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - scrollHeight - xAxisFontSize) / 2); + context.closePath(); + context.stroke(); + }); + + } else { + newCategories.forEach(function(item, index) { + context.save(); + context.beginPath(); + context.setFontSize(xAxisFontSize); + context.setFillStyle(opts.xAxis.fontColor || '#666666'); + var textWidth = measureText(String(item),xAxisFontSize); + var offset = - textWidth; + if(boundaryGap == 'center'){ + offset+=eachSpacing / 2; + } + var _calRotateTranslate = calRotateTranslate(xAxisPoints[index] + eachSpacing / 2, startY + xAxisFontSize / 2 + 5, opts.height), + transX = _calRotateTranslate.transX, + transY = _calRotateTranslate.transY; + + context.rotate(-1 * config._xAxisTextAngle_); + context.translate(transX, transY); + context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + 5); + context.closePath(); + context.stroke(); + context.restore(); + }); + } + } + context.restore(); + + //绘制X轴轴线 + if(opts.xAxis.axisLine){ + context.beginPath(); + context.setStrokeStyle(opts.xAxis.axisLineColor); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(startX,opts.height-opts.area[2]); + context.lineTo(endX,opts.height-opts.area[2]); + context.stroke(); + } +} + +function drawYAxisGrid(categories, opts, config, context) { + if (opts.yAxis.disableGrid === true) { + return; + } + let spacingValid = opts.height - opts.area[0] - opts.area[2]; + let eachSpacing = spacingValid / opts.yAxis.splitNumber; + let startX = opts.area[3]; + let xAxisPoints = opts.chartData.xAxisData.xAxisPoints, + xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing; + let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1); + let endX = startX + TotalWidth; + + let points = []; + for (let i = 0; i < opts.yAxis.splitNumber + 1; i++) { + points.push(opts.height - opts.area[2] - eachSpacing * i); + } + + context.save(); + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) { + context.translate(opts._scrollDistance_, 0); + } + + if (opts.yAxis.gridType == 'dash') { + context.setLineDash([opts.yAxis.dashLength, opts.yAxis.dashLength]); + } + context.setStrokeStyle(opts.yAxis.gridColor); + context.setLineWidth(1 * opts.pixelRatio); + points.forEach(function(item, index) { + context.beginPath(); + context.moveTo(startX, item); + context.lineTo(endX, item); + context.stroke(); + }); + context.setLineDash([]); + + context.restore(); +} + +function drawYAxis(series, opts, config, context) { + if (opts.yAxis.disabled === true) { + return; + } + var spacingValid = opts.height - opts.area[0] - opts.area[2]; + var eachSpacing = spacingValid / opts.yAxis.splitNumber; + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + var endY = opts.height - opts.area[2]; + var fillEndY = endY + config.xAxisHeight; + if (opts.xAxis.scrollShow) { + fillEndY -= 3 * opts.pixelRatio; + } + if (opts.xAxis.rotateLabel){ + fillEndY = opts.height - opts.area[2]+3; + } + // set YAxis background + context.beginPath(); + context.setFillStyle(opts.background || '#ffffff'); + if (opts._scrollDistance_ < 0) { + context.fillRect(0, 0, startX, fillEndY); + } + if(opts.enableScroll == true){ + context.fillRect(endX, 0, opts.width, fillEndY); + } + context.closePath(); + context.stroke(); + + var points = []; + for (let i = 0; i <= opts.yAxis.splitNumber; i++) { + points.push(opts.area[0] + eachSpacing * i); + } + + let tStartLeft=opts.area[3]; + let tStartRight=opts.width-opts.area[1]; + + for (let i = 0; i < opts.yAxis.data.length; i++) { + let yData = opts.yAxis.data[i]; + if(yData.disabled !== true){ + let rangesFormat = opts.chartData.yAxisData.rangesFormat[i]; + let yAxisFontSize = yData.fontSize || config.fontSize; + let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[i]; + //画Y轴刻度及文案 + rangesFormat.forEach(function(item, index) { + var pos = points[index] ? points[index] : endY; + context.beginPath(); + context.setFontSize(yAxisFontSize); + context.setLineWidth(1*opts.pixelRatio); + context.setStrokeStyle(yData.axisLineColor||'#cccccc'); + context.setFillStyle(yData.fontColor|| '#666666'); + if(yAxisWidth.position=='left'){ + context.fillText(String(item), tStartLeft - yAxisWidth.width , pos + yAxisFontSize / 2); + //画刻度线 + if(yData.calibration==true){ + context.moveTo(tStartLeft,pos); + context.lineTo(tStartLeft - 3*opts.pixelRatio,pos); + } + }else{ + context.fillText(String(item), tStartRight + 4*opts.pixelRatio, pos + yAxisFontSize / 2); + //画刻度线 + if(yData.calibration==true){ + context.moveTo(tStartRight,pos); + context.lineTo(tStartRight + 3*opts.pixelRatio,pos); + } + } + context.closePath(); + context.stroke(); + }); + //画Y轴轴线 + if (yData.axisLine!==false) { + context.beginPath(); + context.setStrokeStyle(yData.axisLineColor||'#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + if(yAxisWidth.position=='left'){ + context.moveTo(tStartLeft,opts.height-opts.area[2]); + context.lineTo(tStartLeft,opts.area[0]); + }else{ + context.moveTo(tStartRight,opts.height-opts.area[2]); + context.lineTo(tStartRight,opts.area[0]); + } + context.stroke(); + } + + //画Y轴标题 + if (opts.yAxis.showTitle) { + + let titleFontSize = yData.titleFontSize || config.fontSize; + let title = yData.title; + context.beginPath(); + context.setFontSize(titleFontSize); + context.setFillStyle(yData.titleFontColor || '#666666'); + if(yAxisWidth.position=='left'){ + context.fillText(title, tStartLeft - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio); + }else{ + context.fillText(title,tStartRight - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio); + } + context.closePath(); + context.stroke(); + } + if(yAxisWidth.position=='left'){ + tStartLeft -=(yAxisWidth.width + opts.yAxis.padding); + }else{ + tStartRight +=yAxisWidth.width+ opts.yAxis.padding; + } + } + } +} + +function drawLegend(series, opts, config, context, chartData) { + if (opts.legend.show === false) { + return; + } + let legendData = chartData.legendData; + let legendList = legendData.points; + let legendArea = legendData.area; + let padding = opts.legend.padding; + let fontSize = opts.legend.fontSize; + let shapeWidth = 15 * opts.pixelRatio; + let shapeRight = 5 * opts.pixelRatio; + let itemGap = opts.legend.itemGap; + let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize); + + //画背景及边框 + context.beginPath(); + context.setLineWidth(opts.legend.borderWidth); + context.setStrokeStyle(opts.legend.borderColor); + context.setFillStyle(opts.legend.backgroundColor); + context.moveTo(legendArea.start.x, legendArea.start.y); + context.rect(legendArea.start.x, legendArea.start.y, legendArea.width, legendArea.height); + context.closePath(); + context.fill(); + context.stroke(); + + legendList.forEach(function(itemList, listIndex) { + let width = 0; + let height = 0; + width = legendData.widthArr[listIndex]; + height = legendData.heightArr[listIndex]; + let startX = 0; + let startY = 0; + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + startX = legendArea.start.x + (legendArea.width - width) / 2; + startY = legendArea.start.y + padding + listIndex * lineHeight; + } else { + if (listIndex == 0) { + width = 0; + } else { + width = legendData.widthArr[listIndex - 1]; + } + startX = legendArea.start.x + padding + width; + startY = legendArea.start.y + padding + (legendArea.height - height) / 2; + } + + context.setFontSize(config.fontSize); + for (let i = 0; i < itemList.length; i++) { + let item = itemList[i]; + item.area = [0, 0, 0, 0]; + item.area[0] = startX; + item.area[1] = startY; + item.area[3] = startY + lineHeight; + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(item.show ? item.color : opts.legend.hiddenColor); + context.setFillStyle(item.show ? item.color : opts.legend.hiddenColor); + switch (item.legendShape) { + case 'line': + context.moveTo(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio, 15 * opts.pixelRatio, 4 * opts.pixelRatio); + break; + case 'triangle': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + break; + case 'diamond': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + break; + case 'circle': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.arc(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight, 5 * opts.pixelRatio, 0, 2 * Math.PI); + break; + case 'rect': + context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio); + break; + default: + context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio); + } + context.closePath(); + context.fill(); + context.stroke(); + + startX += shapeWidth + shapeRight; + let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2; + context.beginPath(); + context.setFontSize(fontSize); + context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor); + context.fillText(item.name, startX, startY + fontTrans); + context.closePath(); + context.stroke(); + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + startX += measureText(item.name, fontSize) + itemGap; + item.area[2] = startX; + } else { + item.area[2] = startX + measureText(item.name, fontSize) + itemGap;; + startX -= shapeWidth + shapeRight; + startY += lineHeight; + } + } + }); +} + +function drawPieDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var pieOption = assign({}, { + activeOpacity: 0.5, + activeRadius: 10 * opts.pixelRatio, + offsetAngle: 0, + labelWidth: 15 * opts.pixelRatio, + ringWidth: 0, + border:false, + borderWidth:2, + borderColor:'#FFFFFF' + }, opts.extra.pie); + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + if (config.pieChartLinePadding == 0) { + config.pieChartLinePadding = pieOption.activeRadius; + } + + var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding); + + series = getPieDataPoints(series, radius, process); + + var activeRadius = pieOption.activeRadius; + + series = series.map(function(eachSeries) { + eachSeries._start_ += (pieOption.offsetAngle) * Math.PI / 180; + return eachSeries; + }); + series.forEach(function(eachSeries, seriesIndex) { + if (opts.tooltip) { + if (opts.tooltip.index == seriesIndex) { + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, opts.extra.pie.activeOpacity || 0.5)); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_ + activeRadius, eachSeries._start_, + eachSeries._start_ + 2 * + eachSeries._proportion_ * Math.PI); + context.closePath(); + context.fill(); + } + } + context.beginPath(); + context.setLineWidth(pieOption.borderWidth * opts.pixelRatio); + context.lineJoin = "round"; + context.setStrokeStyle(pieOption.borderColor); + context.setFillStyle(eachSeries.color); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI); + context.closePath(); + context.fill(); + if (pieOption.border == true) { + context.stroke(); + } + }); + + if (opts.type === 'ring') { + var innerPieWidth = radius * 0.6; + if (typeof opts.extra.pie.ringWidth === 'number' && opts.extra.pie.ringWidth > 0) { + innerPieWidth = Math.max(0, radius - opts.extra.pie.ringWidth); + } + context.beginPath(); + context.setFillStyle(opts.background || '#ffffff'); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, innerPieWidth, 0, 2 * Math.PI); + context.closePath(); + context.fill(); + } + + if (opts.dataLabel !== false && process === 1) { + var valid = false; + for (var i = 0, len = series.length; i < len; i++) { + if (series[i].data > 0) { + valid = true; + break; + } + } + + if (valid) { + drawPieText(series, opts, config, context, radius, centerPosition); + } + } + + if (process === 1 && opts.type === 'ring') { + drawRingTitle(opts, config, context, centerPosition); + } + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawRoseDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var roseOption = assign({}, { + type: 'area', + activeOpacity: 0.5, + activeRadius: 10 * opts.pixelRatio, + offsetAngle: 0, + labelWidth: 15 * opts.pixelRatio, + border:false, + borderWidth:2, + borderColor:'#FFFFFF' + }, opts.extra.rose); + if (config.pieChartLinePadding == 0) { + config.pieChartLinePadding = roseOption.activeRadius; + } + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding); + var minRadius = roseOption.minRadius || radius * 0.5; + + series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process); + + var activeRadius = roseOption.activeRadius; + + series = series.map(function(eachSeries) { + eachSeries._start_ += (roseOption.offsetAngle || 0) * Math.PI / 180; + return eachSeries; + }); + + series.forEach(function(eachSeries, seriesIndex) { + if (opts.tooltip) { + if (opts.tooltip.index == seriesIndex) { + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, roseOption.activeOpacity || 0.5)); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, activeRadius + eachSeries._radius_, eachSeries._start_, + eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI); + context.closePath(); + context.fill(); + } + } + context.beginPath(); + context.setLineWidth(roseOption.borderWidth * opts.pixelRatio); + context.lineJoin = "round"; + context.setStrokeStyle(roseOption.borderColor); + context.setFillStyle(eachSeries.color); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * + eachSeries._rose_proportion_ * Math.PI); + context.closePath(); + context.fill(); + if (roseOption.border == true) { + context.stroke(); + } + }); + + if (opts.dataLabel !== false && process === 1) { + var valid = false; + for (var i = 0, len = series.length; i < len; i++) { + if (series[i].data > 0) { + valid = true; + break; + } + } + + if (valid) { + drawPieText(series, opts, config, context, radius, centerPosition); + } + } + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawArcbarDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var arcbarOption = assign({}, { + startAngle: 0.75, + endAngle: 0.25, + type: 'default', + width: 12 * opts.pixelRatio, + gap:2 * opts.pixelRatio + }, opts.extra.arcbar); + + series = getArcbarDataPoints(series, arcbarOption, process); + + var centerPosition; + if(arcbarOption.center){ + centerPosition=arcbarOption.center; + }else{ + centerPosition= { + x: opts.width / 2, + y: opts.height / 2 + }; + } + + var radius; + if(arcbarOption.radius){ + radius=arcbarOption.radius; + }else{ + radius = Math.min(centerPosition.x, centerPosition.y); + radius -= 5 * opts.pixelRatio; + radius -= arcbarOption.width / 2; + } + + for (let i = 0; i < series.length; i++) { + let eachSeries = series[i]; + //背景颜色 + context.setLineWidth(arcbarOption.width); + context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9'); + context.setLineCap('round'); + context.beginPath(); + if (arcbarOption.type == 'default') { + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, false); + } else { + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, 0, 2 * Math.PI, false); + } + context.stroke(); + //进度条 + context.setLineWidth(arcbarOption.width); + context.setStrokeStyle(eachSeries.color); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ * Math.PI, false); + context.stroke(); + } + + drawRingTitle(opts, config, context, centerPosition); + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawGaugeDataPoints(categories, series, opts, config, context) { + var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; + var gaugeOption = assign({}, { + type:'default', + startAngle: 0.75, + endAngle: 0.25, + width: 15, + splitLine: { + fixRadius: 0, + splitNumber: 10, + width: 15, + color: '#FFFFFF', + childNumber: 5, + childWidth: 5 + }, + pointer: { + width: 15, + color: 'auto' + } + }, opts.extra.gauge); + + if (gaugeOption.oldAngle == undefined) { + gaugeOption.oldAngle = gaugeOption.startAngle; + } + if (gaugeOption.oldData == undefined) { + gaugeOption.oldData = 0; + } + categories = getGaugeAxisPoints(categories, gaugeOption.startAngle, gaugeOption.endAngle); + + var centerPosition = { + x: opts.width / 2, + y: opts.height / 2 + }; + var radius = Math.min(centerPosition.x, centerPosition.y); + radius -= 5 * opts.pixelRatio; + radius -= gaugeOption.width / 2; + var innerRadius = radius - gaugeOption.width; + var totalAngle=0; + + //判断仪表盘的样式:default百度样式,progress新样式 + if(gaugeOption.type == 'progress'){ + + //## 第一步画中心圆形背景和进度条背景 + //中心圆形背景 + var pieRadius = radius - gaugeOption.width*3; + context.beginPath(); + let gradient = context.createLinearGradient(centerPosition.x, centerPosition.y-pieRadius, centerPosition.x , centerPosition.y+pieRadius); + //配置渐变填充(起点:中心点向上减半径;结束点中心点向下加半径) + gradient.addColorStop('0', hexToRgb(series[0].color, 0.3)); + gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1)); + context.setFillStyle(gradient); + context.arc(centerPosition.x, centerPosition.y, pieRadius, 0, 2*Math.PI, false); + context.fill(); + //画进度条背景 + context.setLineWidth(gaugeOption.width); + context.setStrokeStyle(hexToRgb(series[0].color, 0.3)); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, gaugeOption.endAngle *Math.PI, false); + context.stroke(); + + //## 第二步画刻度线 + totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber; + let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber; + let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius; + let endX = -radius - gaugeOption.width - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + let len = gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; + let proc = series[0].data * process; + for (let i = 0; i < len; i++) { + context.beginPath(); + //刻度线随进度变色 + if(proc>(i/len)){ + context.setStrokeStyle(hexToRgb(series[0].color, 1)); + }else{ + context.setStrokeStyle(hexToRgb(series[0].color, 0.3)); + } + context.setLineWidth(3 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(endX, 0); + context.stroke(); + context.rotate(childAngle * Math.PI); + } + context.restore(); + + //## 第三步画进度条 + series = getArcbarDataPoints(series, gaugeOption, process); + context.setLineWidth(gaugeOption.width); + context.setStrokeStyle(series[0].color); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, series[0]._proportion_ *Math.PI, false); + context.stroke(); + + //## 第四步画指针 + let pointerRadius = radius - gaugeOption.width*2.5; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((series[0]._proportion_ - 1) * Math.PI); + context.beginPath(); + context.setLineWidth(gaugeOption.width/3); + let gradient3 = context.createLinearGradient(0, -pointerRadius*0.6, 0 , pointerRadius*0.6); + gradient3.addColorStop('0', hexToRgb('#FFFFFF', 0)); + gradient3.addColorStop('0.5', hexToRgb(series[0].color, 1)); + gradient3.addColorStop('1.0', hexToRgb('#FFFFFF', 0)); + context.setStrokeStyle(gradient3); + context.arc(0, 0, pointerRadius , 0.85* Math.PI, 1.15 * Math.PI, false); + context.stroke(); + context.beginPath(); + context.setLineWidth(1); + context.setStrokeStyle(series[0].color); + context.setFillStyle(series[0].color); + context.moveTo(-pointerRadius-gaugeOption.width/3/2,-4); + context.lineTo(-pointerRadius-gaugeOption.width/3/2-4,0); + context.lineTo(-pointerRadius-gaugeOption.width/3/2,4); + context.lineTo(-pointerRadius-gaugeOption.width/3/2,-4); + context.stroke(); + context.fill(); + context.restore(); + + //default百度样式 + }else{ + //画背景 + context.setLineWidth(gaugeOption.width); + context.setLineCap('butt'); + for (let i = 0; i < categories.length; i++) { + let eachCategories = categories[i]; + context.beginPath(); + context.setStrokeStyle(eachCategories.color); + context.arc(centerPosition.x, centerPosition.y, radius, eachCategories._startAngle_ * Math.PI, eachCategories._endAngle_ *Math.PI, false); + context.stroke(); + } + context.save(); + + //画刻度线 + totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber; + let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber; + let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius; + let endX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width; + let childendX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.childWidth; + + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + + for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) { + context.beginPath(); + context.setStrokeStyle(gaugeOption.splitLine.color); + context.setLineWidth(2 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(endX, 0); + context.stroke(); + context.rotate(splitAngle * Math.PI); + } + context.restore(); + + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + + for (let i = 0; i < gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; i++) { + context.beginPath(); + context.setStrokeStyle(gaugeOption.splitLine.color); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(childendX, 0); + context.stroke(); + context.rotate(childAngle * Math.PI); + } + context.restore(); + + //画指针 + series = getGaugeDataPoints(series, categories, gaugeOption, process); + + for (let i = 0; i < series.length; i++) { + let eachSeries = series[i]; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((eachSeries._proportion_ - 1) * Math.PI); + context.beginPath(); + context.setFillStyle(eachSeries.color); + context.moveTo(gaugeOption.pointer.width, 0); + context.lineTo(0, -gaugeOption.pointer.width / 2); + context.lineTo(-innerRadius, 0); + context.lineTo(0, gaugeOption.pointer.width / 2); + context.lineTo(gaugeOption.pointer.width, 0); + context.closePath(); + context.fill(); + context.beginPath(); + context.setFillStyle('#FFFFFF'); + context.arc(0, 0, gaugeOption.pointer.width / 6, 0, 2 * Math.PI, false); + context.fill(); + context.restore(); + } + + if (opts.dataLabel !== false) { + drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context); + } + } + + //画仪表盘标题,副标题 + drawRingTitle(opts, config, context, centerPosition); + + if (process === 1 && opts.type === 'gauge') { + opts.extra.gauge.oldAngle = series[0]._proportion_; + opts.extra.gauge.oldData = series[0].data; + } + return { + center: centerPosition, + radius: radius, + innerRadius: innerRadius, + categories: categories, + totalAngle: totalAngle + }; +} + +function drawRadarDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var radarOption = assign({},{ + gridColor: '#cccccc', + labelColor: '#666666', + opacity: 0.2, + gridCount:3 + },opts.extra.radar); + + var coordinateAngle = getRadarCoordinateSeries(opts.categories.length); + + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + + var radius = Math.min(centerPosition.x - (getMaxTextListLength(opts.categories) + config.radarLabelTextMargin), + centerPosition.y - config.radarLabelTextMargin); + //TODO逻辑不对 + radius -= opts.padding[1]; + + // draw grid + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(radarOption.gridColor); + coordinateAngle.forEach(function(angle) { + var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition); + context.moveTo(centerPosition.x, centerPosition.y); + context.lineTo(pos.x, pos.y); + }); + context.stroke(); + context.closePath(); + // draw split line grid + + var _loop = function _loop(i) { + var startPos = {}; + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(radarOption.gridColor); + coordinateAngle.forEach(function(angle, index) { + var pos = convertCoordinateOrigin(radius / radarOption.gridCount * i * Math.cos(angle), radius / radarOption.gridCount * i * Math.sin(angle), centerPosition); + if (index === 0) { + startPos = pos; + context.moveTo(pos.x, pos.y); + } else { + context.lineTo(pos.x, pos.y); + } + }); + context.lineTo(startPos.x, startPos.y); + context.stroke(); + context.closePath(); + }; + + for (var i = 1; i <= radarOption.gridCount; i++) { + _loop(i); + } + + var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process); + + radarDataPoints.forEach(function(eachSeries, seriesIndex) { + // 绘制区域数据 + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, radarOption.opacity)); + eachSeries.data.forEach(function(item, index) { + if (index === 0) { + context.moveTo(item.position.x, item.position.y); + } else { + context.lineTo(item.position.x, item.position.y); + } + }); + context.closePath(); + context.fill(); + + if (opts.dataPointShape !== false) { + var points = eachSeries.data.map(function(item) { + return item.position; + }); + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + // draw label text + drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context); + + return { + center: centerPosition, + radius: radius, + angleList: coordinateAngle + }; +} + +function normalInt(min, max, iter) { + iter = iter==0?1:iter; + var arr = []; + for (var i = 0; i < iter; i++) { + arr[i] = Math.random(); + }; + return Math.floor(arr.reduce(function(i,j){return i+j})/iter*(max-min))+min; +}; + +function collisionNew(area,points,width,height){ + var isIn=false; + for(let i=0;ipoints[i].area[2]||area[1]>points[i].area[3]||area[2]width || area[3]>height){ + isIn=true; + break; + }else{ + isIn=false; + } + }else{ + isIn=true; + break; + } + } + } + return isIn; +}; + +function getBoundingBox(data) { + var bounds = {}, coords; + bounds.xMin = 180; + bounds.xMax = 0; + bounds.yMin = 90; + bounds.yMax = 0 + for (var i = 0; i < data.length; i++) { + var coorda = data[i].geometry.coordinates + for (var k = 0; k < coorda.length; k++) { + coords = coorda[k]; + if (coords.length == 1) { + coords = coords[0] + } + for (var j = 0; j < coords.length; j++) { + var longitude = coords[j][0]; + var latitude = coords[j][1]; + var point = { + x: longitude, + y: latitude + } + bounds.xMin = bounds.xMin < point.x ? bounds.xMin : point.x; + bounds.xMax = bounds.xMax > point.x ? bounds.xMax : point.x; + bounds.yMin = bounds.yMin < point.y ? bounds.yMin : point.y; + bounds.yMax = bounds.yMax > point.y ? bounds.yMax : point.y; + } + } + } + return bounds; +} + +function coordinateToPoint(latitude, longitude,bounds,scale,xoffset,yoffset) { + return { + x: (longitude - bounds.xMin) * scale+xoffset, + y: (bounds.yMax - latitude) * scale+yoffset + }; +} + +function pointToCoordinate(pointY, pointX,bounds,scale,xoffset,yoffset) { + return { + x: (pointX-xoffset)/scale+bounds.xMin, + y: bounds.yMax - (pointY-yoffset)/scale + }; +} + +function isRayIntersectsSegment(poi,s_poi,e_poi){ + if (s_poi[1]==e_poi[1]){return false;} + if (s_poi[1]>poi[1] && e_poi[1]>poi[1]){return false;} + if (s_poi[1]poi[1]){return false;} + if (e_poi[1]==poi[1] && s_poi[1]>poi[1]){return false;} + if (s_poi[0]0.7) { + return true; + }else {return false}; + }; + for (let i = 0; i < points.length; i++) { + let text = points[i].name; + let tHeight = points[i].textSize; + let tWidth = measureText(text,tHeight); + let isSpin = Spin(); + let x,y,area,areav; + let breaknum=0; + while(true) { + breaknum++; + let isCollision; + if (isSpin) { + x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2; + y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2; + area=[y-5-tWidth+opts.width/2,(-x-5+opts.height/2),y+5+opts.width/2,(-x+tHeight+5+opts.height/2)]; + areav=[opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)-5,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)-5,opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)+tHeight,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)+tWidth+5]; + isCollision = collisionNew(areav,points,opts.height,opts.width); + }else{ + x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2; + y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2; + area=[x-5+opts.width/2,y-5-tHeight+opts.height/2,x+tWidth+5+opts.width/2,y+5+opts.height/2]; + isCollision = collisionNew(area,points,opts.width,opts.height); + } + if (!isCollision) break; + if (breaknum==1000){ + area=[-1000,-1000,-1000,-1000]; + break; + } + }; + if (isSpin) { + points[i].area=areav; + points[i].areav=area; + }else{ + points[i].area=area; + } + points[i].rotate=isSpin; + }; + break; + } + return points; +} + + +function drawWordCloudDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let wordOption = assign({},{ + type: 'normal', + autoColors: true + },opts.extra.word); + + context.beginPath(); + context.setFillStyle(opts.background||'#FFFFFF'); + context.rect(0,0,opts.width,opts.height); + context.fill(); + context.save(); + let points = opts.chartData.wordCloudData; + context.translate(opts.width/2,opts.height/2); + + for(let i=0;i0){ + if (opts.tooltip) { + if (opts.tooltip.index == i) { + context.strokeText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + }else{ + context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + } + }else{ + context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + } + } + }else{ + if(points[i].area[0]>0){ + if (opts.tooltip) { + if (opts.tooltip.index == i) { + context.strokeText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + }else{ + context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + } + }else{ + context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + } + + } + } + + context.stroke(); + context.restore(); + } + context.restore(); +} + +function drawFunnelDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let funnelOption = assign({},{ + activeWidth:10, + activeOpacity:0.3, + border:false, + borderWidth:2, + borderColor:'#FFFFFF', + fillOpacity:1, + labelAlign:'right' + },opts.extra.funnel); + let eachSpacing = (opts.height - opts.area[0] - opts.area[2])/series.length; + let centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.height-opts.area[2] + }; + let activeWidth = funnelOption.activeWidth; + let radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth, (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth); + series = getFunnelDataPoints(series, radius, process); + context.save(); + context.translate(centerPosition.x,centerPosition.y); + for(let i=0;i0){ + opts.area[3] += yAxisWidth[i].width + opts.yAxis.padding; + }else{ + opts.area[3] += yAxisWidth[i].width; + } + leftIndex +=1; + }else{ + if(rightIndex>0){ + opts.area[1] += yAxisWidth[i].width + opts.yAxis.padding; + }else{ + opts.area[1] += yAxisWidth[i].width; + } + rightIndex +=1; + } + } + }else{ + config.yAxisWidth = yAxisWidth; + } + opts.chartData.yAxisData = _calYAxisData; + + if (opts.categories && opts.categories.length) { + opts.chartData.xAxisData = getXAxisPoints(opts.categories, opts, config); + let _calCategoriesData = calCategoriesData(opts.categories, opts, config, opts.chartData.xAxisData.eachSpacing), + xAxisHeight = _calCategoriesData.xAxisHeight, + angle = _calCategoriesData.angle; + config.xAxisHeight = xAxisHeight; + config._xAxisTextAngle_ = angle; + opts.area[2] += xAxisHeight; + opts.chartData.categoriesData = _calCategoriesData; + }else{ + if (opts.type === 'line' || opts.type === 'area' || opts.type === 'points') { + opts.chartData.xAxisData = calXAxisData(series, opts, config); + categories=opts.chartData.xAxisData.rangesFormat; + let _calCategoriesData = calCategoriesData(categories, opts, config, opts.chartData.xAxisData.eachSpacing), + xAxisHeight = _calCategoriesData.xAxisHeight, + angle = _calCategoriesData.angle; + config.xAxisHeight = xAxisHeight; + config._xAxisTextAngle_ = angle; + opts.area[2] += xAxisHeight; + opts.chartData.categoriesData = _calCategoriesData; + }else{ + opts.chartData.xAxisData={ + xAxisPoints: [] + }; + } + } + //计算右对齐偏移距离 + if (opts.enableScroll && opts.xAxis.scrollAlign == 'right' && opts._scrollDistance_ === undefined) { + let offsetLeft = 0, + xAxisPoints = opts.chartData.xAxisData.xAxisPoints, + startX = opts.chartData.xAxisData.startX, + endX = opts.chartData.xAxisData.endX, + eachSpacing = opts.chartData.xAxisData.eachSpacing; + let totalWidth = eachSpacing * (xAxisPoints.length - 1); + let screenWidth = endX - startX; + offsetLeft = screenWidth - totalWidth; + _this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + opts._scrollDistance_ = offsetLeft; + } + + if (type === 'pie' || type === 'ring' || type === 'rose') { + config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA); + } + + switch (type) { + case 'word': + let wordOption = assign({},{ + type: 'normal', + autoColors: true + },opts.extra.word); + if(opts.updateData==true || opts.updateData==undefined){ + opts.chartData.wordCloudData=getWordCloudPoint(opts,wordOption.type); + } + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawWordCloudDataPoints(series, opts, config, context,process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'map': + context.clearRect(0, 0, opts.width, opts.height); + drawMapDataPoints(series, opts, config, context); + break; + case 'funnel': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.funnelData = drawFunnelDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'line': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawLineDataPoints = drawLineDataPoints(series, opts, config, context, process), + xAxisPoints = _drawLineDataPoints.xAxisPoints, + calPoints = _drawLineDataPoints.calPoints, + eachSpacing = _drawLineDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'mix': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawMixDataPoints = drawMixDataPoints(series, opts, config, context, process), + xAxisPoints = _drawMixDataPoints.xAxisPoints, + calPoints = _drawMixDataPoints.calPoints, + eachSpacing = _drawMixDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'column': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawColumnDataPoints = drawColumnDataPoints(series, opts, config, context, process), + xAxisPoints = _drawColumnDataPoints.xAxisPoints, + calPoints = _drawColumnDataPoints.calPoints, + eachSpacing = _drawColumnDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'area': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawAreaDataPoints = drawAreaDataPoints(series, opts, config, context, process), + xAxisPoints = _drawAreaDataPoints.xAxisPoints, + calPoints = _drawAreaDataPoints.calPoints, + eachSpacing = _drawAreaDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'ring': + case 'pie': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'rose': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.pieData = drawRoseDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'radar': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.radarData = drawRadarDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'arcbar': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.arcbarData = drawArcbarDataPoints(series, opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'gauge': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.gaugeData = drawGaugeDataPoints(categories, series, opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'candle': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawCandleDataPoints = drawCandleDataPoints(series, seriesMA, opts, config, context, process), + xAxisPoints = _drawCandleDataPoints.xAxisPoints, + calPoints = _drawCandleDataPoints.calPoints, + eachSpacing = _drawCandleDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + if (seriesMA) { + drawLegend(seriesMA, opts, config, context, opts.chartData); + } else { + drawLegend(opts.series, opts, config, context, opts.chartData); + } + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + } +} + +// simple event implement + +function Event() { + this.events = {}; +} + +Event.prototype.addEventListener = function(type, listener) { + this.events[type] = this.events[type] || []; + this.events[type].push(listener); +}; + +Event.prototype.trigger = function() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var type = args[0]; + var params = args.slice(1); + if (!!this.events[type]) { + this.events[type].forEach(function(listener) { + try { + listener.apply(null, params); + } catch (e) { + console.error(e); + } + }); + } +}; + +var Charts = function Charts(opts) { + opts.pixelRatio = opts.pixelRatio ? opts.pixelRatio : 1; + opts.fontSize = opts.fontSize ? opts.fontSize * opts.pixelRatio : 13 * opts.pixelRatio; + opts.title = assign({}, opts.title); + opts.subtitle = assign({}, opts.subtitle); + opts.duration = opts.duration ? opts.duration : 1000; + opts.yAxis = assign({}, { + data:[], + showTitle:false, + disabled:false, + disableGrid:false, + splitNumber:5, + gridType: 'solid', + dashLength: 4 * opts.pixelRatio, + gridColor:'#cccccc', + padding:10, + fontColor:'#666666' + }, opts.yAxis); + opts.yAxis.dashLength *= opts.pixelRatio; + opts.yAxis.padding *= opts.pixelRatio; + opts.xAxis = assign({}, { + rotateLabel: false, + type: 'calibration', + gridType: 'solid', + dashLength: 4, + scrollAlign: 'left', + boundaryGap:'center', + axisLine:true, + axisLineColor:'#cccccc' + }, opts.xAxis); + opts.xAxis.dashLength *= opts.pixelRatio; + opts.legend = assign({}, { + show: true, + position: 'bottom', + float: 'center', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + padding: 5, + margin: 5, + itemGap: 10, + fontSize: opts.fontSize, + lineHeight: opts.fontSize, + fontColor: '#333333', + format: {}, + hiddenColor: '#CECECE' + }, opts.legend); + opts.legend.borderWidth = opts.legend.borderWidth * opts.pixelRatio; + opts.legend.itemGap = opts.legend.itemGap * opts.pixelRatio; + opts.legend.padding = opts.legend.padding * opts.pixelRatio; + opts.legend.margin = opts.legend.margin * opts.pixelRatio; + opts.extra = assign({}, opts.extra); + opts.rotate = opts.rotate ? true : false; + opts.animation = opts.animation ? true : false; + opts.rotate = opts.rotate ? true : false; + + let config$$1 = JSON.parse(JSON.stringify(config)); + config$$1.colors = opts.colors ? opts.colors : config$$1.colors; + config$$1.yAxisTitleWidth = opts.yAxis.disabled !== true && opts.yAxis.title ? config$$1.yAxisTitleWidth : 0; + if (opts.type == 'pie' || opts.type == 'ring') { + config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio; + } + if (opts.type == 'rose') { + config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio; + } + config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pixelRatio; + config$$1.yAxisSplit = opts.yAxis.splitNumber ? opts.yAxis.splitNumber : config.yAxisSplit; + + //屏幕旋转 + config$$1.rotate = opts.rotate; + if (opts.rotate) { + let tempWidth = opts.width; + let tempHeight = opts.height; + opts.width = tempHeight; + opts.height = tempWidth; + } + + //适配高分屏 + opts.padding = opts.padding ? opts.padding : config$$1.padding; + for (let i = 0; i < 4; i++) { + opts.padding[i] *= opts.pixelRatio; + } + config$$1.yAxisWidth = config.yAxisWidth * opts.pixelRatio; + config$$1.xAxisHeight = config.xAxisHeight * opts.pixelRatio; + if (opts.enableScroll && opts.xAxis.scrollShow) { + config$$1.xAxisHeight += 6 * opts.pixelRatio; + } + config$$1.xAxisLineHeight = config.xAxisLineHeight * opts.pixelRatio; + config$$1.fontSize = opts.fontSize; + config$$1.titleFontSize = config.titleFontSize * opts.pixelRatio; + config$$1.subtitleFontSize = config.subtitleFontSize * opts.pixelRatio; + config$$1.toolTipPadding = config.toolTipPadding * opts.pixelRatio; + config$$1.toolTipLineHeight = config.toolTipLineHeight * opts.pixelRatio; + config$$1.columePadding = config.columePadding * opts.pixelRatio; + opts.$this = opts.$this ? opts.$this : this; + + this.context = uni.createCanvasContext(opts.canvasId, opts.$this); + /* 兼容原生H5 + this.context = document.getElementById(opts.canvasId).getContext("2d"); + this.context.setStrokeStyle = function(e){ return this.strokeStyle=e; } + this.context.setLineWidth = function(e){ return this.lineWidth=e; } + this.context.setLineCap = function(e){ return this.lineCap=e; } + this.context.setFontSize = function(e){ return this.font=e+"px sans-serif"; } + this.context.setFillStyle = function(e){ return this.fillStyle=e; } + this.context.draw = function(){ } + */ + + opts.chartData = {}; + this.event = new Event(); + this.scrollOption = { + currentOffset: 0, + startTouchX: 0, + distance: 0, + lastMoveTime: 0 + }; + + this.opts = opts; + this.config = config$$1; + + drawCharts.call(this, opts.type, opts, config$$1, this.context); +}; + +Charts.prototype.updateData = function() { + let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.opts = assign({}, this.opts, data); + this.opts.updateData = true; + let scrollPosition = data.scrollPosition || 'current'; + switch (scrollPosition) { + case 'current': + this.opts._scrollDistance_ = this.scrollOption.currentOffset; + break; + case 'left': + this.opts._scrollDistance_ = 0; + this.scrollOption = { + currentOffset: 0, + startTouchX: 0, + distance: 0, + lastMoveTime: 0 + }; + break; + case 'right': + let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config), + yAxisWidth = _calYAxisData.yAxisWidth; + this.config.yAxisWidth = yAxisWidth; + let offsetLeft = 0; + let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config), + xAxisPoints = _getXAxisPoints0.xAxisPoints, + startX = _getXAxisPoints0.startX, + endX = _getXAxisPoints0.endX, + eachSpacing = _getXAxisPoints0.eachSpacing; + let totalWidth = eachSpacing * (xAxisPoints.length - 1); + let screenWidth = endX - startX; + offsetLeft = screenWidth - totalWidth; + this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + this.opts._scrollDistance_ = offsetLeft; + break; + } + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); +}; + +Charts.prototype.zoom = function() { + var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount; + if (this.opts.enableScroll !== true) { + console.log('请启用滚动条后使用!') + return; + } + //当前屏幕中间点 + let centerPoint = Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round( + this.opts.xAxis.itemCount / 2); + this.opts.animation = false; + this.opts.xAxis.itemCount = val.itemCount; + //重新计算x轴偏移距离 + let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config), + yAxisWidth = _calYAxisData.yAxisWidth; + this.config.yAxisWidth = yAxisWidth; + let offsetLeft = 0; + let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config), + xAxisPoints = _getXAxisPoints0.xAxisPoints, + startX = _getXAxisPoints0.startX, + endX = _getXAxisPoints0.endX, + eachSpacing = _getXAxisPoints0.eachSpacing; + let centerLeft = eachSpacing * centerPoint; + let screenWidth = endX - startX; + let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1); + offsetLeft = screenWidth / 2 - centerLeft; + if (offsetLeft > 0) { + offsetLeft = 0; + } + if (offsetLeft < MaxLeft) { + offsetLeft = MaxLeft; + } + this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + this.opts._scrollDistance_ = offsetLeft; + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); +}; + +Charts.prototype.stopAnimation = function() { + this.animationInstance && this.animationInstance.stop(); +}; + +Charts.prototype.addEventListener = function(type, listener) { + this.event.addEventListener(type, listener); +}; + +Charts.prototype.getCurrentDataIndex = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + let _touches$ = getTouches(touches, this.opts, e); + if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose') { + return findPieChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.pieData); + } else if (this.opts.type === 'radar') { + return findRadarChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.radarData, this.opts.categories.length); + } else if (this.opts.type === 'funnel') { + return findFunnelChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.funnelData); + } else if (this.opts.type === 'map') { + return findMapChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts); + }else if (this.opts.type === 'word') { + return findWordChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.wordCloudData); + } else { + return findCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.calPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset)); + } + } + return -1; +}; + +Charts.prototype.getLegendDataIndex = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + let _touches$ = getTouches(touches, this.opts, e); + return findLegendIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.legendData); + } + return -1; +}; + +Charts.prototype.touchLegend = function(e) { + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + var _touches$ = getTouches(touches, this.opts, e); + var index = this.getLegendDataIndex(e); + if (index >= 0) { + this.opts.series[index].show = !this.opts.series[index].show; + this.opts.animation = option.animation ? true : false; + this.opts._scrollDistance_= this.scrollOption.currentOffset; + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); + } + } + +}; + +Charts.prototype.showToolTip = function(e) { + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (!touches) { + console.log("touchError"); + } + var _touches$ = getTouches(touches, this.opts, e); + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + if (this.opts.type === 'line' || this.opts.type === 'area' || this.opts.type === 'column') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getToolTipData = getToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option), + textList = _getToolTipData.textList, + offset = _getToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'mix') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getMixToolTipData = getMixToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option), + textList = _getMixToolTipData.textList, + offset = _getMixToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'candle') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getToolTipData = getCandleToolTipData(this.opts.series[0].data, seriesData, this.opts.chartData.calPoints, + index, this.opts.categories, this.opts.extra.candle, option), + textList = _getToolTipData.textList, + offset = _getToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose'||this.opts.type === 'funnel' ) { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = this.opts._series_[index]; + var textList = [{ + text: option.format ? option.format(seriesData) : seriesData.name + ': ' + seriesData.data, + color: seriesData.color + }]; + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'map'||this.opts.type === 'word') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = this.opts._series_[index]; + var textList = [{ + text: option.format ? option.format(seriesData) : seriesData.properties.name , + color: seriesData.color + }]; + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + opts.updateData = false; + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'radar') { + var index = this.getCurrentDataIndex(e); + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var textList = seriesData.map(function(item) { + return { + text: option.format ? option.format(item) : item.name + ': ' + item.data, + color: item.color + }; + }); + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } +}; + +Charts.prototype.translate = function(distance) { + this.scrollOption = { + currentOffset: distance, + startTouchX: distance, + distance: 0, + lastMoveTime: 0 + }; + let opts = assign({}, this.opts, { + _scrollDistance_: distance, + animation: false + }); + drawCharts.call(this, this.opts.type, opts, this.config, this.context); +}; + +Charts.prototype.scrollStart = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + var _touches$ = getTouches(touches, this.opts, e); + if (touches && this.opts.enableScroll === true) { + this.scrollOption.startTouchX = _touches$.x; + } +}; + +Charts.prototype.scroll = function(e) { + if (this.scrollOption.lastMoveTime === 0) { + this.scrollOption.lastMoveTime = Date.now(); + } + let Limit = this.opts.extra.touchMoveLimit || 20; + let currMoveTime = Date.now(); + let duration = currMoveTime - this.scrollOption.lastMoveTime; + if (duration < Math.floor(1000 / Limit)) return; + this.scrollOption.lastMoveTime = currMoveTime; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches && this.opts.enableScroll === true) { + var _touches$ = getTouches(touches, this.opts, e); + var _distance; + _distance = _touches$.x - this.scrollOption.startTouchX; + var currentOffset = this.scrollOption.currentOffset; + var validDistance = calValidDistance(this,currentOffset + _distance, this.opts.chartData, this.config, this.opts); + this.scrollOption.distance = _distance = validDistance - currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset + _distance, + animation: false + }); + drawCharts.call(this, opts.type, opts, this.config, this.context); + return currentOffset + _distance; + } +}; + +Charts.prototype.scrollEnd = function(e) { + if (this.opts.enableScroll === true) { + var _scrollOption = this.scrollOption, + currentOffset = _scrollOption.currentOffset, + distance = _scrollOption.distance; + this.scrollOption.currentOffset = currentOffset + distance; + this.scrollOption.distance = 0; + } +}; +if (typeof module === "object" && typeof module.exports === "object") { + module.exports = Charts; + //export default Charts;//建议使用nodejs的module导出方式,如报错请使用export方式导出 +} diff --git a/components/u-charts/u-charts.min.js b/components/u-charts/u-charts.min.js new file mode 100644 index 0000000..ba10de5 --- /dev/null +++ b/components/u-charts/u-charts.min.js @@ -0,0 +1 @@ +'use strict';var config={yAxisWidth:15,yAxisSplit:5,xAxisHeight:15,xAxisLineHeight:15,legendHeight:15,yAxisTitleWidth:15,padding:[10,10,10,10],pixelRatio:1,rotate:!1,columePadding:3,fontSize:13,dataPointShape:["circle","circle","circle","circle"],colors:["#1890ff","#2fc25b","#facc14","#f04864","#8543e0","#90ed7d"],pieChartLinePadding:15,pieChartTextPadding:5,xAxisTextPadding:3,titleColor:"#333333",titleFontSize:20,subtitleColor:"#999999",subtitleFontSize:15,toolTipPadding:3,toolTipBackground:"#000000",toolTipOpacity:.7,toolTipLineHeight:20,radarLabelTextMargin:15,gaugeLabelTextMargin:15};let assign=function(e,...t){function i(e,t){for(let a in t)e[a]=e[a]&&"[object Object]"===e[a].toString()?i(e[a],t[a]):e[a]=t[a];return e}if(null==e)throw new TypeError("Cannot convert undefined or null to object");return!t||0>=t.length?e:(t.forEach(t=>{e=i(e,t)}),e)};var util={toFixed:function(e,t){return t=t||2,this.isFloat(e)&&(e=e.toFixed(t)),e},isFloat:function(e){return 0!=e%1},approximatelyEqual:function(e,t){return 1e-10>Math.abs(e-t)},isSameSign:function(e,t){var i=Math.abs;return i(e)===e&&i(t)===t||i(e)!==e&&i(t)!==t},isSameXCoordinateArea:function(e,t){return this.isSameSign(e.x,t.x)},isCollision:function(e,t){e.end={},e.end.x=e.start.x+e.width,e.end.y=e.start.y-e.height,t.end={},t.end.x=t.start.x+t.width,t.end.y=t.start.y-t.height;var i=t.start.x>e.end.x||t.end.xe.start.y||t.start.yi;)i*=10,a*=10;for(e="upper"===t?Math.ceil(e*a):Math.floor(e*a);0!=e%i;)"upper"===t?e++:e--;return e/a}function calCandleMA(e,t,i,a){let o=[];for(let n,l=0;l=l-n&&(r=n-l,e.event.trigger("scrollRight")),r}function isInAngleRange(e,t,i){function a(e){for(;0>e;)e+=2*o;for(;e>2*o;)e-=2*o;return e}var o=Math.PI;return e=a(e),t=a(t),i=a(i),t>i&&(i+=2*o,e=t&&e<=i}function calRotateTranslate(e,t,i){var a=e,o=i-t,n=a+(i-o-a)/1.4142135623730951;n*=-1;return{transX:n,transY:(i-o)*(1.4142135623730951-1)-(i-o-a)/1.4142135623730951}}function createCurveControlPoints(e,t){function i(e,t){return!!(e[t-1]&&e[t+1])&&(e[t].y>=n(e[t-1].y,e[t+1].y)||e[t].y<=o(e[t-1].y,e[t+1].y))}var o=Math.min,n=Math.max,l=.2,a=.2,r=null,s=null,d=null,h=null;if(1>t?(r=e[0].x+(e[1].x-e[0].x)*l,s=e[0].y+(e[1].y-e[0].y)*l):(r=e[t].x+(e[t+1].x-e[t-1].x)*l,s=e[t].y+(e[t+1].y-e[t-1].y)*l),t>e.length-3){var x=e.length-1;d=e[x].x-(e[x].x-e[x-1].x)*a,h=e[x].y-(e[x].y-e[x-1].y)*a}else d=e[t+1].x-(e[t+2].x-e[t].x)*a,h=e[t+1].y-(e[t+2].y-e[t].y)*a;return i(e,t+1)&&(h=e[t+1].y),i(e,t)&&(s=e[t].y),(s>=n(e[t].y,e[t+1].y)||s<=o(e[t].y,e[t+1].y))&&(s=e[t].y),(h>=n(e[t].y,e[t+1].y)||h<=o(e[t].y,e[t+1].y))&&(h=e[t+1].y),{ctrA:{x:r,y:s},ctrB:{x:d,y:h}}}function convertCoordinateOrigin(e,t,i){return{x:i.x+e,y:i.y-t}}function avoidCollision(e,t){if(t)for(;util.isCollision(e,t);)0e.start.x?e.start.y++:0t.data[1]-t.data[0]?s[1]=r:(t.data[0]e[o-1][1]&&(s[2]=l),t.data[3]t&&(n=i)}),n}function findLegendIndex(e,t){let i=-1;if(isInExactLegendArea(e,t.area)){let a=t.points,o=-1;for(let t,n=0,l=a.length;nn[0]&&e.xn[1]&&e.yt.start.x&&e.xt.start.y&&e.y=t.area[3]-10&&e.y>=t.area[0]&&e.y<=t.height-t.area[2]}function findRadarChartCurrentIndex(e,t,i){var a=Math.PI,o=2*a/i,n=-1;if(isInExactPieChartArea(e,t.center,t.radius)){var l=function(e){return 0>e&&(e+=2*a),e>2*a&&(e-=2*a),e},r=Math.atan2(t.center.y-e.y,e.x-t.center.x);r=-1*r,0>r&&(r+=2*a);var s=t.angleList.map(function(e){return e=l(-1*e),e});s.forEach(function(e,t){var i=l(e-o/2),s=l(e+o/2);s=i&&r<=s||r+2*a>=i&&r+2*a<=s)&&(n=t)})}return n}function findFunnelChartCurrentIndex(e,t){for(var a,o=-1,n=0,l=t.series.length;na.funnelArea[0]&&e.xa.funnelArea[1]&&e.ya.area[0]&&e.xa.area[1]&&e.yt.width-t.padding[1]-t.padding[3]?(a.push(g),p.push(n-t.legend.itemGap),n=l,g=[i]):(n+=l,g.push(i))}if(g.length){a.push(g),p.push(n-t.legend.itemGap),l.widthArr=p;let e=o.apply(null,p);switch(t.legend.float){case"left":l.area.start.x=t.padding[3],l.area.end.x=t.padding[3]+2*r;break;case"right":l.area.start.x=t.width-t.padding[1]-e-2*r,l.area.end.x=t.width-t.padding[1];break;default:l.area.start.x=(t.width-e)/2-r,l.area.end.x=(t.width+e)/2+r;}l.area.width=e+2*r,l.area.wholeWidth=e+2*r,l.area.height=a.length*c+2*r,l.area.wholeHeight=a.length*c+2*r+2*s,l.points=a}}else{let i=e.length,a=t.height-t.padding[0]-t.padding[2]-2*s-2*r,o=Math.min(n(a/c),i);switch(l.area.height=o*c+2*r,l.area.wholeHeight=o*c+2*r,t.legend.float){case"top":l.area.start.y=t.padding[0]+s,l.area.end.y=t.padding[0]+s+l.area.height;break;case"bottom":l.area.start.y=t.height-t.padding[2]-s-l.area.height,l.area.end.y=t.height-t.padding[2]-s;break;default:l.area.start.y=(t.height-l.area.height)/2,l.area.end.y=(t.height+l.area.height)/2;}let p=0==i%o?i/o:n(i/o+1),g=[];for(let t,a=0;aa&&(a=e);l.widthArr.push(a),l.heightArr.push(i.length*c+2*r)}let e=0;for(let t=0;ta&&(o.angle=45*Math.PI/180,o.xAxisHeight=2*i.xAxisTextPadding+l*Math.sin(o.angle)),o}function getXAxisTextList(e,t){var a=Math.min,o=Math.max,n=4n&&(a.angle=45*Math.PI/180,a.xAxisHeight=2*i.xAxisTextPadding+r*Math.sin(a.angle)),!0===t.xAxis.disabled&&(a.xAxisHeight=0),a}function getRadarDataPoints(e,t,i,a,o){var n=Math.max,l=5=a.oldData?(n._endAngle_-n._oldAngle_)*o+a.oldAngle:n._oldAngle_-(n._oldAngle_-n._endAngle_)*o,2<=n._proportion_&&(n._proportion_%=2)}return e}function getPieTextMaxLength(e){e=getPieDataPoints(e);let t=0;for(let a=0;a=e.width&&(e.width=1),e.x+=(a+.5-i/2)*e.width,e)})}function fixColumeMeterData(e,t,i,a,o,n,l){return e.map(function(e){return null===e?null:(e.width=Math.ceil((t-2*o.columePadding)/2),n.extra.column&&n.extra.column.width&&0<+n.extra.column.width&&(e.width=Math.min(e.width,+n.extra.column.width)),0s.x&&(h-=measureText(a.categories[r]||"")),n.beginPath(),n.setFontSize(o.fontSize),n.setFillStyle(l.labelColor||"#666666"),n.fillText(a.categories[r]||"",h,x+o.fontSize/2),n.closePath(),n.stroke()})}function drawPieText(e,t,a,o,i,n){var l=Math.cos,r=Math.sin,s=Math.min,d=Math.max,h=Math.PI,x=a.pieChartLinePadding,c=[],p=null,g=e.map(function(e){var t=e.format?e.format(+e._proportion_.toFixed(2)):util.toFixed(100*e._proportion_.toFixed(4))+"%";e._rose_proportion_&&(e._proportion_=e._rose_proportion_);var i=2*h-(e._start_+2*h*e._proportion_/2),a=e.color,o=e._radius_;return{arc:i,text:t,color:a,radius:o,textColor:e.textColor,textSize:e.textSize}});for(let h=0;ht?m=d(f,p.start.y):0y&&(y-=u);let S={lineStart:{x:o,y:n},lineEnd:{x:t,y:i},start:{x:y,y:m},width:u,height:a.fontSize,text:e.text,color:e.color,textColor:e.textColor,textSize:e.textSize};p=avoidCollision(S,p),c.push(p)}for(let l=0;le.start.x?s.x+e.width:s.x,x=0>e.start.x?s.x-5:s.x+5;o.quadraticCurveTo(r.x,r.y,d,s.y),o.moveTo(i.x,i.y),o.stroke(),o.closePath(),o.beginPath(),o.moveTo(s.x+e.width,s.y),o.arc(d,s.y,2,0,2*h),o.closePath(),o.fill(),o.beginPath(),o.setFontSize(e.textSize||a.fontSize),o.setFillStyle(e.textColor||"#666666"),o.fillText(e.text,x,s.y+3),o.closePath(),o.stroke(),o.closePath()}}function drawToolTipSplitLine(e,t,i,a){var o=t.extra.tooltip||{};o.gridType=null==o.gridType?"solid":o.gridType,o.dashLength=null==o.dashLength?4:o.dashLength;var n=t.area[0],l=t.height-t.area[2];if("dash"==o.gridType&&a.setLineDash([o.dashLength,o.dashLength]),a.setStrokeStyle(o.gridColor||"#cccccc"),a.setLineWidth(1*t.pixelRatio),a.beginPath(),a.moveTo(e,n),a.lineTo(e,l),a.stroke(),a.setLineDash([]),o.xAxisLabel){let n=t.categories[t.tooltip.index];a.setFontSize(i.fontSize);let r=measureText(n,i.fontSize),s=e-.5*r,d=l;a.beginPath(),a.setFillStyle(hexToRgb(o.labelBgColor||i.toolTipBackground,o.labelBgOpacity||i.toolTipOpacity)),a.setStrokeStyle(o.labelBgColor||i.toolTipBackground),a.setLineWidth(1*t.pixelRatio),a.rect(s-i.toolTipPadding,d,r+2*i.toolTipPadding,i.fontSize+2*i.toolTipPadding),a.closePath(),a.stroke(),a.fill(),a.beginPath(),a.setFontSize(i.fontSize),a.setFillStyle(o.labelFontColor||i.fontColor),a.fillText(n+"",s,d+i.toolTipPadding+i.fontSize),a.closePath(),a.stroke()}}function drawMarkLine(e,t,a){let o=assign({},{type:"solid",dashLength:4,data:[]},e.extra.markLine),n=e.area[3],l=e.width-e.area[1],r=calMarkLineData(o.data,e);for(let s,d=0;di.width&&(h=!0),p+t.y>i.height&&(t.y=i.height-p),o.beginPath(),o.setFillStyle(hexToRgb(l.bgColor||a.toolTipBackground,l.bgOpacity||a.toolTipOpacity)),h?(o.moveTo(t.x,t.y+10*i.pixelRatio),o.lineTo(t.x-d,t.y+10*i.pixelRatio-5*i.pixelRatio),o.lineTo(t.x-d,t.y),o.lineTo(t.x-d-n(c),t.y),o.lineTo(t.x-d-n(c),t.y+p),o.lineTo(t.x-d,t.y+p),o.lineTo(t.x-d,t.y+10*i.pixelRatio+5*i.pixelRatio),o.lineTo(t.x,t.y+10*i.pixelRatio)):(o.moveTo(t.x,t.y+10*i.pixelRatio),o.lineTo(t.x+d,t.y+10*i.pixelRatio-5*i.pixelRatio),o.lineTo(t.x+d,t.y),o.lineTo(t.x+d+n(c),t.y),o.lineTo(t.x+d+n(c),t.y+p),o.lineTo(t.x+d,t.y+p),o.lineTo(t.x+d,t.y+10*i.pixelRatio+5*i.pixelRatio),o.lineTo(t.x,t.y+10*i.pixelRatio)),o.closePath(),o.fill(),e.forEach(function(e,i){if(null!==e.color){o.beginPath(),o.setFillStyle(e.color);var n=t.x+d+2*a.toolTipPadding,l=t.y+(a.toolTipLineHeight-a.fontSize)/2+a.toolTipLineHeight*i+a.toolTipPadding+1;h&&(n=t.x-c-d+2*a.toolTipPadding),o.fillRect(n,l,r,a.fontSize),o.closePath()}}),e.forEach(function(e,i){var n=t.x+d+2*a.toolTipPadding+r+s;h&&(n=t.x-c-d+2*a.toolTipPadding+ +r+s);var x=t.y+(a.toolTipLineHeight-a.fontSize)/2+a.toolTipLineHeight*i+a.toolTipPadding;o.beginPath(),o.setFontSize(a.fontSize),o.setFillStyle(l.fontColor),o.fillText(e.text,n,x+a.fontSize),o.closePath(),o.stroke()}))}function drawYAxisTitle(e,t,i,a){var o=i.xAxisHeight+(t.height-i.xAxisHeight-measureText(e))/2;a.save(),a.beginPath(),a.setFontSize(i.fontSize),a.setFillStyle(t.yAxis.titleFontColor||"#333333"),a.translate(0,t.height),a.rotate(-90*Math.PI/180),a.fillText(e,o,t.padding[3]+.5*i.fontSize),a.closePath(),a.stroke(),a.restore()}function drawColumnDataPoints(e,t,i,a){let o=4h&&oh&&oh&&oh&&op&&(o.moveTo(i.x,i.y),e=1),0p&&i.xx&&tx&&(a.moveTo(e.x,e.y),i=1),0x&&e.xx&&(a.moveTo(e.x,e.y),i=1),0x&&e.xx&&(a.moveTo(t.x,t.y),e=1),0x&&t.xx&&(a.moveTo(t.x,t.y),e=1),0x&&t.xh&&(a.moveTo(o.x,o.y),i=1),0h&&o.xh&&(a.moveTo(t.x,t.y),i=1),0h&&t.xc&&ng&&(a.moveTo(e.x,e.y),i=1),0g&&e.xg&&(a.moveTo(e.x,e.y),i=1),0g&&e.xg&&(a.moveTo(e.x,e.y),t=1),0g&&e.xg&&(a.moveTo(e.x,e.y),t=1),0g&&e.xt._scrollDistance_&&o.fillRect(0,0,l,d),!0==t.enableScroll&&o.fillRect(r,0,t.width,d),o.closePath(),o.stroke();var h=[];for(let l=0;l<=t.yAxis.splitNumber;l++)h.push(t.area[0]+n*l);let x=t.area[3],c=t.width-t.area[1];for(let n,l=0;le/f?o.setStrokeStyle(hexToRgb(t[0].color,1)):o.setStrokeStyle(hexToRgb(t[0].color,.3)),o.setLineWidth(3*a.pixelRatio),o.moveTo(g,0),o.lineTo(y,0),o.stroke(),o.rotate(p*n);o.restore(),t=getArcbarDataPoints(t,r,l),o.setLineWidth(r.width),o.setStrokeStyle(t[0].color),o.setLineCap("round"),o.beginPath(),o.arc(s.x,s.y,h,r.startAngle*n,t[0]._proportion_*n,!1),o.stroke();let m=d-2.5*r.width;o.save(),o.translate(s.x,s.y),o.rotate((t[0]._proportion_-1)*n),o.beginPath(),o.setLineWidth(r.width/3);let S=o.createLinearGradient(0,.6*-m,0,.6*m);S.addColorStop("0",hexToRgb("#FFFFFF",0)),S.addColorStop("0.5",hexToRgb(t[0].color,1)),S.addColorStop("1.0",hexToRgb("#FFFFFF",0)),o.setStrokeStyle(S),o.arc(0,0,m,.85*n,1.15*n,!1),o.stroke(),o.beginPath(),o.setLineWidth(1),o.setStrokeStyle(t[0].color),o.setFillStyle(t[0].color),o.moveTo(-m-r.width/3/2,-4),o.lineTo(-m-r.width/3/2-4,0),o.lineTo(-m-r.width/3/2,4),o.lineTo(-m-r.width/3/2,-4),o.stroke(),o.fill(),o.restore()}else{o.setLineWidth(r.width),o.setLineCap("butt");for(let t,a=0;at[l].area[2]||e[1]>t[l].area[3]||e[2]e[0]||0>e[1]||e[2]>a||e[3]>o){n=!0;break}else n=!1;return n}function getBoundingBox(e){var t,a={};a.xMin=180,a.xMax=0,a.yMin=90,a.yMax=0;for(var o,n=0;nh.x?a.xMax:h.x,a.yMin=a.yMinh.y?a.yMax:h.y}}}return a}function coordinateToPoint(e,t,i,a,o,n){return{x:(t-i.xMin)*a+o,y:(i.yMax-e)*a+n}}function pointToCoordinate(e,t,i,a,o,n){return{x:(t-o)/a+i.xMin,y:i.yMax-(e-n)/a}}function isRayIntersectsSegment(e,t,i){if(t[1]==i[1])return!1;if(t[1]>e[1]&&i[1]>e[1])return!1;if(t[1]e[1])return!1;if(i[1]==e[1]&&t[1]>e[1])return!1;if(t[0](e/=.5)?.5*t(e,3):.5*(t(e-2,3)+2)},linear:function(e){return e}};function Animation(e){this.isStop=!1,e.duration="undefined"==typeof e.duration?1e3:e.duration,e.timing=e.timing||"linear";var t=function(){return"undefined"==typeof setTimeout?"undefined"==typeof requestAnimationFrame?function(e){e(null)}:requestAnimationFrame:function(e,t){setTimeout(function(){var t=+new Date;e(t)},t)}}(),i=null,a=function(o){if(null===o||!0===this.isStop)return e.onProcess&&e.onProcess(1),void(e.onAnimationFinish&&e.onAnimationFinish());if(null===i&&(i=o),o-io;o++)t.area[o]=t.padding[o];var d=calLegendData(s,t,a,t.chartData),h=d.area.wholeHeight,x=d.area.wholeWidth;switch(t.legend.position){case"top":t.area[0]+=h;break;case"bottom":t.area[2]+=h;break;case"left":t.area[3]+=x;break;case"right":t.area[1]+=x;}let c={},p=0;if("line"===t.type||"column"===t.type||"area"===t.type||"mix"===t.type||"candle"===t.type){if(c=calYAxisData(n,t,a),p=c.yAxisWidth,t.yAxis.showTitle){let e=0;for(let o=0;ot;t++)e.padding[t]*=e.pixelRatio;t.yAxisWidth=config.yAxisWidth*e.pixelRatio,t.xAxisHeight=config.xAxisHeight*e.pixelRatio,e.enableScroll&&e.xAxis.scrollShow&&(t.xAxisHeight+=6*e.pixelRatio),t.xAxisLineHeight=config.xAxisLineHeight*e.pixelRatio,t.fontSize=e.fontSize,t.titleFontSize=config.titleFontSize*e.pixelRatio,t.subtitleFontSize=config.subtitleFontSize*e.pixelRatio,t.toolTipPadding=config.toolTipPadding*e.pixelRatio,t.toolTipLineHeight=config.toolTipLineHeight*e.pixelRatio,t.columePadding=config.columePadding*e.pixelRatio,e.$this=e.$this?e.$this:this,this.context=uni.createCanvasContext(e.canvasId,e.$this),e.chartData={},this.event=new Event,this.scrollOption={currentOffset:0,startTouchX:0,distance:0,lastMoveTime:0},this.opts=e,this.config=t,drawCharts.call(this,e.type,e,t,this.context)};Charts.prototype.updateData=function(){let e=0生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default : + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/components/uni-calendar/uni-calendar-item.vue b/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 0000000..59cafca --- /dev/null +++ b/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/components/uni-calendar/uni-calendar.vue b/components/uni-calendar/uni-calendar.vue new file mode 100644 index 0000000..c612854 --- /dev/null +++ b/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,383 @@ + + + + + diff --git a/components/uni-calendar/util.js b/components/uni-calendar/util.js new file mode 100644 index 0000000..09b4c6c --- /dev/null +++ b/components/uni-calendar/util.js @@ -0,0 +1,327 @@ +import CALENDAR from './calendar.js' + +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range + } = {}) { + // 当前日期 + this.date = this.getDate(date) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.multipleStatus = { + before: '', + after: '', + data: [] + } + // 每周日期 + this.weeks = {} + + this._getWeek(this.date.fullDate) + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + let dateCompBefore = this.dateCompare(this.startDate, fullDate) + disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + } + + if (this.endDate) { + let dateCompAfter = this.dateCompare(fullDate, this.endDate) + disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + } + + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + month: full.month, + lunar: this.getlunar(full.year, full.month, i), + disable: !disableBefore || !disableAfter, + isDay + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + lunar: this.getlunar(full.year, Number(full.month) + 1, i), + disable: true + }) + } + return dateArr + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this._getWeek(date) + } + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + /** + * 计算阴历日期显示 + */ + getlunar(year, month, date) { + return CALENDAR.solar2lunar(year, month, date) + } + /** + * 设置打点 + */ + setSelectInfo(data, value) { + this.selected = value + this._getWeek(data) + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + if (!this.range) return + if (before && after) { + this.multipleStatus.before = '' + this.multipleStatus.after = '' + this.multipleStatus.data = [] + this._getWeek(fullDate) + } else { + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + this._getWeek(fullDate) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/components/xuan-loading/xuan-loading.vue b/components/xuan-loading/xuan-loading.vue new file mode 100644 index 0000000..42f8b94 --- /dev/null +++ b/components/xuan-loading/xuan-loading.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..91cb010 --- /dev/null +++ b/main.js @@ -0,0 +1,135 @@ +import Vue from 'vue' +import App from './App' +import encrypt from 'static/js/aes.js'; +import errorMsg from 'static/js/errorMsg.js' + +Vue.config.productionTip = false +// 挂载 全局变量 +Vue.prototype.devCode = "2aaecd0b124df819eda75e639a1f91fd"; +// Vue.prototype.serverUrl = "https://pqmcc.com:8040/shiningCloud"; +Vue.prototype.serverUrl = "http://112.4.156.196:8040/shiningCloud"; +// Vue.prototype.serverUrl = "http://www.pqmcc.com:8040/shiningCloud"; +Vue.prototype.key = "f81804778c89c779"; +Vue.prototype.getCid=function(){ + var that = this + // #ifdef APP-PLUS + var cid = plus.push.getClientInfo().clientid; + if(cid!=null&&cid!='null'&&cid!=''&&cid!=undefined){ + uni.setStorageSync('cid',cid); + console.log('setCid:'+cid); + var cidAES = encrypt.Encrypt(cid,'f81804778c89c779'); + uni.setStorageSync('cidAES',cidAES); + console.log('cidAES:'+cidAES); + }else{ + setTimeout(function() { + that.getCid(); + }, 50); + } + // #endif + } +Vue.prototype.setBadge = function(num){ + plus.runtime.setBadgeNumber(num); + // if(plus.device.vendor=='Apple'){ + // var GeTuiSdk = plus.ios.importClass('GeTuiSdk'); + // GeTuiSdk.setBadge(num); + // } +} +Vue.prototype.setNum=function(num,title,content){ + // #ifdef APP-PLUS + // console.log(num) + plus.runtime.setBadgeNumber(num,{ + title:title, + content:content + }); + // setTimeout(function(){ + // plus.runtime.setBadgeNumber(0,{ + // title:title, + // content:content + // }); + // },2000) + // #endif +} +Vue.prototype.createMessage=function(title,payload,content){ + // console.log(payload) + plus.push.createMessage(content,payload,{ + cover:false, + title:title + }); +} +Vue.prototype.cid = function(){ + var that= this; + var cidAES = uni.getStorageSync('cidAES'); + // var cid = uni.getStorageSync('cid'); + if(!(cidAES!=null&&cidAES!='null'&&cidAES!=''&&cidAES!=undefined)){ + setTimeout(function() { + return that.cid(); + }, 500); + }else{ + return cidAES; + } +} +Vue.prototype.judgeLogin = function(){ + var that= this; + if((!uni.getStorageSync('userInfo').userId)||(!uni.getStorageSync('userInfo').phone)){ + uni.showModal({ + title:"登录出现异常", + content:"请重新登录", + success: function (res) { + if (res.confirm) { + uni.clearStorageSync(); + uni.redirectTo({ + url: '/pages/login/login' + }); + return false; + } else if (res.cancel) { + return false; + } + } + }) + }else{ + return true; + } +} +Vue.prototype.showError= function(msgCode,msg){ + return errorMsg.judgeError(msgCode,msg); +} + +Vue.prototype.formatTime_mills=function(day) { + var d = new Date(day); + var year = d.getFullYear(); + var month = (d.getMonth() + 1)<10?"0"+(d.getMonth() + 1):(d.getMonth() + 1); + var date = d.getDate()<10?"0"+d.getDate():d.getDate(); + var hour = d.getHours()<10?"0"+d.getHours():d.getHours(); + var minute = d.getMinutes()<10?"0"+d.getMinutes():d.getMinutes(); + var second = d.getSeconds()<10?"0"+d.getSeconds():d.getSeconds(); + var mills = d.getMilliseconds()<10?"00"+d.getMilliseconds():(d.getMilliseconds()<100?"0"+d.getMilliseconds():d.getMilliseconds()); + return year + "-" + month + "-" + date + " " + hour+ ":" + minute + ":" + second+"."+mills; +} +Vue.prototype.formatTime_second=function(day) { + var d = new Date(day); + var year = d.getFullYear(); + var month = (d.getMonth() + 1)<10?"0"+(d.getMonth() + 1):(d.getMonth() + 1); + var date = d.getDate()<10?"0"+d.getDate():d.getDate(); + var hour = d.getHours()<10?"0"+d.getHours():d.getHours(); + var minute = d.getMinutes()<10?"0"+d.getMinutes():d.getMinutes(); + var second = d.getSeconds()<10?"0"+d.getSeconds():d.getSeconds(); + return year + "-" + month + "-" + date + " " + hour+ ":" + minute + ":" + second; +} +Vue.prototype.formatTime=function(day) { + var d = new Date(day); + var year = d.getFullYear(); + var month = (d.getMonth() + 1)<10?"0"+(d.getMonth() + 1):(d.getMonth() + 1); + var date = d.getDate()<10?"0"+d.getDate():d.getDate(); + // var hour = d.getHours()<10?"0"+d.getHours():d.getHours(); + // var minute = d.getMinutes()<10?"0"+d.getMinutes():d.getMinutes(); + // var second = d.getSeconds()<10?"0"+d.getSeconds():d.getSeconds(); + // var mills = d.getMilliseconds(); + return year + "-" + month + "-" + date; +} + +App.mpType = 'app' + +const app = new Vue({ + ...App +}) +app.$mount() diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..8254624 --- /dev/null +++ b/manifest.json @@ -0,0 +1,137 @@ +{ + "name" : "灿能云", + "appid" : "__UNI__903A5B1", + "description" : "", + "versionName" : "1.2.1", + "versionCode" : 121, + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "compatible" : { + "ignoreVersion" : true + }, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : { + "SQLite" : {}, + "Messaging" : {}, + "Speech" : {}, + "Push" : {} + }, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : { + "UIUserInterfaceStyle" : "Automatic", + "dSYMs" : false + }, + /* SDK配置 */ + "sdkConfigs" : { + "push" : { + "unipush" : {} + }, + "speech" : { + "ifly" : {} + }, + "ad" : {} + }, + "icons" : { + "android" : { + "hdpi" : "unpackage/res/icons/72x72.png", + "xhdpi" : "unpackage/res/icons/96x96.png", + "xxhdpi" : "unpackage/res/icons/144x144.png", + "xxxhdpi" : "unpackage/res/icons/192x192.png" + }, + "ios" : { + "appstore" : "unpackage/res/icons/1024x1024.png", + "ipad" : { + "app" : "unpackage/res/icons/76x76.png", + "app@2x" : "unpackage/res/icons/152x152.png", + "notification" : "unpackage/res/icons/20x20.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "proapp@2x" : "unpackage/res/icons/167x167.png", + "settings" : "unpackage/res/icons/29x29.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "spotlight" : "unpackage/res/icons/40x40.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png" + }, + "iphone" : { + "app@2x" : "unpackage/res/icons/120x120.png", + "app@3x" : "unpackage/res/icons/180x180.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "notification@3x" : "unpackage/res/icons/60x60.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "settings@3x" : "unpackage/res/icons/87x87.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png", + "spotlight@3x" : "unpackage/res/icons/120x120.png" + } + } + }, + "splashscreen" : { + "useOriginalMsgbox" : true + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "h5" : { + "devServer" : { + "port" : 9000 + } + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..3f9d311 --- /dev/null +++ b/pages.json @@ -0,0 +1,227 @@ +{ + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { + "path": "pages/login/login" + + }, + { + "path" : "pages/spectrum/spectrum", + "style" : {} + } + ,{ + "path" : "pages/condition/condition", + "style" : {} + }, + { + "path" : "pages/dataIntegrityDetails/dataIntegrityDetails", + "style" : {} + },{ + "path" : "pages/terminalStatus/terminalStatus", + "style" : {} + } + ,{ + "path": "pages/chooseLine/chooseLine", + "style": {} + } + ,{ + "path": "pages/index/index", + "style": { + // "navigationBarTitleText": "uni-app" + } + },{ + "path": "pages/report/report", + "style": { + // "backgroundColor":"#F0F0F0" + } + }, + { + "path": "pages/information/information", + "style": { + "enablePullDownRefresh": true + } + }, + { + "path": "pages/me/me", + "style": {} + }, + { + "path": "pages/levelUp/levelUp", + "style": {} + }, { + "path": "pages/transientDetails/transientDetails", + "style": {} + }, { + "path": "pages/preview/preview", + "style": {} + }, { + "path": "pages/vercode/vercode", + "style": {} + }, + { + "path": "pages/forgetPassword/forgetPassword", + "style": {} + }, { + "path": "pages/forgetPasswordVercode/forgetPasswordVercode", + "style": {} + }, { + "path": "pages/setNewPassword/setNewPassword", + "style": {} + }, { + "path": "pages/fastLogin/fastLogin", + "style": {} + }, { + "path": "pages/fastLoginVercode/fastLoginVercode", + "style": {} + }, { + "path": "pages/fastLoginSetPassword/fastLoginSetPassword", + "style": {} + }, + { + "path": "pages/data/data", + "style": {} + }, { + "path": "pages/history/history", + "style": {} + }, { + "path": "pages/userAgreement/userAgreement", + "style": { + "navigationStyle": "default", + "navigationBarTitleText": "用户协议", + "app-plus":{ + "titleNView":{ + "type":"default", + "titleText":"用户协议" + } + } + } + }, { + "path": "pages/privacyAgreement/privacyAgreement", + "style": { + "navigationStyle": "default", + "navigationBarTitleText": "隐私协议", + "app-plus":{ + "titleNView":{ + "type":"default", + "titleText":"隐私协议" + } + } + } + }, { + "path": "pages/modifyPassword/modifyPassword", + "style": {} + }, { + "path": "pages/modifyPasswordSetpassword/modifyPasswordSetpassword", + "style": {} + }, { + "path": "pages/modifyUserPhoneNum/modifyUserPhoneNum", + "style": {} + }, { + "path": "pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum", + "style": {} + }, { + "path": "pages/systemIntroduce/systemIntroduce", + "style": { + "navigationStyle": "default", + "navigationBarTitleText": "系统介绍", + "app-plus":{ + "titleNView":{ + "type":"default", + "titleText":"系统介绍" + } + } + } + }, { + "path": "pages/companyIntroduce/companyIntroduce", + "style": { + "navigationStyle": "default", + "navigationBarTitleText": "公司简介", + "app-plus":{ + "titleNView":{ + "type":"default", + "titleText":"公司简介" + } + } + } + }, { + "path": "pages/setting/setting", + "style": {} + } + + , { + "path": "pages/steady/steady", + "style": {} + }, { + "path": "pages/steadyDetails/steadyDetails", + "style": {} + }, { + "path": "pages/steadyIndex/steadyIndex", + "style": {} + }, { + "path": "pages/terminal/terminal", + "style": {} + }, { + "path": "pages/terminalDetails/terminalDetails", + "style": {} + }, { + "path": "pages/myApply/myApply", + "style": {} + }, { + "path" : "pages/setNewMessage/setNewMessage", + "style" : {} + } + ,{ + "path" : "pages/terminalHistory/terminalHistory", + "style" : {} + } + ,{ + "path" : "pages/transientWave/transientWave", + "style" : {} + } + ,{ + "path" : "pages/us/us", + "style" : {} + } + ,{ + "path" : "pages/terminalStatusAll/terminalStatusAll", + "style" : {} + } + ], + "tabBar": { + "color": "#333333", + "selectedColor": "#3982FC", + "borderStyle": "black", + "backgroundColor": "#ffffff", + "list": [{ + "pagePath": "pages/information/information", + "iconPath": "static/pic/information.png", + "selectedIconPath": "static/pic/information_click.png", + "text": "信息" + }, { + "pagePath": "pages/data/data", + "iconPath": "static/pic/data.png", + "selectedIconPath": "static/pic/data_click.png", + "text": "实时数据" + }, { + "pagePath": "pages/history/history", + "iconPath": "static/pic/history.png", + "selectedIconPath": "static/pic/history_click.png", + "text": "历史数据" + }, { + "pagePath": "pages/report/report", + "iconPath": "static/pic/report.png", + "selectedIconPath": "static/pic/report_click.png", + "text": "报表任务" + }, { + "pagePath": "pages/me/me", + "iconPath": "static/pic/me.png", + "selectedIconPath": "static/pic/me_click.png", + "text": "个人中心" + }] + }, + "globalStyle": { + "navigationStyle": "custom", + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + } +} diff --git a/pages/chooseLine/chooseLine.css b/pages/chooseLine/chooseLine.css new file mode 100644 index 0000000..f40a42a --- /dev/null +++ b/pages/chooseLine/chooseLine.css @@ -0,0 +1,393 @@ +page{ + background: rgba(249,249,249,1);; +} +/* 主体开始 */ +/* 分割线 */ +.line{ + background: #F0F0F0; + height: 20rpx; +} +.line-fine{ + background: #F0F0F0; + height: 2rpx; +} +/* 时间开始 */ +.time-block{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + padding: 0 40rpx; + background: #FFFFFF 100%; +} +.time-block-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 44rpx; + align-items: center; +} +.calendar-pic{ + height: 44rpx; + width: 44rpx; +} +.time-text{ + color: #303233; + font-size: 30rpx; + margin-left: 20rpx; +} +.time-block-right{ + height: 44rpx; + width: 44rpx; +} +.confirm-button{ + height: 92rpx; + width: 100%; +} +/* 时间结束 */ +.chooseLine-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +/* 搜索开始 */ +.search-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + height: 126rpx; + padding: 0 40rpx; + background: #FFFFFF; +} +.search-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + height: 60rpx; + width: 580rpx; + background:rgba(249,249,249,1); + border-radius:2px; +} +.search-pic{ + width: 28rpx; + height: 28rpx; + margin-left: 20rpx; +} +.search-input{ + margin-left: 14rpx; + color: #4A4A4A; + font-size: 28rpx; +} +.search-input-placeholder{ + font-size: 28rpx; + color: #999999; +} +.search-text{ + color: #3982FC; + font-size: 28rpx; + margin-left: 34rpx; +} +/* 搜索结束 */ +/* 排序开始 */ +.order-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: 102rpx; + padding: 0 40rpx; + background: #FFFFFF; + box-sizing: border-box; +} +.order-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + white-space: nowrap; +} +.order-left-text{ + color: #333333; + font-size: 30rpx; +} +.order-left-pic{ + height: 44rpx; + width: 44rpx; + margin-left: 8rpx; +} +.order-center{ + display: flex; + flex-direction: row; + justify-content: flex-start; + white-space: nowrap; +} +.order-center-text{ + font-size: 30rpx; + color: #333333; +} +.order-center-text-choose{ + font-size: 30rpx; + color: #3982FC; +} +.order-center-pic{ + height: 44rpx; + width: 44rpx; + margin-left: 8rpx; +} +.order-right{ + display: flex; + flex-direction: row; + justify-content: flex-start; + white-space: nowrap; +} +.order-right-text{ + font-size: 30rpx; + color: #333333; +} +.order-right-text-choose{ + font-size: 30rpx; + color: #3982FC; +} +.order-right-pic{ + height: 44rpx; + width: 44rpx; + margin-left: 8rpx; +} +/* 排序结束 */ +/* 选择开始 */ +.picker-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.select-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 60rpx; + padding: 0 40rpx; + background: #FFFFFF; + box-sizing: border-box; + width: 100%; +} +.select-province{ + font-size: 30rpx; + color: #333333; + display: flex; + flex-direction: row; + justify-content: center; + width: 90rpx; +} +.select-province-text{ + width: 90rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: right; +} +.select-company{ + font-size: 30rpx; + color: #333333; + display: flex; + flex-direction: row; + justify-content: center; + width: 230rpx; +} +.select-company-text{ + width: 230rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: right; +} +.select-substation{ + font-size: 30rpx; + color: #333333; + display: flex; + flex-direction: row; + justify-content: center; + width: 230rpx; +} +.select-substation-text{ + width: 230rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: right; +} +.show-line-block{ + padding: 0 40rpx; + background: #FFFFFF; + box-sizing: border-box; +} +.left-block{ + width:110rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + background: #FFFFFF; +} +.province{ + height: 96rpx; + width:110rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #333333; + font-size: 28rpx; +} +.province-text{ + width:110rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; +} +.province-selected{ + height: 96rpx; + width:110rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: rgba(57,130,252,1); + font-size: 28rpx; + background:rgba(249,249,249,1); + border-left: 4px solid rgba(57,130,252,1); +} +.company-block{ + width: 234rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 6rpx; +} +.company{ + height: 96rpx; + width:234rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #333333; + font-size: 28rpx; +} +.company-text{ + width:234rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.company-selected{ + height: 96rpx; + width:234rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: rgba(57,130,252,1); + font-size: 28rpx; +} +.substation-block{ + width: 234rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 6rpx; +} +.substation{ + height: 96rpx; + width:234rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #333333; + font-size: 28rpx; +} +.substation-text{ + width:234rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.substation-selected{ + height: 96rpx; + width:234rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: rgba(57,130,252,1); + font-size: 28rpx; +} +.line-block{ + width: 154rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 6rpx; +} +.line{ + height: 96rpx; + width:154rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #333333; + font-size: 28rpx; +} +.line-text{ + width:154rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.line-selected{ + height: 96rpx; + /* width:154rpx; */ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: rgba(57,130,252,1); + font-size: 28rpx; + white-space: nowrap; +} +/* 选择结束 */ +/* 模糊查询结果开始 */ +.search-result-block{ + background: #FFFFFF; + padding: 20rpx 40rpx 0 40rpx; + box-sizing: border-box; +} +.each-block{ + color: #999999; + font-size: 24rpx; + margin-bottom: 20rpx; +} +/* 模糊查询结果结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/chooseLine/chooseLine.vue b/pages/chooseLine/chooseLine.vue new file mode 100644 index 0000000..14e1c7d --- /dev/null +++ b/pages/chooseLine/chooseLine.vue @@ -0,0 +1,452 @@ + + + + + diff --git a/pages/companyIntroduce/companyIntroduce.vue b/pages/companyIntroduce/companyIntroduce.vue new file mode 100644 index 0000000..3d35146 --- /dev/null +++ b/pages/companyIntroduce/companyIntroduce.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/pages/condition/condition.css b/pages/condition/condition.css new file mode 100644 index 0000000..8860527 --- /dev/null +++ b/pages/condition/condition.css @@ -0,0 +1,54 @@ +/* 主体开始 */ +.condition-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +/* 选项开始 */ +.each-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + height: 92rpx; + align-items: center; + border-bottom: solid 1px #F0F0F0; + padding: 0 40rpx; +} +.each-left{ + width: 596rpx; + height: 42rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} +.name-block{ + height: 42rpx; + color: #303233; + font-size: 30rpx; +} +.content-block{ + height: 36rpx; + font-size: 26rpx; + color: #999999; + width: 400rpx; + text-align: right; +} +.each-right{ + height: 44rpx; + width: 44rpx; + margin-left: 40rpx; +} +/* 选项结束 */ +.button-block{ + width:658rpx; + height:80rpx; + background:rgba(57,130,252,1); + border-radius:40rpx; + margin-top: 80rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* 主体结束 */ \ No newline at end of file diff --git a/pages/condition/condition.vue b/pages/condition/condition.vue new file mode 100644 index 0000000..7cfc871 --- /dev/null +++ b/pages/condition/condition.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/pages/data/data.css b/pages/data/data.css new file mode 100644 index 0000000..1611692 --- /dev/null +++ b/pages/data/data.css @@ -0,0 +1,621 @@ +page{ + background: #F0F0F0; +} +.title-padding{ + height: var(--status-bar-height); + background: #FFFFFF 100%; +} +/* 标题开始 */ +.data-title{ + background: #FFFFFF 100%; + height: 88rpx; + border-bottom: 2rpx solid #F0F0F0; +} +.data-title-text{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 32rpx; + color: #171F24; + height: 88rpx; +} +/* 标题结束 */ +/* 主体开始 */ +.data-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.status-block{ + background: #FFFFFF 100%; + height: 80rpx; + border-bottom: 1px solid #f0f0f0; + font-size: 28rpx; + color: #333333; + padding: 0 40rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} +.status-block-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.status-block-sucess-text{ + color: #78D50E; +} +.status-block-false-text{ + color: #FF5059; +} +.status-block-click-text{ + margin-left: 10rpx; + color: #3982FC; +} +/* 基本信息开始 */ +.data-first-block{ + background: #FFFFFF 100%; + height: 400rpx; + padding: 30rpx; + display: flex; + flex-direction: column; + justify-content: center; + box-sizing:border-box +} +.data-first-top{ + display: flex; + flex-direction: row; + height: 44rpx; + justify-content: flex-end; + align-items: center; + width: 690rpx; +} +.data-first-top-text{ + margin-right: 14rpx; + height: 44rpx; + white-space: nowrap; + font-size: 28rpx; + color: #333333; + text-align: right; +} +.data-first-top-pic{ + height: 44rpx; + width: 44rpx; +} +.data-first-bottom{ + width: 690rpx; + height: 276rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + background-image: url('../../static/pic/data_background.png'); + background-size: 100% 100%; + margin-top: 20rpx; + padding: 0 40rpx; + box-sizing:border-box +} +.data-first-bottom-line-one{ + height: 44rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + margin-top: 24rpx; +} +.data-first-bottom-title{ + height: 36rpx; + width: 182rpx; + font-size: 26rpx; + color: #FFFFFF; + white-space: nowrap; +} +.data-first-bottom-line-one-right{ + font-size: 32rpx; + color: #FFFFFF; + white-space: nowrap; +} +.data-first-bottom-line-two{ + height: 44rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + margin-top: 12rpx; +} +.data-first-bottom-line-two-right{ + font-size: 32rpx; + color: #FFFFFF; + white-space: nowrap; +} +.data-first-bottom-line-three{ + height: 44rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + margin-top: 14rpx; +} +.data-first-bottom-line-three-right{ + font-size: 32rpx; + color: #78D50E; + white-space: nowrap; +} +.data-first-bottom-line-three-false{ + font-size: 32rpx; + color: #FF5059; + white-space: nowrap; +} +.data-first-bottom-line-four{ + height: 48rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + margin-top: 14rpx; + margin-bottom: 32rpx; +} +.data-first-bottom-line-four-left{ + height: 352rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; +} +.data-first-bottom-line-four-left-text{ + font-size: 40rpx; + color: #FFFFFF; + width: 190rpx; +} +.data-first-bottom-line-four-right{ + margin-left: 32rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; +} +.data-first-bottom-line-four-right-title{ + height: 36rpx; + width: 78rpx; + color: #FFFFFF; + font-size: 26rpx; +} +.data-first-bottom-line-four-right-text{ + font-size: 40rpx; + color: #FFFFFF; +} +/* 基本信息结束 */ +/* 图形开始 */ +.data-second-block{ + height: 668rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + box-sizing: border-box; + background: #FFFFFF 100%; +} +.data-second-block-img{ + height: 44rpx; + width:44rpx; + margin-right: 20rpx; +} +.data-second-block-time{ + height: 42rpx; + color: #000000; + font-size: 30rpx; + margin-right: 40rpx; + white-space: nowrap; +} +.data-second-block-button{ + height: 78rpx; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + margin-top: 20rpx; + padding: 30rpx 30rpx 0 30rpx; + box-sizing: border-box; + background: #FFFFFF 100%; +} +.button-spectrum{ + height: 48rpx; + width: 140rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #FFFFFF; + background: #3982FC; + border-radius:24rpx; + font-size: 24rpx; + margin-right: 20rpx; +} +.button-refresh{ + height: 48rpx; + width: 140rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #FFFFFF; + background: #3982FC; + border-radius:24rpx; + font-size: 24rpx; +} +.button-refresh-done{ + height: 48rpx; + width: 140rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #FFFFFF; + background: #D9D9D9; + border-radius:24rpx; + font-size: 24rpx; +} +.data-second-block-pic{ + height: 504rpx; + margin-top: 56rpx; + display: flex; + flex-direction: row; + justify-content: center; +} +.data-second-block-pic-left{ + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 504rpx; + width: 140rpx; + margin-right: 20rpx; + align-items: flex-end; +} +.data-second-block-pic-left-first{ + background-image: url('../../static/pic/KV_A.png'); + background-size: 100% 100%; + height: 122rpx; + width: 122rpx; + margin-bottom: 28rpx; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: flex-end; + position: relative; +} +.maxKVA{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 16rpx; + left: 90%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.minKVA{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 84%; + left: 26rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.data-second-block-pic-left-second{ + background-image: url('../../static/pic/KV_B.png'); + background-size: 100% 100%; + height: 122rpx; + width: 122rpx; + margin-bottom: 28rpx; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: flex-end; + position: relative; +} +.maxKVB{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 16rpx; + left: 90%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.minKVB{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 84%; + left: 26rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.data-second-block-pic-left-third{ + background-image: url('../../static/pic/KV_C.png'); + background-size: 100% 100%; + height: 122rpx; + width: 122rpx; + margin-bottom: 24rpx; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: flex-end; + position: relative; +} +.maxKVC{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 16rpx; + left: 90%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.minKVC{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 84%; + left: 26rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.data-second-block-pic-left-text{ + font-size: 28rpx; + color: #333333; + white-space: nowrap; +} +.data-second-block-pic-center{ + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 504rpx; + width: 298rpx; + align-items: center; +} +.data-second-block-pic-center-pic{ + background-image: url('../../static/pic/dashboard.png'); + background-size: 100% 100%; + height: 298rpx; + width: 298rpx; + margin-bottom: 98rpx; + position: relative; +} +.data-second-block-pic-center-text{ + height: 80rpx; + width: 182rpx; + font-size: 28rpx; + color: #333333; + text-align: center; +} +.data-second-block-pic-right{ + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 504rpx; + width: 140rpx; + margin-left: 20rpx; + align-items: flex-start; +} +.data-second-block-pic-right-first{ + background-image: url('../../static/pic/A_A.png'); + background-size: 100% 100%; + height: 122rpx; + width: 122rpx; + margin-bottom: 28rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + position: relative; +} +.minAA{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 16rpx; + left: -4rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.maxAA{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 84%; + left: 60%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.data-second-block-pic-right-second{ + background-image: url('../../static/pic/A_B.png'); + background-size: 100% 100%; + height: 122rpx; + width: 122rpx; + margin-bottom: 28rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + position: relative; +} +.minAB{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 16rpx; + left: -4rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.maxAB{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 84%; + left: 60%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.data-second-block-pic-right-third{ + background-image: url('../../static/pic/A_C.png'); + background-size: 100% 100%; + height: 122rpx; + width: 122rpx; + margin-bottom: 28rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-end; + position: relative; +} +.minAC{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 16rpx; + left: -6rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.maxAC{ + position: absolute; + height: 20rpx; + width: 20rpx; + font-size: 15rpx; + top: 84%; + left: 60%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.data-second-block-pic-right-text{ + font-size: 28rpx; + color: #333333; + white-space: nowrap; +} +.pointer-left{ + height: 12rpx; + width: 82rpx; + margin-bottom: 4rpx; +} +.pointer-right{ + height: 82rpx; + width: 12rpx; + margin-bottom: 8rpx; +} +.current{ + height: 8rpx; + position: absolute; + z-index: 66; + top: 144rpx; + left: 132rpx; +} +.voltage{ + width: 128rpx; + height: 8rpx; + position: absolute; + z-index: 99; + top: 144rpx; + left: 132rpx; +} +/* 图形结束 */ +/* 具体数据开始 */ +.data-third-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + height: 888rpx; + background: #FFFFFF; + margin-top: 20rpx; + box-sizing: border-box; + padding: 30rpx 0; +} +.data-third-block-line{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + border-bottom: 2rpx solid #F0F0F0; + align-items: center; + padding: 0 40rpx; + box-sizing: border-box; +} +.data-third-block-line-left{ + height: 42rpx; + width: 240rpx; + font-size: 30rpx; + color: #303233; + text-align: left; + align-items: center; +} +.data-third-block-line-right{ + height: 36rpx; + width: 390rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + font-size: 26rpx; + color: #999999; + align-items: center; + white-space: nowrap; +} +.data-third-block-line-right-A{ + height: 32rpx; + width: 133rpx; + text-align: center; + white-space: nowrap; +} +.data-third-block-line-right-B{ + height: 32rpx; + width: 133rpx; + text-align: center; + white-space: nowrap; + color: #303233; +} +.no-data{ + color: #FF5059; + background: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* 具体数据结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/data/data.vue b/pages/data/data.vue new file mode 100644 index 0000000..9aa3b23 --- /dev/null +++ b/pages/data/data.vue @@ -0,0 +1,1062 @@ + + + + + diff --git a/pages/dataIntegrityDetails/dataIntegrityDetails.css b/pages/dataIntegrityDetails/dataIntegrityDetails.css new file mode 100644 index 0000000..a8cbeac --- /dev/null +++ b/pages/dataIntegrityDetails/dataIntegrityDetails.css @@ -0,0 +1,168 @@ +page{ + background: #F0F0F0; +} +/* 分割线 */ +.line{ + background: #F0F0F0; + height: 20rpx; +} +.line-fine{ + background: #F0F0F0; + height: 2rpx; +} +/* 时间开始 */ +.time-block{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + padding: 0 40rpx; + background: #FFFFFF 100%; +} +.time-block-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 44rpx; + align-items: center; +} +.calendar-pic{ + height: 44rpx; + width: 44rpx; +} +.time-text{ + color: #303233; + font-size: 30rpx; + margin-left: 20rpx; +} +.time-block-right{ + height: 44rpx; + width: 44rpx; +} +/* 时间结束 */ +/* 总览开始 */ +.overview-block{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + padding: 0 40rpx; + background: #FFFFFF 100%; +} +.overview-block-text{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.overview-block-text-left{ + color: #303233; + font-size: 30rpx; + margin-left: 20rpx; +} +.overview-block-text-right{ + color: #FF5059; + font-size: 30rpx; + margin-left: 20rpx; +} +/* 总览结束 */ +/* 图片开始 */ +.pic-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + box-sizing: border-box; + padding: 30rpx 40rpx; + background: #FFFFFF; + margin-top: 20rpx; +} +.pic-block-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 42rpx; + align-items: center; +} +.pic-block-title-left{ + height: 34rpx; + width: 6rpx; +} +.pic-block-title-right{ + color: #000000; + font-size: 30rpx; + margin-left: 14rpx; +} +.pic-block-pic{ + height: 378rpx; + width: 670rpx; + margin-top: 30rpx; +} +/* 图片结束 */ +/* 画图开始 */ +.canvasView{ +} +.ec-canvas{ + +} +.legend-block{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.legend-block-left{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.legend-block-left-color{ + height: 30rpx; + width: 30rpx; + background: #DAA520; +} +.legend-block-left-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +.legend-block-right{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 20rpx; +} +.legend-block-right-color{ + height: 30rpx; + width: 30rpx; + background: #2E8B57; +} +.legend-block-right-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +/* 画图结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ \ No newline at end of file diff --git a/pages/dataIntegrityDetails/dataIntegrityDetails.vue b/pages/dataIntegrityDetails/dataIntegrityDetails.vue new file mode 100644 index 0000000..9154be0 --- /dev/null +++ b/pages/dataIntegrityDetails/dataIntegrityDetails.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/pages/fastLogin/fastLogin.css b/pages/fastLogin/fastLogin.css new file mode 100644 index 0000000..a2bbc0f --- /dev/null +++ b/pages/fastLogin/fastLogin.css @@ -0,0 +1,107 @@ +/* 主体开始 */ +.content-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 40rpx; + margin-top: 46rpx; + margin-right: 40rpx; +} + +.login-detail{ + width: 644rpx; + height: 40rpx; + margin-top: 40rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.choose-block{ + width: 28rpx; + height: 28rpx; + font-size: 28rpx; + white-space: nowrap; +} +.choose-pic{ + width: 28rpx; + height: 28rpx; +} +.login-agreement{ + margin-left: 14rpx; + font-size: 28rpx; + color: #333333; + white-space: nowrap; +} +.login-user{ + font-size: 28rpx; + color: #517FB0; + white-space: nowrap; +} +/* 手机号开始 */ +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + +} + +.num{ + font-size: 30rpx; + color: #333333; + margin-bottom: 24rpx; +} +.pull{ + width: 44rpx; + height: 44rpx; + margin-bottom: 20rpx; +} +.phone{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.phone-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.phone-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.phone-pic{ + width: 20rpx; + height: 20rpx; +} +/* 手机号结束 */ +/* 下一步按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 下一步按钮结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/fastLogin/fastLogin.vue b/pages/fastLogin/fastLogin.vue new file mode 100644 index 0000000..7913913 --- /dev/null +++ b/pages/fastLogin/fastLogin.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/pages/fastLoginSetPassword/fastLoginSetPassword.css b/pages/fastLoginSetPassword/fastLoginSetPassword.css new file mode 100644 index 0000000..86f4f40 --- /dev/null +++ b/pages/fastLoginSetPassword/fastLoginSetPassword.css @@ -0,0 +1,67 @@ +/* 主体开始 */ +.setNew-block{ + display: flex; + flex-direction: column; + margin: 0rpx 40rpx 0rpx 40rpx; + justify-content: flex-start; +} +.text-top{ + font-size: 30rpx; + color:rgba(51,51,51,1); + margin-top: 40rpx; +} +.password-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + border-bottom: solid 1px rgba(217,217,217,1); + margin-top: 30rpx; +} +.password-input{ + font-size: 44rpx; + color: #333333; +} + +.password-placeholder-input{ + color:#CCCCCC; + font-size:30rpx; +} +.see-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.see{ + width: 36rpx; + height: 36rpx; +} +.text-bottom{ + font-size: 28rpx; + color: #333333; + margin-top: 40rpx; +} +/* 获取验证码按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 获取验证码按钮结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/fastLoginSetPassword/fastLoginSetPassword.vue b/pages/fastLoginSetPassword/fastLoginSetPassword.vue new file mode 100644 index 0000000..5e1ee4f --- /dev/null +++ b/pages/fastLoginSetPassword/fastLoginSetPassword.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/pages/fastLoginVercode/fastLoginVercode.css b/pages/fastLoginVercode/fastLoginVercode.css new file mode 100644 index 0000000..3e66e5d --- /dev/null +++ b/pages/fastLoginVercode/fastLoginVercode.css @@ -0,0 +1,93 @@ +.text_block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + margin-top: 60rpx; +} +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 18rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +/* 下一步按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 下一步按钮结束 */ \ No newline at end of file diff --git a/pages/fastLoginVercode/fastLoginVercode.vue b/pages/fastLoginVercode/fastLoginVercode.vue new file mode 100644 index 0000000..1742010 --- /dev/null +++ b/pages/fastLoginVercode/fastLoginVercode.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/pages/forgetPassword/forgetPassword.css b/pages/forgetPassword/forgetPassword.css new file mode 100644 index 0000000..80caabf --- /dev/null +++ b/pages/forgetPassword/forgetPassword.css @@ -0,0 +1,78 @@ +/* 主体开始 */ +.content-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 40rpx; + margin-top: 46rpx; + margin-right: 40rpx; +} +/* 手机号开始 */ +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + +} + +.num{ + font-size: 30rpx; + color: #333333; + margin-bottom: 24rpx; +} +.pull{ + width: 44rpx; + height: 44rpx; + margin-bottom: 20rpx; +} +.phone{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.phone-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.phone-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.phone-pic{ + width: 20rpx; + height: 20rpx; + margin-bottom: 32rpx; +} + +/* 手机号结束 */ +/* 下一步按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 下一步按钮结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/forgetPassword/forgetPassword.vue b/pages/forgetPassword/forgetPassword.vue new file mode 100644 index 0000000..b665fe5 --- /dev/null +++ b/pages/forgetPassword/forgetPassword.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/pages/forgetPasswordVercode/forgetPasswordVercode.css b/pages/forgetPasswordVercode/forgetPasswordVercode.css new file mode 100644 index 0000000..6631e09 --- /dev/null +++ b/pages/forgetPasswordVercode/forgetPasswordVercode.css @@ -0,0 +1,96 @@ +.text_block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + margin-top: 60rpx; +} +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; + margin-bottom: 32rpx; + margin-right: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 10rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; + font-weight:400; +} +/* 下一步按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 下一步按钮结束 */ \ No newline at end of file diff --git a/pages/forgetPasswordVercode/forgetPasswordVercode.vue b/pages/forgetPasswordVercode/forgetPasswordVercode.vue new file mode 100644 index 0000000..64ef34c --- /dev/null +++ b/pages/forgetPasswordVercode/forgetPasswordVercode.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/pages/history/history.css b/pages/history/history.css new file mode 100644 index 0000000..6bd6135 --- /dev/null +++ b/pages/history/history.css @@ -0,0 +1,160 @@ +page{ + background: #F0F0F0; +} +.title-padding{ + height: var(--status-bar-height); + background: #FFFFFF 100%; +} +/* 标题开始 */ +.history-title{ + background: #FFFFFF 100%; + height: 88rpx; + border-bottom: 2rpx solid #F0F0F0; +} +.history-title-text{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 32rpx; + color: #171F24; + height: 88rpx; +} +/* 标题结束 */ +/* 主体开始 */ +.content-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + background: #FFFFFF 100%; +} +.content-block-line{ + display: flex; + flex-direction: row; + justify-content: space-between; + box-sizing: border-box; + padding: 0 40rpx; + align-items: center; + height: 92rpx; + border-bottom: 2rpx solid #F0F0F0; +} +.content-block-line-left{ + color: #303233; + font-size: 30rpx; +} +.content-block-line-right{ + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.content-block-line-right-text{ + color: #3982FC; + font-size: 30rpx; + margin-right: 40rpx; +} +.content-block-line-right-pic{ + height: 44rpx; + width: 44rpx; +} +.sroll-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.sroll-block-line-one{ + display: flex; + flex-direction: row; + height: 122rpx; + justify-content: space-between; + align-items: center; + background: #FFFFFF; + box-sizing: border-box; + padding: 0 40rpx; + margin-top: 20rpx; + border-bottom: solid #F0F0F0 1px; +} +.sroll-block-line-one-text{ + margin-right: 14rpx; + height: 44rpx; + white-space: nowrap; + font-size: 32rpx; + color: #333333; + text-align: left; + display: flex; + flex-direction: column; + justify-content: center; +} +.sroll-block-line-one-pic{ + height: 44rpx; + width: 44rpx; +} +.sroll-block-content{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-bottom: 20rpx; + height: 236rpx; + background: #FFFFFF; +} +.sroll-block-content-line-one{ + height: 88rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 0 40rpx; + box-sizing: border-box; +} +.sroll-block-content-line-one-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 42rpx; + align-items: center; +} +.sroll-block-content-line-one-left-pic{ + height: 34rpx; + width: 6rpx; +} +.sroll-block-content-line-one-left-text{ + margin-left: 14rpx; + font-size: 30rpx; + color: #000000; +} +.sroll-block-content-line-one-right{ + height: 44rpx; + width: 44rpx; +} +.sroll-block-content-line{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: 92rpx; + border-bottom: 2rpx solid #F0F0F0; + padding: 0 40rpx; + box-sizing: border-box; +} +.sroll-block-content-line-text{ + height: 124rpx; + font-size: 24rpx; + padding: 2rpx 40rpx; + box-sizing: border-box; +} +.sroll-block-content-line-left{ + color: #303233; + font-size: 30rpx; +} +.sroll-block-content-line-right{ + color: #999999; + font-size: 26rpx; +} +.no-data{ + color: #FF5059; + /* background: #FFFFFF; */ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* 主体结束 */ diff --git a/pages/history/history.vue b/pages/history/history.vue new file mode 100644 index 0000000..5d455db --- /dev/null +++ b/pages/history/history.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/pages/index/index.css b/pages/index/index.css new file mode 100644 index 0000000..8dcdef4 --- /dev/null +++ b/pages/index/index.css @@ -0,0 +1,102 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.spectrum-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.line-block{ + height: 94rpx; + font-size: 30rpx; + color: #000000; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + padding: 0 40rpx; + box-sizing: border-box; + background: #FFFFFF; +} +/* tab选项开始 */ +.tab-block{ + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: flex-end; + background: #FFFFFF 100%; + margin-top: 2rpx; +} +.tab{ + font-size: 28rpx; + color: #333333; + white-space: nowrap; + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: flex-end; +} +.tab-click{ + font-size: 28rpx; + color: #3982FC; + white-space: nowrap; + border-bottom: solid 2rpx #3982FC; +} +/* tab选项结束 */ +/* 画图开始 */ +.echarts-block{ + display: flex; + flex-direction: column; + background: #FFFFFF; +} +.ec-canvas{ + display: flex; + flex: 1; +} +.canvasView{ +} +.legend-block{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.legend-block-left{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.legend-block-left-color{ + height: 30rpx; + width: 30rpx; + background: #DAA520; +} +.legend-block-left-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +.legend-block-right{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 20rpx; +} +.legend-block-right-color{ + height: 30rpx; + width: 30rpx; + background: #2E8B57; +} +.legend-block-right-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +/* 画图结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..14ba7cf --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/pages/information/information.css b/pages/information/information.css new file mode 100644 index 0000000..e9d20bd --- /dev/null +++ b/pages/information/information.css @@ -0,0 +1,253 @@ +page{ + background: #F0F0F0; +} +.title-padding{ + height: var(--status-bar-height); + background: #FFFFFF 100%; +} +/* 主体开始 */ +.data-body{ + background: #F0F0F0; + display: flex; + flex-direction: column; +} +/* 标题开始 */ +.data-title{ + background: #FFFFFF 100%; + height: 88rpx; +} +.data-title-text{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 32rpx; + color: #171F24; + height: 88rpx; +} +/* 标题结束 */ +/* tab选项开始 */ +.data-tab{ + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: flex-end; + background: #FFFFFF 100%; + margin-top: 2rpx; + position: relative; +} +.tab-noread-num-transient{ + width: 36rpx; + height: 36rpx; + background-image: url('../../static/pic/number.png'); + background-size: 100% 100%; + font-size: 20rpx; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + position: absolute; + left: 204rpx; + top: 10rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-noread-num-steady{ + width: 36rpx; + height: 36rpx; + background-image: url('../../static/pic/number.png'); + background-size: 100% 100%; + font-size: 20rpx; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + position: absolute; + left: 454rpx; + top: 10rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-noread-num-terminal{ + width: 36rpx; + height: 36rpx; + background-image: url('../../static/pic/number.png'); + background-size: 100% 100%; + font-size:20rpx; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + position: absolute; + left: 704rpx; + top: 10rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab{ + height: 64rpx; + font-size: 28rpx; + color: #333333; + white-space: nowrap; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-click{ + font-size: 28rpx; + color: #3982FC; + white-space: nowrap; + border-bottom: solid 2rpx #3982FC; + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* tab选项结束 */ + +/* 暂态开始 */ +/* 下拉刷新开始 */ +.pull-block{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + color: #666666; + font-size: 24rpx; +} +/* 下拉刷新结束 */ +.transient-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.transient-event-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 20rpx; + background: #FFFFFF 100%; + position: relative; +} +.steady-event-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 20rpx; + background: #FFFFFF 100%; + position: relative; +} +.transient-event{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 260rpx; + align-items: center; +} +.steady-event{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 180rpx; + align-items: center; +} +.transient-event-time{ + font-size: 24rpx; + color: #999999; + margin-left: 444rpx; + height: 34rpx; + margin-bottom: 12rpx; + white-space: nowrap; +} +.transient-event-pic{ + width: 124rpx; + height: 200rpx; + margin-left: 40rpx; +} +.steady-event-pic{ + width: 124rpx; + height: 124rpx; + margin-left: 40rpx; +} +.transient-event-noread{ + position: absolute; + width: 20rpx; + height: 20rpx; + left: 154rpx; + top: 22rpx; +} +.transient-event-content{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 20rpx; + width: 566rpx; +} +.line-one{ + width: 566rpx; + height: 120rpx; + font-size: 28rpx; + color: #000000; +} +.line-two{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline ; +} +.line-two-left{ + width: 200rpx; + height: 38rpx; + background: #F4F4F4; + border-radius: 18rpx; + font-size: 24rpx; + color: #333333; + text-align: center; + white-space: nowrap; + /* display: flex; + flex-direction: row; + justify-content: center; + align-items: center; */ +} +.line-two-right{ + font-size: 24rpx; + color: #333333; + margin-left: 16rpx; +} +.line-three{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline ; + margin-top: 21rpx; +} +.line-three-left{ + width: 200rpx; + height: 38rpx; + background: #F4F4F4; + border-radius: 18rpx; + font-size: 24rpx; + color: #333333; + text-align: center; +} +.line-three-right{ + font-size:24rpx; + color: #333333; + margin-left: 16rpx; +} +/* 暂态结束 */ +.no-data{ + color: #FF5059; + /* background: #FFFFFF; */ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* 主体结束 */ \ No newline at end of file diff --git a/pages/information/information.vue b/pages/information/information.vue new file mode 100644 index 0000000..1bf01cd --- /dev/null +++ b/pages/information/information.vue @@ -0,0 +1,797 @@ + + + + + diff --git a/pages/levelUp/levelUp.css b/pages/levelUp/levelUp.css new file mode 100644 index 0000000..3e5f97e --- /dev/null +++ b/pages/levelUp/levelUp.css @@ -0,0 +1,47 @@ +.levelUp-block{ + margin: 0 40rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.levelUp-text{ + margin-top: 60rpx; + color: #333333; + font-size: 38rpx; +} +.levelUp-input{ + border-bottom: solid 1px rgba(217,217,217,1); + margin-top: 60rpx; + font-size: 36rpx; + color: #333333; + text-align: center; +} +.levelUp-input-ph{ + color: #9B9B9B; + font-size: 30rpx; + text-align: center; +} +.levelUp-click{ + margin-top: 160rpx; + width:658rpx; + height:80rpx; + background:rgba(57,130,252,1); + border-radius:20px; + color: rgba(108,163,255,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.levelUp-click-high{ + margin-top: 160rpx; + width:658rpx; + height:80rpx; + background:rgba(57,130,252,1); + border-radius:20px; + color: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} \ No newline at end of file diff --git a/pages/levelUp/levelUp.vue b/pages/levelUp/levelUp.vue new file mode 100644 index 0000000..0dcddcb --- /dev/null +++ b/pages/levelUp/levelUp.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/pages/login/login.css b/pages/login/login.css new file mode 100644 index 0000000..529c50f --- /dev/null +++ b/pages/login/login.css @@ -0,0 +1,199 @@ +/* 主体开始 */ +.content-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 40rpx; + margin-top: 54rpx; + margin-right: 40rpx; +} +.login-explain{ + /* 字体PingFangSC-Regular */ + font-size: 56rpx; + color: #000000; + /* color: #3928FC; */ +} +.login-detail{ + width: 494rpx; + height: 40rpx; + margin-top: 14rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; +} +.login-agreement{ + font-size: 28rpx; + color: #999999; + white-space: nowrap; +} +.login-user{ + font-size: 28rpx; + color: #517FB0; + white-space: nowrap; +} +/* 手机号开始 */ +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + margin-top: 142rpx; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + +} +.phone-pic{ + width: 20rpx; + height: 20rpx; + margin-bottom: 32rpx; +} +.num{ + font-size: 30rpx; + color: #333333; + margin-bottom: 24rpx; +} +.pull{ + width: 44rpx; + height: 44rpx; + margin-bottom: 20rpx; +} +.phone{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.phone-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.password-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.phone-input{ + font-size: 44rpx; + color: #333333; +} +/* 手机号结束 */ +/* 密码开始 */ +.password-block{ + margin-top: 54rpx; + border-bottom: solid 1px #D9D9D9; + display: flex; + flex-direction: row; + justify-content: space-between; +} +.see-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.close{ + width: 20rpx; + height: 20rpx; +} +.see{ + width: 36rpx; + height: 36rpx; +} +.line{ + width:1px; + height:24rpx; + background:rgba(217,217,217,1); + margin-left: 20rpx; + margin-right: 20rpx; +} +/* 密码结束 */ +/* 记住我开始 */ +.rememberMe-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 40rpx; + align-items: center; + margin-top: 20rpx; +} +.rememberMe-pic{ + height: 28rpx; + width: 28rpx; +} +.rememberMe-text{ + color: #333333; + font-size: 28rpx; + margin-left: 14rpx; +} +/* 记住我结束 */ +/* 获取验证码按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 获取验证码按钮结束 */ +/* 其他方式登录开始 */ +.login-other{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-top: 34rpx; +} +.login-account{ + width: 198rpx; + height: 34rpx; + color: #507EB0; + font-size: 24rpx; +} +.login-fast{ + width: 102rpx; + height: 34rpx; + color: #507EB0; + font-size: 24rpx; +} +.login-right{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.login-line{ + width:1px; + height:24rpx; + background:rgba(217,217,217,1); + margin-left: 20rpx; + margin-right: 20rpx; +} + +/* 其他方式登录结束 */ +/* 介绍 */ +.introduce-block{ + margin-top: 462rpx; + width: 680rpx; + height: 34rpx; + color: #D9D9D9; + font-size: 24rpx; + white-space: nowrap; + text-align: center; +} +/* 主体结束 */ \ No newline at end of file diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..a900517 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,407 @@ + + + + + diff --git a/pages/me/me.css b/pages/me/me.css new file mode 100644 index 0000000..a6edc2b --- /dev/null +++ b/pages/me/me.css @@ -0,0 +1,194 @@ +page{ + background: #F9F9F9; +} +/* 主体开始 */ +.body{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +/* 上部分开始 */ +.upper-block{ + margin-top: 0rpx; + height: 472rpx; + background: #F9F9F9; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.upper-block-done{ + margin-top: 0rpx; + height: 314rpx; + background: #F9F9F9; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.upper-block-inside{ + margin-top: 0rpx; + height: 472rpx; + background-image: url('../../static/pic/background.png'); + background-size: 100% 100%; + display: flex; + flex-direction: column; + justify-content: flex-end; +} +.upper-block-inside-done{ + margin-top: 0rpx; + height: 314rpx; + background-image: url('../../static/pic/background_done.png'); + background-size: 100% 100%; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.system-block{ + height: 42rpx; + margin-top: 96rpx; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.system-pic{ + width: 44rpx; + height: 42rpx; + margin-right: 60rpx; +} +/* 上部分结束 */ +/* 个人信息开始 */ +.role-block{ + height: 114rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; +} +.left-block{ + width: 114rpx; + height: 114rpx; + margin-left: 66rpx; +} +.head-pic{ + width: 114rpx; + height: 114rpx; +} +.level-pic{ + width: 44rpx; + height: 44rpx; + z-index: 1000; + position:absolute; + top:230rpx; + left:130rpx; +} +.level-pic-done{ + width: 44rpx; + height: 44rpx; + z-index: 1000; + position:absolute; + top:218rpx; + left:130rpx; +} +.right-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 48rpx; +} +.name{ + font-size: 38rpx; + color: #FFFFFFFF; +} +.info-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + margin-top: 16rpx; +} +.level-block{ + width:132rpx; + height:34rpx; + background:rgba(54,106,215,1); + border-radius:16rpx; + font-size: 22rpx; + text-align: center; + color: #CEDEFF; +} +.phoneNum-block{ + font-size: 22rpx; + color: #CEDEFF; + margin-left: 12rpx; +} +.level-up{ + width: 690rpx; + height: 156rpx; + border-radius:12rpx; + margin: 60rpx 30rpx -10rpx 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + background-image: url('../../static/pic/level_up_background.png'); + background-size: 100% 100%; + background-color: #F9F9F9; +} +.level-up-done{ + width: 690rpx; + height: 156rpx; + margin: 60rpx 30rpx -10rpx 30rpx; +} +.level-up-pic-block{ + width: 70rpx; + height: 70rpx; + margin: 22rpx 0rpx 64rpx 40rpx; +} +.level-up-pic{ + width: 70rpx; + height: 70rpx; +} +.level-up-text{ + margin-left: 24rpx; + height: 120rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + background:rgba(255,255,255,1); +} +.level-up-text-top{ + width: 128rpx; + height: 42rpx; + font-size: 30rpx; + color: #303233; + margin-top: 22rpx; +} +.level-up-text-bottom{ + width: 384rpx; + height: 34rpx; + margin-top: 6rpx; + font-size: 24rpx; + color:#999999; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.level-up-now{ + width: 120rpx; + height: 120rpx; + font-size: 24rpx; + color: #4A4A4A; + margin-left: 6rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-weight: 400; +} +/* 个人信息结束 */ +/* 下半部分开始 */ +.lower-block{ + height: 762rpx; + background: #F9F9F9; + display: flex; + flex-direction: column; + justify-content: flex-start; + padding-top: 36rpx; +} +/* 下半部分结束 */ +/* 主体结束 */ diff --git a/pages/me/me.vue b/pages/me/me.vue new file mode 100644 index 0000000..c071647 --- /dev/null +++ b/pages/me/me.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/pages/modifyPassword/modifyPassword.css b/pages/modifyPassword/modifyPassword.css new file mode 100644 index 0000000..3e66e5d --- /dev/null +++ b/pages/modifyPassword/modifyPassword.css @@ -0,0 +1,93 @@ +.text_block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + margin-top: 60rpx; +} +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 18rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +/* 下一步按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 下一步按钮结束 */ \ No newline at end of file diff --git a/pages/modifyPassword/modifyPassword.vue b/pages/modifyPassword/modifyPassword.vue new file mode 100644 index 0000000..50aa516 --- /dev/null +++ b/pages/modifyPassword/modifyPassword.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/pages/modifyPasswordSetpassword/modifyPasswordSetpassword.css b/pages/modifyPasswordSetpassword/modifyPasswordSetpassword.css new file mode 100644 index 0000000..3cae1c2 --- /dev/null +++ b/pages/modifyPasswordSetpassword/modifyPasswordSetpassword.css @@ -0,0 +1,136 @@ +/* 主体开始 */ +.setNew-block{ + display: flex; + flex-direction: column; + margin: 0rpx 40rpx 0rpx 40rpx; + justify-content: flex-start; +} +.text-top{ + font-size: 30rpx; + color:rgba(51,51,51,1); + margin-top: 40rpx; +} +.password-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + border-bottom: solid 1px rgba(217,217,217,1); + margin-top: 30rpx; +} +.password-input{ + font-size: 44rpx; + color: #333333; +} +.password-placeholder-input{ + color:#CCCCCC; + font-size:30rpx; +} +.see-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.see{ + width: 36rpx; + height: 36rpx; +} +.text-bottom{ + font-size: 28rpx; + color: #333333; + margin-top: 40rpx; +} +/* 验证码开始 */ +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; + margin-bottom: 32rpx; + margin-right: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 18rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; + font-weight:400; +} +/* 验证码结束 */ +/* 登录按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 登录按钮结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/modifyPasswordSetpassword/modifyPasswordSetpassword.vue b/pages/modifyPasswordSetpassword/modifyPasswordSetpassword.vue new file mode 100644 index 0000000..67486f7 --- /dev/null +++ b/pages/modifyPasswordSetpassword/modifyPasswordSetpassword.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/pages/modifyUserPhoneNum/modifyUserPhoneNum.css b/pages/modifyUserPhoneNum/modifyUserPhoneNum.css new file mode 100644 index 0000000..3e66e5d --- /dev/null +++ b/pages/modifyUserPhoneNum/modifyUserPhoneNum.css @@ -0,0 +1,93 @@ +.text_block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + margin-top: 60rpx; +} +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 18rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +/* 下一步按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 下一步按钮结束 */ \ No newline at end of file diff --git a/pages/modifyUserPhoneNum/modifyUserPhoneNum.vue b/pages/modifyUserPhoneNum/modifyUserPhoneNum.vue new file mode 100644 index 0000000..278938a --- /dev/null +++ b/pages/modifyUserPhoneNum/modifyUserPhoneNum.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.css b/pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.css new file mode 100644 index 0000000..cb48347 --- /dev/null +++ b/pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.css @@ -0,0 +1,132 @@ +/* 主体开始 */ +.setNew-block{ + display: flex; + flex-direction: column; + margin: 0rpx 40rpx 0rpx 40rpx; + justify-content: flex-start; +} +.text-top{ + font-size: 30rpx; + color:rgba(51,51,51,1); + margin-top: 40rpx; +} +.password-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + border-bottom: solid 1px rgba(217,217,217,1); + margin-top: 30rpx; +} +.password-input{ + font-size: 44rpx; + color: #333333; +} + +.password-placeholder-input{ + color:#CCCCCC; + font-size:30rpx; +} +.see-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.see{ + width: 36rpx; + height: 36rpx; +} +.text-bottom{ + font-size: 28rpx; + color: #333333; + margin-top: 40rpx; +} +/* 获取验证码按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 18rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +/* 获取验证码按钮结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.vue b/pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.vue new file mode 100644 index 0000000..3edd404 --- /dev/null +++ b/pages/modifyUserPhoneNumSetPhoneNum/modifyUserPhoneNumSetPhoneNum.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/pages/myApply/myApply.css b/pages/myApply/myApply.css new file mode 100644 index 0000000..d48b689 --- /dev/null +++ b/pages/myApply/myApply.css @@ -0,0 +1,72 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.data-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.content-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-bottom: 20rpx; + background: #FFFFFF; +} +.content-line{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: 72rpx; + padding: 0 40rpx; +} +.content-line-one-left{ + color: #303233; + font-size: 15px; + white-space: nowrap; + font-weight: 600; +} +.content-line-one-right{ + font-size: 14px; + color: #999999; + white-space: nowrap; +} +.content-line-left{ + font-size: 15px; + color: #303233; + white-space: nowrap; +} +.content-line-right{ + font-size: 13px; + color: #999999; + white-space: nowrap; +} +/* 分割线 */ +.line{ + background: #F0F0F0; + height: 20rpx; +} +.line-fine{ + background: #F0F0F0; + height: 2rpx; +} +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/myApply/myApply.vue b/pages/myApply/myApply.vue new file mode 100644 index 0000000..69eea53 --- /dev/null +++ b/pages/myApply/myApply.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/pages/preview/preview.css b/pages/preview/preview.css new file mode 100644 index 0000000..a33590c --- /dev/null +++ b/pages/preview/preview.css @@ -0,0 +1,11 @@ +.preview-block{ + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; +} +.preview-pic{ + width: 1334rpx; + height: 750rpx; +} \ No newline at end of file diff --git a/pages/preview/preview.vue b/pages/preview/preview.vue new file mode 100644 index 0000000..64c8e92 --- /dev/null +++ b/pages/preview/preview.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/pages/privacyAgreement/privacyAgreement.vue b/pages/privacyAgreement/privacyAgreement.vue new file mode 100644 index 0000000..6f557be --- /dev/null +++ b/pages/privacyAgreement/privacyAgreement.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/pages/report/report.css b/pages/report/report.css new file mode 100644 index 0000000..1571a0f --- /dev/null +++ b/pages/report/report.css @@ -0,0 +1,360 @@ +/* page{ + background: #F0F0F0; +} */ +.title-padding{ + height: var(--status-bar-height); + background: #FFFFFF 100%; +} +/* 主体开始 */ +.report-body{ + background: #F0F0F0; + height: 100%; +} +/* 分割线 */ +.line{ + background: #F0F0F0; + height: 20rpx; +} +.line-fine{ + background: #F0F0F0; + height: 2rpx; +} +/* 标题开始 */ +.report-title{ + background: #FFFFFF 100%; + height: 88rpx; +} +.report-title-text{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 32rpx; + color: #171F24; + height: 88rpx; +} +/* 标题结束 */ +/* tab选项开始 */ +.report-tab{ + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: flex-end; + background: #FFFFFF 100%; + margin-top: 2rpx; + position: relative; +} +.tab-noread-num-transient{ + width: 36rpx; + height: 36rpx; + background-image: url('../../static/pic/number.png'); + background-size: 100% 100%; + font-size: 20rpx; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + position: absolute; + left: 204rpx; + top: 10rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-noread-num-steady{ + width: 36rpx; + height: 36rpx; + background-image: url('../../static/pic/number.png'); + background-size: 100% 100%; + font-size: 20rpx; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + position: absolute; + left: 454rpx; + top: 10rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-noread-num-terminal{ + width: 36rpx; + height: 36rpx; + background-image: url('../../static/pic/number.png'); + background-size: 100% 100%; + font-size:20rpx; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + position: absolute; + left: 704rpx; + top: 10rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab{ + font-size: 28rpx; + color: #333333; + white-space: nowrap; + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-click{ + font-size: 28rpx; + color: #3982FC; + white-space: nowrap; + border-bottom: solid 2rpx #3982FC; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + height: 64rpx; +} +/* tab选项结束 */ +/* 日期选择开始 */ +.date-block{ + background: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + height: 102rpx; +} +.chooseDate-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; +} +.date-pic{ + width: 6rpx; + height: 34rpx; + margin-left: 40rpx; +} +.date-text{ + font-size: 30rpx; + color: #000000; + margin-left: 14rpx; + white-space: nowrap; + font-weight:500; +} +.date-choose{ + width: 42rpx; + height: 42rpx; + margin-left: 18rpx; +} +.date-choose-block{ + display: flex; + flex-direction: column; + justify-content: space-around; + position: absolute; + border-top: solid 1px #D9D9D9; + border-bottom: solid 1px #D9D9D9; + z-index: 1000; + background: #FFFFFF; + width: 100%; +} +.date-choose-line-one{ + font-size: 15px; + color: #303233; + height: 42rpx; + margin-top: 28rpx; + margin-left: 40rpx; +} +.date-choose-line-one-choose{ + font-size: 15px; + color: #3982FC; + height: 42rpx; + margin-top: 28rpx; + margin-left: 40rpx; +} +.date-choose-line-two{ + font-size: 15px; + color: #303233; + height: 42rpx; + margin-top: 28rpx; + margin-left: 40rpx; + margin-bottom: 28rpx; +} +.date-choose-line-two-choose{ + font-size: 15px; + color: #3982FC; + height: 42rpx; + margin-top: 28rpx; + margin-left: 40rpx; + margin-bottom: 28rpx; +} +.date-choose-line-three{ + font-size: 15px; + color: #303233; + height: 42rpx; + margin-left: 40rpx; + margin-bottom: 28rpx; +} +.date-choose-line-three-choose{ + font-size: 15px; + color: #3982FC; + height: 42rpx; + margin-left: 40rpx; + margin-bottom: 28rpx; +} +.time-block{ + font-size: 30rpx; + margin-left: 70rpx; +} +.sroll-block-line-one{ + display: flex; + flex-direction: row; + height: 122rpx; + justify-content: space-between; + align-items: center; + background: #FFFFFF; + box-sizing: border-box; + padding: 0 40rpx; + border-bottom: solid #F0F0F0 6px; +} +.sroll-block-line-one-text{ + margin-right: 14rpx; + height: 88rpx; + white-space: nowrap; + font-size: 32rpx; + color: #333333; + text-align: left; + display: flex; + flex-direction: column; + justify-content: center; +} +.sroll-block-line-one-text-second{ + display: flex; + flex-direction: row; + justify-content: flex-start; +} +.sroll-block-line-one-text-second-right{ + margin-left: 40rpx; +} +.sroll-block-line-one-pic{ + height: 44rpx; + width: 44rpx; +} +/* 日期选择结束 */ +/* 内容开始 */ +.scroll-view-block{ +} +.content-block{ + height: 240rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.content-line-one{ + height: 100rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + white-space: nowrap; + background: #FFFFFF; + padding: 0 40rpx; +} +.content-line-one-text1{ + font-size: 30rpx; + white-space: nowrap; +} +.content-line-one-text2{ + font-size: 30rpx; + white-space: nowrap; +} +.content-line-one-pic{ + width: 44rpx; + height: 40rpx; +} +.content-line-two{ + height:4rpx; + background: #F0F0F0; +} +.content-line-three{ + background: #FFFFFF; + height: 120rpx; + display: flex; + flex-direction: column; + padding:2rpx 40rpx ; + font-size: 24rpx; + color: #333333; + box-sizing: border-box; +} +/* 内容结束 */ +/* 申请开始 */ +.apply-block{ + background: #FFFFFF; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 16rpx; +} +.apply-line{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + padding: 0 40rpx; +} +.apply-line-left{ + width: 150rpx; + font-size: 30rpx; + color: #303233; + white-space: nowrap; +} +.apply-line-center{ + width: 446rpx; + font-size: 26rpx; + color: #999999; + text-align: right; +} +.apply-line-right{ + width: 44rpx; + height: 44rpx; + margin-left: 40rpx; +} +.apply-button1{ + margin: 236rpx 46rpx 0 46rpx; + background: #3982FC; + border-radius: 20px; + height: 80rpx; + width: 658rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 32rpx; + color: #FFFFFF; +} +.apply-button2{ + margin:34rpx 46rpx 0 46rpx; + border: 1px solid #3982FC; + border-radius: 20px; + height: 80rpx; + width: 658rpx; + color: #3982FC; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 32rpx; +} +/* 申请结束 */ +.no-data{ + color: #FF5059; + /* background: #FFFFFF; */ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* 主体结束 */ \ No newline at end of file diff --git a/pages/report/report.vue b/pages/report/report.vue new file mode 100644 index 0000000..ac44dd0 --- /dev/null +++ b/pages/report/report.vue @@ -0,0 +1,1098 @@ + + + + + diff --git a/pages/setNewMessage/setNewMessage.css b/pages/setNewMessage/setNewMessage.css new file mode 100644 index 0000000..2e17ab6 --- /dev/null +++ b/pages/setNewMessage/setNewMessage.css @@ -0,0 +1,21 @@ +/* 主体开始 */ +.body-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.each-block{ + height: 100rpx; + border-bottom: 1px solid #F0F0F0; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 0 40rpx; +} +.each-text{ + color: #303233; + white-space: nowrap; + font-size: 30rpx; +} +/* 主体结束 */ \ No newline at end of file diff --git a/pages/setNewMessage/setNewMessage.vue b/pages/setNewMessage/setNewMessage.vue new file mode 100644 index 0000000..d5dbc37 --- /dev/null +++ b/pages/setNewMessage/setNewMessage.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/pages/setNewPassword/setNewPassword.css b/pages/setNewPassword/setNewPassword.css new file mode 100644 index 0000000..3cae1c2 --- /dev/null +++ b/pages/setNewPassword/setNewPassword.css @@ -0,0 +1,136 @@ +/* 主体开始 */ +.setNew-block{ + display: flex; + flex-direction: column; + margin: 0rpx 40rpx 0rpx 40rpx; + justify-content: flex-start; +} +.text-top{ + font-size: 30rpx; + color:rgba(51,51,51,1); + margin-top: 40rpx; +} +.password-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + border-bottom: solid 1px rgba(217,217,217,1); + margin-top: 30rpx; +} +.password-input{ + font-size: 44rpx; + color: #333333; +} +.password-placeholder-input{ + color:#CCCCCC; + font-size:30rpx; +} +.see-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.see{ + width: 36rpx; + height: 36rpx; +} +.text-bottom{ + font-size: 28rpx; + color: #333333; + margin-top: 40rpx; +} +/* 验证码开始 */ +.phone-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + border-bottom: solid 1px #D9D9D9; + width: 670rpx; + align-items: flex-end; + margin-top: 60rpx; +} +.phoneNum{ + font-size: 32rpx; + font-weight:400; + color:rgba(51,51,51,1); +} +.vercode{ + margin-left: 10rpx; + margin-bottom: 12rpx; +} +.vercode-placeholder{ + color:#CCCCCC; + font-size:30rpx; +} +.vercode-input{ + font-size: 44rpx; + color: #333333; +} +.reset-block{ + width: 88rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; +} +.vercode-pic{ + width: 20rpx; + height: 20rpx; + margin-bottom: 32rpx; + margin-right: 20rpx; +} +.vercode-button{ + width: 150rpx; + height: 48rpx; + font-size: 24rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(57,130,252,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; +} +.vercode-button-send{ + width: 160rpx; + height: 48rpx; + font-size: 18rpx; + border-radius:12px; + color:rgba(255,255,255,1); + background: rgba(217,217,217,1); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-bottom: 22rpx; + font-weight:400; +} +/* 验证码结束 */ +/* 登录按钮开始 */ +.login-vercode{ + width: 658rpx; + height: 80rpx; + margin-top: 80rpx; + background: #3982FC; + border-radius: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.text{ + color: #6CA3FF; + font-size: 32rpx; +} +.textHigh{ + color: #FFFFFF; + font-size: 32rpx; +} +/* 登录按钮结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/setNewPassword/setNewPassword.vue b/pages/setNewPassword/setNewPassword.vue new file mode 100644 index 0000000..0cbffeb --- /dev/null +++ b/pages/setNewPassword/setNewPassword.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/pages/setting/setting.css b/pages/setting/setting.css new file mode 100644 index 0000000..24a88e1 --- /dev/null +++ b/pages/setting/setting.css @@ -0,0 +1,16 @@ +.option-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + +} +.exit-block{ + height: 100rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: 30rpx; + color:#303233; + border-bottom: solid 1px rgba(240,240,240,1); +} \ No newline at end of file diff --git a/pages/setting/setting.vue b/pages/setting/setting.vue new file mode 100644 index 0000000..006f2aa --- /dev/null +++ b/pages/setting/setting.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/pages/spectrum/spectrum.css b/pages/spectrum/spectrum.css new file mode 100644 index 0000000..94df682 --- /dev/null +++ b/pages/spectrum/spectrum.css @@ -0,0 +1,107 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.spectrum-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.line-block{ + height: 94rpx; + font-size: 30rpx; + color: #000000; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + padding: 0 40rpx; + box-sizing: border-box; + background: #FFFFFF; +} +/* tab选项开始 */ +.tab-block{ + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: flex-end; + background: #FFFFFF 100%; + margin-top: 2rpx; +} +.tab{ + font-size: 28rpx; + color: #333333; + white-space: nowrap; + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.tab-click{ + font-size: 28rpx; + color: #3982FC; + white-space: nowrap; + border-bottom: solid 2rpx #3982FC; + height: 64rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* tab选项结束 */ +/* 画图开始 */ +.echarts-block{ + display: flex; + flex-direction: column; + background: #FFFFFF; +} +.ec-canvas{ + display: flex; + flex: 1; +} +.canvasView{ +} +.legend-block{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.legend-block-left{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.legend-block-left-color{ + height: 30rpx; + width: 30rpx; + background: #DAA520; +} +.legend-block-left-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +.legend-block-right{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 20rpx; +} +.legend-block-right-color{ + height: 30rpx; + width: 30rpx; + background: #2E8B57; +} +.legend-block-right-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +/* 画图结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/spectrum/spectrum.vue b/pages/spectrum/spectrum.vue new file mode 100644 index 0000000..dd532a6 --- /dev/null +++ b/pages/spectrum/spectrum.vue @@ -0,0 +1,560 @@ + + + + + diff --git a/pages/steady/steady.css b/pages/steady/steady.css new file mode 100644 index 0000000..f3461f4 --- /dev/null +++ b/pages/steady/steady.css @@ -0,0 +1,113 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.steady-block{ + background: #F0F0F0; +} +/* 时间开始 */ +.time-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + background:rgba(255,255,255,1); + height: 94rpx; + align-items: center; +} +.time-pic{ + width: 44rpx; + height: 44rpx; + margin: 26rpx 0rpx 24rpx 40rpx; +} +.time-text{ + color: #000000; + font-size: 30rpx; + margin-left: 20rpx; + +} +/* 时间结束 */ +/* 基础信息开始 */ +.basic-block{ + margin-top: 20rpx; + background:rgba(255,255,255,1); + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.basic-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 42rpx; + align-items: center; + margin: 30rpx 40rpx 0 40rpx; +} +.basic-title-left{ + width: 6rpx; + height: 34rpx; +} +.basic-title-right{ + color: #000000; + font-size: 30rpx; + margin-left: 14rpx; + font-weight:500; +} +.basic-content{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 8rpx; +} +.basic-content-line-one{ + height: 92rpx; + margin: 12rpx 40rpx 0 40rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} +.basic-content-line-one-left{ + color: #303233; + font-size: 30rpx; +} +.basic-content-line-one-right{ + width: 44rpx; + height: 44rpx; +} +.basic-content-line-two{ + height:2rpx; + background:#F0F0F0; +} +.basic-content-line-three{ + width: 670rpx; + height: 144rpx; + font-size: 24rpx; + color: #333333; + margin: 0 40rpx; + display: flex; + flex-direction: row; + align-items: center; +} +.basic-content-line-four{ + height:20rpx; + background:#F0F0F0; +} +/* 基础信息结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/steady/steady.vue b/pages/steady/steady.vue new file mode 100644 index 0000000..541a33c --- /dev/null +++ b/pages/steady/steady.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/pages/steadyDetails/steadyDetails.css b/pages/steadyDetails/steadyDetails.css new file mode 100644 index 0000000..46f1394 --- /dev/null +++ b/pages/steadyDetails/steadyDetails.css @@ -0,0 +1,92 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.steadyDetails-block{ + background:#F9F9F9; +} +/* 时间开始 */ +.time-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + background:rgba(255,255,255,1); + height: 94rpx; + padding: 0 40rpx; +} +.time-location{ + font-size: 30rpx; + color: #000000; +} +.time-text{ + color: #000000; + font-size: 30rpx; +} +/* 时间结束 */ +/* 基础信息开始 */ +.index-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 20rpx; +} +.index-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + background: #FFFFFF; + height: 102rpx; +} +.index-title-left{ + width: 6rpx; + height: 34rpx; + margin-left: 40rpx; +} +.index-title-right{ + height: 42rpx; + font-size: 30rpx; + color: #000000; + margin-left: 20rpx; +} +.index-content{ + margin-top: 20rpx; + background: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: 92rpx; +} +.index-content-text{ + color: #303233; + font-size: 30rpx; + margin-left: 80rpx; + height: 42rpx; + white-space: nowrap; +} +.index-content-pic{ + width: 40rpx; + height: 40rpx; + margin-right: 30rpx; +} +/* 基础信息结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/steadyDetails/steadyDetails.vue b/pages/steadyDetails/steadyDetails.vue new file mode 100644 index 0000000..70f257c --- /dev/null +++ b/pages/steadyDetails/steadyDetails.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/pages/steadyIndex/steadyIndex.css b/pages/steadyIndex/steadyIndex.css new file mode 100644 index 0000000..cb02845 --- /dev/null +++ b/pages/steadyIndex/steadyIndex.css @@ -0,0 +1,59 @@ +/* 主体开始 */ +.steadyIndex-block{ + background:#F9F9F9; + padding-top: 20rpx; +} +/* 基础信息开始 */ +.index-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + background: #FFFFFF; +} +.index-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + + height: 102rpx; +} +.index-title-left{ + width: 6rpx; + height: 34rpx; + margin-left: 40rpx; +} +.index-title-right{ + height: 42rpx; + font-size: 30rpx; + color: #000000; + margin-left: 20rpx; +} +.index-content{ + height: 424rpx; + width: 670rpx; + margin: 20rpx 40rpx 56rpx 40rpx; +} +.index-content-pic{ + height: 424rpx; + width: 670rpx; +} +/* 基础信息结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/steadyIndex/steadyIndex.vue b/pages/steadyIndex/steadyIndex.vue new file mode 100644 index 0000000..f424504 --- /dev/null +++ b/pages/steadyIndex/steadyIndex.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/pages/systemIntroduce/systemIntroduce.vue b/pages/systemIntroduce/systemIntroduce.vue new file mode 100644 index 0000000..439a9c2 --- /dev/null +++ b/pages/systemIntroduce/systemIntroduce.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/pages/terminal/terminal.css b/pages/terminal/terminal.css new file mode 100644 index 0000000..be41b61 --- /dev/null +++ b/pages/terminal/terminal.css @@ -0,0 +1,119 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.terminal-body{ + background: #F0F0F0; +} +/* 内容开始 */ +.terminal-content{ + display: flex; + flex-direction: column; + justify-content: flex-start; + height: 522rpx; + background: #FFFFFF; + margin-bottom: 20rpx; +} +.terminal-content-line-one{ + height: 166rpx; + color: #000000; + font-size: 30rpx; + margin: 0 40rpx; + display: flex; + flex-direction: row; + align-items: center; +} +.terminal-content-line{ + height: 2rpx; + background: #F0F0F0; +} +.terminal-content-line-two{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + height: 78rpx; +} +.terminal-content-line-two-left{ + width: 6rpx; + height: 34rpx; + margin-left: 40rpx; +} +.terminal-content-line-two-right{ + margin-left: 14rpx; + font-size: 30rpx; + font-weight:500; +} +.terminal-content-line-three{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 0 40rpx; + height: 92rpx; +} +.terminal-content-line-three-left{ + height: 42rpx; + font-size: 30rpx; + color: #303233; +} +.terminal-content-line-three-right{ + height: 36rpx; + font-size: 26rpx; + color: #999999; +} +.terminal-content-line-four{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 0 40rpx; + height: 92rpx; +} +.terminal-content-line-four-left{ + height: 42rpx; + font-size: 30rpx; + color: #303233; +} +.terminal-content-line-four-right{ + height: 36rpx; + font-size: 26rpx; + color: #999999; +} +.terminal-content-line-five{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin: 0 40rpx; + height: 92rpx; +} +.terminal-content-line-five-left{ + height: 42rpx; + font-size: 30rpx; + color: #303233; +} +.terminal-content-line-five-right{ + height: 36rpx; + font-size: 26rpx; + color: #999999; +} +/* 内容结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/terminal/terminal.vue b/pages/terminal/terminal.vue new file mode 100644 index 0000000..692ce83 --- /dev/null +++ b/pages/terminal/terminal.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/pages/terminalDetails/terminalDetails.css b/pages/terminalDetails/terminalDetails.css new file mode 100644 index 0000000..f65462e --- /dev/null +++ b/pages/terminalDetails/terminalDetails.css @@ -0,0 +1,199 @@ +/* 主体开始 */ +.terminalDetails-block{ + background: #F0F0F0; +} +/* 时间开始 */ +.time-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + background:rgba(255,255,255,1); + height: 94rpx; +} +.time-pic{ + width: 44rpx; + height: 44rpx; + margin: 26rpx 0rpx 24rpx 40rpx; +} +.time-text{ + color: #000000; + font-size: 30rpx; + margin:26rpx 0 26rpx 20rpx; + +} +/* 时间结束 */ +/* 基础信息开始 */ +.basic-block{ + height: 176rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 20rpx; + background:rgba(255,255,255,1); + +} +.basic-body{ + display: flex; + flex-direction: column; + justify-content: flex-start; + padding-left: 40rpx; + padding-right: 40rpx; +} +.basic-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 42rpx; + align-items: center; + margin-top: 30rpx; +} +.basic-title-left{ + width: 6rpx; + height: 34rpx; +} +.basic-title-right{ + color: #000000; + font-size: 30rpx; + margin-left: 14rpx; + font-weight:500; +} +.basic-content{ + height: 106rpx; + font-size: 26rpx; + color: #000000; + margin-top:20rpx ; +} +/* 基础信息结束 */ +/* 终端通讯信息开始 */ +.eigenvalues-block{ + height: 350rpx; + margin-top: 20rpx; + background:rgba(255,255,255,1); + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.eigenvalues-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: 30rpx; + height: 42rpx; +} +.eigenvalues-title-left{ + margin-left: 40rpx; + width: 6rpx; + height: 34rpx; +} +.eigenvalues-title-right{ + font-size: 30rpx; + color: #000000; + font-weight:500; + margin-left: 14rpx; +} +.eigenvalues-content{ + width: 670rpx; + height: 188rpx; + margin: 20rpx 40rpx 50rpx 40rpx; +} +.eigenvalues-content-title{ + font-size: 26rpx; + color: #333333; +} +.eigenvalues-content-scroll{ + height: 160rpx; +} +.eigenvalues-content-text{ + font-size: 26rpx; + color: #333333; +} +/* 终端通讯信息结束 */ +/* 终端告警信息开始 */ +.waveform-block{ + height: 300rpx; + display: flex; + flex-direction: column; + margin-top: 20rpx; + background:rgba(255,255,255,1); +} +.waveform-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: 30rpx; + height: 42rpx; +} +.waveform-title-left{ + margin-left: 40rpx; + width: 6rpx; + height: 34rpx; +} +.waveform-title-right{ + font-size: 30rpx; + color: #000000; + font-weight:500; + margin-left: 14rpx; +} +.waveform-content-scroll{ + height: 160rpx; + width: 670rpx; + font-size: 26rpx; + color: #333333; + margin: 20rpx 40rpx 0 40rpx; +} +/* 终端告警信息结束 */ +/* 终端流量信息开始 */ +.flow-block{ + height: 262rpx; + display: flex; + flex-direction: column; + margin-top: 20rpx; + background:rgba(255,255,255,1); +} +.flow-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: 30rpx; + height: 42rpx; +} +.flow-title-left{ + margin-left: 40rpx; + width: 6rpx; + height: 34rpx; +} +.flow-title-right{ + font-size: 30rpx; + color: #000000; + font-weight:500; + margin-left: 14rpx; +} +.flow-content{ + height: 160rpx; + width: 670rpx; + font-size: 26rpx; + color: #333333; + margin: 20rpx 40rpx 0 40rpx; +} +/* 终端流量信息结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/terminalDetails/terminalDetails.vue b/pages/terminalDetails/terminalDetails.vue new file mode 100644 index 0000000..6ac9e53 --- /dev/null +++ b/pages/terminalDetails/terminalDetails.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/pages/terminalHistory/terminalHistory.css b/pages/terminalHistory/terminalHistory.css new file mode 100644 index 0000000..e448bf9 --- /dev/null +++ b/pages/terminalHistory/terminalHistory.css @@ -0,0 +1,129 @@ +page{ + background: #F0F0F0; +} +/* 主体开始 */ +.steadyDetails-block{ + background:#F9F9F9; +} +/* 分割线 */ +.line{ + background: #F0F0F0; + height: 20rpx; +} +.line-fine{ + background: #F0F0F0; + height: 2rpx; +} +/* 时间开始 */ +.time-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + background:rgba(255,255,255,1); + height: 94rpx; + padding: 0 40rpx; +} +.time-location{ + font-size: 30rpx; + color: #000000; +} +.time-text{ + color: #000000; + font-size: 30rpx; +} +/* 时间结束 */ +/* 基础信息开始 */ +.index-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 20rpx; +} +.index-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + background: #FFFFFF; + height: 102rpx; +} +.index-title-left{ + width: 6rpx; + height: 34rpx; + margin-left: 40rpx; +} +.index-title-right{ + height: 42rpx; + font-size: 30rpx; + color: #000000; + margin-left: 20rpx; +} +.index-content{ + margin-top: 20rpx; + background: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + /* height: 92rpx; */ +} +.index-content1{ + margin-top: 20rpx; + background: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: 92rpx; +} +.index-content2{ + margin-top: 20rpx; + background: #FFFFFF; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} +.index-content-text{ + color: #303233; + font-size: 30rpx; + margin-left: 80rpx; + /* height: 82rpx; */ +} +.index-content-text1{ + color: #303233; + font-size: 30rpx; + margin-left: 80rpx; + height: 42rpx; + white-space: nowrap; +} +.index-content-text2{ + color: #303233; + font-size: 30rpx; + margin:0 80rpx; +} +.index-content-pic{ + width: 40rpx; + height: 40rpx; + margin-right: 30rpx; +} +/* 基础信息结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/terminalHistory/terminalHistory.vue b/pages/terminalHistory/terminalHistory.vue new file mode 100644 index 0000000..5b5fd76 --- /dev/null +++ b/pages/terminalHistory/terminalHistory.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/pages/terminalStatus/terminalStatus.css b/pages/terminalStatus/terminalStatus.css new file mode 100644 index 0000000..72f1c3d --- /dev/null +++ b/pages/terminalStatus/terminalStatus.css @@ -0,0 +1,184 @@ +page{ + background: #F0F0F0; +} +/* 分割线 */ +.line{ + background: #F0F0F0; + height: 20rpx; +} +.line-fine{ + background: #F0F0F0; + height: 2rpx; +} +/* 时间开始 */ +.time-block{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + padding: 0 40rpx; + background: #FFFFFF 100%; +} +.time-block-left{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 44rpx; + align-items: center; +} +.calendar-pic{ + height: 44rpx; + width: 44rpx; +} +.time-text{ + color: #303233; + font-size: 30rpx; + margin-left: 20rpx; +} +.time-block-right{ + height: 44rpx; + width: 44rpx; +} +/* 时间结束 */ +/* 总览开始 */ +.overview-block{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + padding: 0 40rpx; + background: #FFFFFF 100%; +} +.overview-block-text{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.overview-block-text-left{ + color: #303233; + font-size: 30rpx; + margin-left: 20rpx; +} +.overview-block-text-right{ + color: #FF5059; + font-size: 30rpx; + margin-left: 20rpx; +} +/* 总览结束 */ +/* 图片开始 */ +.pic-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + box-sizing: border-box; + padding: 30rpx 0; + background: #FFFFFF; + margin-top: 20rpx; +} +.pic-block-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 42rpx; + align-items: center; + box-sizing: border-box; + padding:0 40rpx; +} +.pic-block-title-left{ + height: 34rpx; + width: 6rpx; +} +.pic-block-title-right{ + color: #000000; + font-size: 30rpx; + margin-left: 14rpx; +} +.pic-block-pic{ + height: 378rpx; + width: 670rpx; + margin-top: 30rpx; +} +/* 图片结束 */ +/* 画图开始 */ +.canvasView{ + +} +.ec-canvas{ +} +.legend-block{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.legend-block-left{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.legend-block-left-color{ + height: 30rpx; + width: 30rpx; + background: #DAA520; +} +.legend-block-left-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +.legend-block-right{ + height: 30rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 20rpx; +} +.legend-block-right-color{ + height: 30rpx; + width: 30rpx; + background: #2E8B57; +} +.legend-block-right-text{ + font-size: 24rpx; + margin-left: 10rpx; +} +/* 画图结束 */ +/* 中断信息开始 */ +.info-block{ + display: flex; + flex-direction: column; + justify-content: center; + padding: 0 40rpx; + border-bottom: 10rpx #F0F0F0 solid; + font-size: 30rpx; + height: 200rpx; +} +.info-block-line-one{ + font-size: 30rpx; +} +/* 中断信息结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ \ No newline at end of file diff --git a/pages/terminalStatus/terminalStatus.vue b/pages/terminalStatus/terminalStatus.vue new file mode 100644 index 0000000..1ed00ee --- /dev/null +++ b/pages/terminalStatus/terminalStatus.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/pages/terminalStatusAll/terminalStatusAll.css b/pages/terminalStatusAll/terminalStatusAll.css new file mode 100644 index 0000000..1d0bbfd --- /dev/null +++ b/pages/terminalStatusAll/terminalStatusAll.css @@ -0,0 +1,21 @@ +.terminal-status-all-block{ + background: #f0f0f0; +} +.terminal-status-all-each-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: 80rpx; + background: white; + margin-bottom: 4rpx; + font-size: 30rpx; + padding: 0 40rpx; + box-sizing: border-box; +} +.terminal-status-all-each-block-sucess{ + color: #78D50E; +} +.terminal-status-all-each-block-fail{ + color: #FF5059; +} \ No newline at end of file diff --git a/pages/terminalStatusAll/terminalStatusAll.vue b/pages/terminalStatusAll/terminalStatusAll.vue new file mode 100644 index 0000000..cf8e727 --- /dev/null +++ b/pages/terminalStatusAll/terminalStatusAll.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/pages/transientDetails/transientDetails.css b/pages/transientDetails/transientDetails.css new file mode 100644 index 0000000..51171a5 --- /dev/null +++ b/pages/transientDetails/transientDetails.css @@ -0,0 +1,463 @@ +/* 主体开始 */ +.transientDetails-block{ + background: #F0F0F0; +} +/* 时间开始 */ +.time-block{ + display: flex; + flex-direction: row; + justify-content: flex-start; + background:rgba(255,255,255,1); + height: 94rpx; +} +.time-pic{ + width: 44rpx; + height: 44rpx; + margin: 26rpx 0rpx 24rpx 40rpx; +} +.time-text{ + color: #000000; + font-size: 30rpx; + margin:26rpx 0 26rpx 20rpx; + +} +/* 时间结束 */ +/* 基础信息开始 */ +.basic-block{ + height: 494rpx; + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-top: 20rpx; + background:rgba(255,255,255,1); + +} +.basic-body{ + display: flex; + flex-direction: column; + justify-content: flex-start; + padding-left: 40rpx; + padding-right: 40rpx; +} +.basic-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + height: 42rpx; + align-items: center; + margin-top: 30rpx; +} +.basic-title-left{ + width: 6rpx; + height: 34rpx; +} +.basic-title-right{ + color: #000000; + font-size: 30rpx; + margin-left: 14rpx; + font-weight:500; +} +.basic-content{ + height: 106rpx; + font-size: 30rpx; + color: #000000; + margin-top:20rpx ; +} +.basic-line-one{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline ; + margin-top: 20rpx; + +} +.basic-line-one-left{ + width: 140rpx; + height: 38rpx; + font-size: 24rpx; + color: #333333; + border-radius:18rpx; + background: rgba(244,244,244,1); + text-align: center; + white-space: nowrap; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.basic-line-one-right{ + font-size: 24rpx; + color: #333333; + margin-left: 16rpx; +} +.basic-line-two{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline ; + margin-top: 20rpx; +} +.basic-line-two-left{ + width: 200rpx; + height: 38rpx; + font-size: 24rpx; + color: #333333; + border-radius:18rpx; + background: rgba(244,244,244,1); + text-align: center; +} +.basic-line-two-right{ + font-size: 24rpx; + color: #333333; + margin-left: 16rpx; +} +.judge-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center ; + margin-top: 20rpx; + height:48rpx; +} +.judge-text{ + color: #333333; + font-size: 28rpx; + white-space: nowrap; +} +.judge-yes{ + margin-left: 126rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.judge-yes-pic{ + width: 28rpx; + height: 28rpx; +} +.judge-yes-text{ + margin-left: 12rpx; + color: #333333; + font-size: 28rpx; +} +.judge-no{ + margin-left: 92rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.judge-no-pic{ + width: 28rpx; + height: 28rpx; +} +.judge-no-text{ + margin-left: 12rpx; + color: #333333; + font-size: 28rpx; +} +.judge-pic{ + height: 48rpx; + width: 80rpx; +} +.basic-foot{ + margin-top: 2rpx; + height: 98rpx; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + border-top: solid 2rpx #F0F0F0; + margin-top: 20rpx; + padding: 40rpx; + box-sizing: border-box; +} +.basic-foot-left{ + width: 140rpx; + height: 48rpx; + color: #FFFFFF; + font-size: 24rpx; + background:rgba(57,130,252,1); + margin-left: 410rpx; + border-radius:24rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.basic-foot-left-grey{ + width: 140rpx; + height: 48rpx; + color: #6CA3FF; + font-size: 24rpx; + background:rgba(57,130,252,1); + margin-left: 410rpx; + border-radius:24rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.basic-foot-right{ + width: 140rpx; + height: 48rpx; + color: #FFFFFF; + font-size: 24rpx; + /* margin-left: 20rpx; */ + background:rgba(57,130,252,1); + border-radius:24rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + white-space: nowrap; + margin-right: 0rpx; +} +.basic-foot-right-grey{ + width: 140rpx; + height: 48rpx; + color: #FFFFFF; + font-size: 24rpx; + /* margin-left: 20rpx; */ + background:rgba(217,217,217,1); + border-radius:24rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +/* 基础信息结束 */ +/* 多特征值开始 */ +.eigenvalues-block{ + margin-top: 32rpx; + background:rgba(255,255,255,1); + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.eigenvalues-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: 30rpx; + height: 42rpx; +} +.eigenvalues-title-left{ + margin-left: 40rpx; + width: 6rpx; + height: 34rpx; +} +.eigenvalues-title-right{ + font-size: 30rpx; + color: #000000; + font-weight:500; + margin-left: 14rpx; +} +.eigenvalues-content-line{ + height: 92rpx; + border-bottom: 2rpx solid #F0F0F0; + display: flex; + flex-direction: column; + justify-content: center; + padding:0 40rpx; +} +.eigenvalues-content-line2{ + height: 92rpx; + border-bottom: 2rpx solid #F0F0F0; + display: flex; + flex-direction: row; + justify-content:space-between; + align-items: center; + padding:0 40rpx; +} +.eigenvalues-content-line3{ + height: 92rpx; + display: flex; + flex-direction: row; + justify-content: center; + justify-content:space-between; + padding-left: 40rpx; + padding-right: 40rpx; + border-bottom: 2rpx solid #F0F0F0; +} +.eigenvalues-content-line-left{ + width: 336rpx; + height: 42rpx; + font-size: 30rpx; + color: #303233; + text-align: left; + white-space: nowrap; +} +.eigenvalues-content-line-right{ + height: 42rpx; + font-size: 26rpx; + color: #999999; + display: flex; + flex-direction: row; + justify-content: space-between; +} +.eigenvalues-content-line-right-A{ + width: 222rpx; + white-space: nowrap; +} +.eigenvalues-content-line-right-B{ + width: 226rpx; + white-space: nowrap; +} +.eigenvalues-content-line-right-C{ + width: 222rpx; + white-space: nowrap; +} +.eigenvalues-content-line-left2{ + width: 374rpx; + height: 42rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.eigenvalues-content-line-left2-left{ + width: 182rpx; + height: 42rpx; + color: #303233; + font-size: 30rpx; + text-align: left; + white-space: nowrap; +} +.eigenvalues-content-line-left2-right{ + width: 58rpx; + height: 38rpx; + color: #999999; + font-size: 26rpx; + text-align: right; + margin-left: 24rpx; + white-space: nowrap; +} +.eigenvalues-content-line-right2{ + width: 374rpx; + height: 42rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-left: 2rpx; +} +.eigenvalues-content-line-right2-left{ + margin-left: 40rpx; + width: 182rpx; + height: 42rpx; + color: #303233; + font-size: 30rpx; + text-align: left; + white-space: nowrap; +} +.eigenvalues-content-line-right2-right{ + width: 58rpx; + height: 38rpx; + color: #999999; + font-size: 26rpx; + text-align: right; + margin-left: 24rpx; +} +.eigenvalues-content-line3-left2{ + display: flex; + flex-direction: row; + justify-content: space-between; + white-space: nowrap; + color: #999999; + font-size: 26rpx; + width: 374rpx; +} +.eigenvalues-content-line3-right2{ + display: flex; + flex-direction: row; + justify-content: space-between; + white-space: nowrap; + color: #999999; + font-size: 26rpx; + width: 374rpx; +} +.eigenvalues-content-line3-right2-left{ + color: #303233; + font-size: 30rpx; + white-space: nowrap; + display: flex; + flex-direction: row; + align-items: center; + margin-left: 30rpx; +} +.eigenvalues-content-line3-right2-right{ + display: flex; + flex-direction: row; + align-items: center; +} +.eigenvalues-content-line3-left2-right{ + display: flex; + flex-direction: row; + align-items: center; + white-space: nowrap; +} +.eigenvalues-content-line3-left2-left{ + color: #303233; + font-size: 30rpx; + display: flex; + flex-direction: row; + align-items: center; +} +/* 多特征值结束 */ +/* 波形图开始 */ +.waveform-block{ + height: 562rpx; + display: flex; + flex-direction: column; + margin-top: 20rpx; + background:rgba(255,255,255,1); +} +.waveform-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: 30rpx; + height: 42rpx; +} +.waveform-title-left{ + margin-left: 40rpx; + width: 6rpx; + height: 34rpx; +} +.waveform-title-right{ + font-size: 30rpx; + color: #000000; + font-weight:500; + margin-left: 14rpx; +} +.waveform-pic{ + width: 670rpx; + height: 424rpx; + margin-top: 20rpx; + margin-left: 40rpx; +} +.no-pic-text{ + font-size: 30rpx; +} +/* 波形图结束 */ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +/* 重试页面结束 */ +/* 主体结束 */ \ No newline at end of file diff --git a/pages/transientDetails/transientDetails.vue b/pages/transientDetails/transientDetails.vue new file mode 100644 index 0000000..48a5c0c --- /dev/null +++ b/pages/transientDetails/transientDetails.vue @@ -0,0 +1,861 @@ + + + + + diff --git a/pages/transientWave/transientWave.css b/pages/transientWave/transientWave.css new file mode 100644 index 0000000..b3a189f --- /dev/null +++ b/pages/transientWave/transientWave.css @@ -0,0 +1,34 @@ +/* 波形图开始 */ +.waveform-block{ + height: 562rpx; + display: flex; + flex-direction: column; + margin-top: 20rpx; + background:rgba(255,255,255,1); +} +.waveform-title{ + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + margin-top: 30rpx; + height: 42rpx; +} +.waveform-title-left{ + margin-left: 40rpx; + width: 6rpx; + height: 34rpx; +} +.waveform-title-right{ + font-size: 30rpx; + color: #000000; + font-weight:500; + margin-left: 14rpx; +} +.waveform-pic{ + width: 670rpx; + height: 424rpx; + margin-top: 20rpx; + margin-left: 40rpx; +} +/* 波形图结束 */ \ No newline at end of file diff --git a/pages/transientWave/transientWave.vue b/pages/transientWave/transientWave.vue new file mode 100644 index 0000000..238d843 --- /dev/null +++ b/pages/transientWave/transientWave.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/pages/us/us.css b/pages/us/us.css new file mode 100644 index 0000000..c5ffb73 --- /dev/null +++ b/pages/us/us.css @@ -0,0 +1,24 @@ +/* 重试页面开始 */ +.error-block{ + height: 60%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + top: -10%; + margin-top: 300rpx; +} +.retry_button{ + margin-top: 10rpx; + border-radius: 10%; +} +.us-pic{ + height: 200rpx; + width: 200rpx; +} +.us-text{ + margin-top: 20rpx; +} +/* 重试页面结束 */ \ No newline at end of file diff --git a/pages/us/us.vue b/pages/us/us.vue new file mode 100644 index 0000000..1057062 --- /dev/null +++ b/pages/us/us.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/pages/userAgreement/userAgreement.vue b/pages/userAgreement/userAgreement.vue new file mode 100644 index 0000000..8f2b5af --- /dev/null +++ b/pages/userAgreement/userAgreement.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/pages/vercode/vercode.css b/pages/vercode/vercode.css new file mode 100644 index 0000000..80ebec5 --- /dev/null +++ b/pages/vercode/vercode.css @@ -0,0 +1,123 @@ +.body{ + display: flex; + flex-direction: column; + justify-content: flex-start; + width: 100%; +} +/* 主体开始 */ +.content-block{ + display: flex; + flex-direction: column; + justify-content: flex-start; + margin-left: 40rpx; + margin-top: 28rpx; + margin-right: 40rpx; +} +/* 文字开始 */ +.login-explain{ + /* 字体PingFangSC-Regular */ + font-size: 56rpx; + color: #000000; +} +.login-detail{ + width: 494rpx; + height: 40rpx; + margin-top: 14rpx; + display: flex; + flex-direction: row; + justify-content: flex-start; +} +.login-agreement{ + font-size: 28rpx; + color: #999999; + white-space: nowrap; +} +.login-user{ + font-size: 28rpx; + color: #517FB0; + white-space: nowrap; + margin-left: 10rpx; +} +/* 文字结束 */ + +/* 验证码开始 */ +.num-block{ + display: flex; + flex-direction: row; + justify-content: space-between; + margin-top: 116rpx; +} +.num-view{ + width: 80rpx; + height: 92rpx; + border-bottom: solid 1px #5FA5F0; + font-size: 54rpx; + text-align: center; +} +.num-view-none{ + width: 80rpx; + height: 92rpx; + border-bottom: solid 1px #D9D9D9; +} +.num{ + text-align: center; + font-size: 54rpx; +} +/* 验证码结束 */ +.receive-again-y{ + font-size: 24rpx; + margin-top: 34rpx; + color: #507EB0; + white-space: nowrap; +} +.receive-again-n{ + font-size: 24rpx; + margin-top: 34rpx; + color: #999999; + white-space: nowrap; +} +/* 主体结束 */ +/* 键盘开始 */ +.keyboard{ + display: flex; + flex-direction: column; + justify-content: flex-start; + height: 514rpx; + background: rgba(210,213,219,0.90); + margin-top: 222rpx; + position: fixed; + bottom: 0rpx; + width: 100%; +} +.keyboard-line{ + display: flex; + flex-direction: row; + justify-content: center; +} +.button-item{ + width: 234rpx; + height: 92rpx; + background: #FFFFFF; + box-shadow: 0 1px 0 0 #848688; + border-radius: 5px; + margin: 12rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.button-item-delete{ + width: 234rpx; + height: 92rpx; + border-radius: 5px; + margin: 12rpx; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.delete{ + width: 46rpx; + height: 36rpx; +} +/* 键盘结束 */ \ No newline at end of file diff --git a/pages/vercode/vercode.vue b/pages/vercode/vercode.vue new file mode 100644 index 0000000..4f0188d --- /dev/null +++ b/pages/vercode/vercode.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/static/js/aes.js b/static/js/aes.js new file mode 100644 index 0000000..38ceca8 --- /dev/null +++ b/static/js/aes.js @@ -0,0 +1,36 @@ +import CryptoJS from '../js/crypto.js' + +// const key = CryptoJS.enc.Utf8.parse('1234123412ABCDEF') // 十六位十六进制数作为密钥 +// const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412') // 十六位十六进制数作为密钥偏移量 + +// 解密方法 +function Decrypt (word, key) { + let ckey = CryptoJS.enc.Utf8.parse(key) // 十六位十六进制数作为密钥 + // let encryptedHexStr = CryptoJS.enc.Hex.parse(word) + // let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr) + + let decrypt = CryptoJS.AES.decrypt(word, ckey, { + + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8) + console.log('decryptedStr', decryptedStr.toString()) + + return decryptedStr.toString() +} + +// 加密方法 +function Encrypt (word, key) { + let ckey = CryptoJS.enc.Utf8.parse(key) + // let srcs = CryptoJS.enc.Utf8.parse(word) + let encrypted = CryptoJS.AES.encrypt(word, ckey, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return encrypted.toString() +} +export default { + Decrypt, + Encrypt +} diff --git a/static/js/crypto.js b/static/js/crypto.js new file mode 100644 index 0000000..17f2b11 --- /dev/null +++ b/static/js/crypto.js @@ -0,0 +1,5988 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + /* + * Local polyfil of Object.create + */ + var create = Object.create || (function () { + function F() {}; + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()) + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + var block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low;; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + var Wih = Wi.high = M[offset + i * 2] | 0; + var Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + var Wil = gamma0l + Wi7l; + var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + var Wil = Wil + gamma1l; + var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + var Wil = Wil + Wi16l; + var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + var block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + var modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + var modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + var wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + var salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + var keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + var t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); + this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); + this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + i--; + } + data.sigBytes = i + 1; + } + }; + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/static/js/des.js b/static/js/des.js new file mode 100644 index 0000000..86e1c3c --- /dev/null +++ b/static/js/des.js @@ -0,0 +1,24 @@ +import CryptoJS from '../js/crypto.js' + +// DES加密 +export const encryptDes = (message, key) => { + const keyHex = CryptoJS.enc.Utf8.parse(key); + const encrypted = CryptoJS.DES.encrypt(message, keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + return encrypted.toString(); +} + +// DES解密 +export const decryptDes = (ciphertext, key) => { + const keyHex = CryptoJS.enc.Utf8.parse(key); + // direct decrypt ciphertext + const decrypted = CryptoJS.DES.decrypt({ + ciphertext: CryptoJS.enc.Base64.parse(ciphertext) + }, keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + return decrypted.toString(CryptoJS.enc.Utf8); +} \ No newline at end of file diff --git a/static/js/errorMsg.js b/static/js/errorMsg.js new file mode 100644 index 0000000..280bf2d --- /dev/null +++ b/static/js/errorMsg.js @@ -0,0 +1,31 @@ +function judgeError(msgCode,msg){ + // if(msgCode=='10004'||msgCode=='10006'||msgCode=='10007'||msgCode=='10009'||msgCode=='10011'){ + // return '请检查输入' + // }else + if(msgCode=='10031'){ + return '未注册的手机号' + }else if(msgCode=='10022'||msgCode=='10025'){ + return '验证码错误' + }else if(msgCode=='10019'){ + return '推荐码不正确' + }else if(msgCode=='10003'||msgCode=='10013'||msgCode=='10021'||msgCode=='10028'){ + return '请联系管理员' + }else if(msgCode=='10005'){ + return '账户被锁定30分钟' + }else if(msgCode=='10010'||msgCode=='10111'||msgCode=='10172'){ + return '用户不存在' + }else if(msgCode=='10016'||msgCode=='10018'||msgCode=='10027'){ + return '网络异常,请重试' + }else if(msgCode=='10030'){ + return '网络异常,请重试' + }else if(msgCode=='10112'){ + return '未找到该暂态事件信息' + }else if(msgCode=='10173'){ + return '未找到该终端消息' + }else{ + return msg + } +} +export default{ + judgeError +} \ No newline at end of file diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_Py2dPzhw75U~N{YI2= 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 QGXMYp07*qoM6N<$g1xXxDgXcg literal 0 HcmV?d00001 diff --git a/static/pic/A_C.png b/static/pic/A_C.png new file mode 100644 index 0000000000000000000000000000000000000000..10b8011f71b0470e420217d4521ad931d0be3104 GIT binary patch literal 6479 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 P00000NkvXXu0mjfhIkQ3 literal 0 HcmV?d00001 diff --git a/static/pic/aboutUs.png b/static/pic/aboutUs.png new file mode 100644 index 0000000000000000000000000000000000000000..9639a73b2c0d35c4f2e0977052aa411a47efc655 GIT binary patch literal 38027 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 Ef@(>Iw*UYD literal 0 HcmV?d00001 diff --git a/static/pic/aboutUs.png的替身 b/static/pic/aboutUs.png的替身 new file mode 100644 index 0000000000000000000000000000000000000000..05ff88a6d6532254fe199a3cb7aff832509fd174 GIT binary patch literal 1072 zcmZ9Lzi-n(6vxkPT7Fha(h9l}RSaEHm!wu4mXcsl20#@e6+;)t4RKU*wrWQzOjJc; zVPpUaB!&+B0l+{(qylyZ28J$(NXn*eQ-%p3`hpWk_>RaLlo#tYTJ@{oVD?osCbl+lS5e*7Nq(dm&D9?y4_{+!qS1W`0zjDy;vainGLG1&okE)Z69T)LPs zGKOUu*NuEuoqwJ7f&PpSjufN)b&OeJ+;3UdE5M^W6D#X=Pzbz*2_GX5ZymhG$vF5e^A+$W^BwRGbNN4B1pnapP)dkr+=CHtj5!XTU`~Kb%t`Px y^ElXKPJu(_S+J_FwS?&KUI{Q#ktJJrI~>=(_vgpK)L*jmd%gEhJOzHu^$!79(|(!& literal 0 HcmV?d00001 diff --git a/static/pic/aboutUs的副本.png b/static/pic/aboutUs的副本.png new file mode 100644 index 0000000000000000000000000000000000000000..9639a73b2c0d35c4f2e0977052aa411a47efc655 GIT binary patch literal 38027 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 Ef@(>Iw*UYD literal 0 HcmV?d00001 diff --git a/static/pic/asc.png b/static/pic/asc.png new file mode 100644 index 0000000000000000000000000000000000000000..69c26272ce4d3b1a3e4adb00fb37ec381abdb88c GIT binary patch literal 614 zcmV-s0-61ZP)eb;B4LbWZ(iJ>?NDMWG^d|G8tx`yz|XW!Z2qSn=>yQxb7Kq3A=OMDh*JR8iRh-*`onI}wS$8o=n~NyfMWpu644c{_4{ej zwSu>?>i`x~K#RVnwSGGdx;AhMdlbMs0GEmAGh^%=fCB)oE2UnSMb`q(V3#=OKaDZp z8DsYuW1oyMt3-5&bACfg`Kk=Ma`5&7vo&jzT~bOt55w?$0+v$V6GC`I^cBEi&iSI0 z^5vxHO2Ol>7Lo2%KIO`$PnLn*bHZnJ0LAP6oJ z(P|!;F?L5v`JgG_6ULaU1&d@&YyG1U;4-VZ5#WBmFF5Cq3*akK$~TPw`@VmHbN(d{ zOhk9J)(;y2p1YE;+giKbKAQ(0jYb=T!QfXT5_a3#6gB3)CB}s&gs?xI9)Qj4v0XOg znIv2mm3#D8+1V`matYU+vP;+{oJqiyMBOFv55)CcJX3n|9RL6T07*qoM6N<$f`qXa A%m4rY literal 0 HcmV?d00001 diff --git a/static/pic/back.png b/static/pic/back.png new file mode 100644 index 0000000000000000000000000000000000000000..ea28a89b7f7f378c198cfe84b852e86cfba4cab4 GIT binary patch literal 1104 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 literal 0 HcmV?d00001 diff --git a/static/pic/background_done.png b/static/pic/background_done.png new file mode 100644 index 0000000000000000000000000000000000000000..033d3787514e81ceabfeefeac306b84f4775868b GIT binary patch literal 32742 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 E2MYqJFaQ7m literal 0 HcmV?d00001 diff --git a/static/pic/calendar.png b/static/pic/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b2ea412e06159e6aad6d48242f371a346549e5 GIT binary patch literal 709 zcmV;$0y_PPP)?S)uKJWYH&C5Q7IlFMqc%cF=dd3z< zVcWJ320`$LnRj(mZMWOU>h=2fPNx&-_@%acQrK~v70>fxP-e~@!?x{{K@hyw^&1}8 z)MOEy@B0_RFkBgOJOTil$^EswN+IHD5xG3huU4yl>~_2FCdHcwY*|)cL{{?x&CqU* znLm$;Hx^ha^$7shW(c7bYFw#J0+uKPBKC>s&~Ua!qp==_;d|X$R7%|hfcxY8lv3vb z;8~JulbP>iM>!Q305+I;C+nz`iU*{#=p4sc^*paX$uEtIh%brgj5e@g7^ix@Uc9o) zxKdyM*kR_4{~s6;&x**KGSp3S{7ydirf`X%*;ESxjEEOS#4Sb~n+iX3g)Pf^E+XfW_l$2ubTk2u zx9Z_-SI4#jP8F~$>nZ?jCHD`A=ysy;FGO4tk&u}WM9*|=3sbo0emwIUu7EQNR0=Dl zZUDfeq^;c}qPQnpmbEJ)%ZL~d(Y|CM=C&u4^P)AWE?D0$OZ#hTP4X(8$c)y{=B2+s=RHe)rrzXJ*bQB70P1yaWU98`A)0EsQBR zUB!nw_@QA7SgMOOL*@(u&W%|F9)wKThvs=E^3WIW1wNdaxz)Dzb!Q^yc9qsmto`Pj zIA~n!bI#fZN{tr!A+2wpSzdl~Qmhv^H|8yHL%|o-YK;xAt?dTE1d0wOCr4eaw&mag z@GcX%*)MPo)Pea-3a#%r=kERYr{*3~ zS3ab&V}5j&2wgZ_qcL-oC`||u(_Y%1=&wxi=$c0Sg@xKoI9=KLO zD)>+rxjty%Qtj3QVH^;#7FqWJSKV&yG_--Qy4AWG($M}nHFddwJhi&|*#}!R zv~8{S5jbB-Lp!=FgCavwUCR9WrBPjb`FuFYaqpGEAYnq@bp)`-&^*VD?K%Je002ov JPDHLkV1kUT2ABW< literal 0 HcmV?d00001 diff --git a/static/pic/choose.png b/static/pic/choose.png new file mode 100644 index 0000000000000000000000000000000000000000..15069893058c40c122949819caa4674c2de0988d GIT binary patch literal 1297 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 literal 0 HcmV?d00001 diff --git a/static/pic/close.png b/static/pic/close.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9b9dee5c4a41636f3200ff6821d8ae22ad1fc3 GIT binary patch literal 339 zcmV-Z0j&OsP)Px$4M{{nR7efol}iqSFc5~Rgv2|!!?^Vh+>3-exHBg1ypst5-vDf9uZuDte!omh|RXhH>dFcY;wqB=C-Tn zzEOaT(Jj&#XmS7z09qkpO>PgM5nwDMq;Y^yqBQm2=d`X5s;WA*!c^1#K7hmLhIQ9C l?Y#W7DB9zfIi&pB%m>wxbh=DtD<%K{002ovPDHLkV1gk_mj3_% literal 0 HcmV?d00001 diff --git a/static/pic/company_introduce.png b/static/pic/company_introduce.png new file mode 100644 index 0000000000000000000000000000000000000000..67f65046c24d0de188682c941e41ee6042d7d814 GIT binary patch literal 1151 zcmV-_1c3XAP);o)~x=83I$cuzh`xGg4&Y9Wsk8|8zM%|g&U3Xju_Pu&J=RNQF@x0IT zf8TRNjWyL6FXO<~Ua@h7Pf@ttk_|1~&?{PlV{G9q<u_Xx8Q^9>eY%tB{|*^E^|x7Ljba6`sg%vfM2A?L}Mcp6BriSIFb z1P=h0om=2`OS)5OvqZeq3xJu?DxU%=4jb&i*b(H}$tL|B-A|=$kKjgNzrp(k+wz|F zja2E19(FqHQj%=zgDiee0oZGz$Bdr5#}6Po9i#}j_|^f$Hi=Ji6WC3cqPd3D$^*As z(rJl6xUz4yUx6M=&=b_Ni*-6$=`BUTI}u5YTY$R$=M4S9hI%HG$4Db)C=P3x_T&mH(l+IU5Ol?q)dWA_WLv5>t% zx3*SY;bB;K;5Pefa0&9W1@9Cac;bk`2ad{_J*k=i^>qseuos8W^w9{F<(|u8O zg@<9`@z9Ov0H4a(6$)7+kUx#kuiHDaHIWPx%0ZBwbR7efYRXuN0F%&%~4yj7JM3AXN)eU|CLlKn<2vwx2N`~?mx_1F~1REPe z`3ZDnWkdW3{s1U`exy}D2&B)q$Bzt2BoME(5KB+CpY7{=&OP^)#diLQ7hA7v_VY0w7-Po_8!)>zc}@frTFXFqnsq^XG2+u4 z(bPL%*Vu`$)(pCPJN!0jV`=V^+87DAxo)auRBF20 z$Z9jhsZgItnmv8rrv=El{h(?Mk*OZ#>U%~WNHvEVA0?csO?^fTw0_!v5>Ra{>KnUu zH4nIpBDST6hhlQ++|FFU!BlJoAeX}duuRSdfeK|0MUWOEU2uig8_1eXgm>FKse1Jo z36qCYsxZd3s(ahO6*(gE{-P-=B>=Oa9M?-CKrsQ+XC_cipb%V5ptSzsDfa)xv-?{T zM&Yi$w)r1D+*kc*%R#9GtrQ`F2`Zq94m0f^&dYx#s1zl02sf`IyxHbp)aJB|&j4>! V@pe6y$tnN<002ovPDHLkV1m&y{^S4v literal 0 HcmV?d00001 diff --git a/static/pic/dashboard.png b/static/pic/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..bb12e67440e5b8ee37f4d38aba0e7d585f44fd5f GIT binary patch literal 35651 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�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 R2;l$#002ovPDHLkV1jS$9Q*(P literal 0 HcmV?d00001 diff --git a/static/pic/data_background.png b/static/pic/data_background.png new file mode 100644 index 0000000000000000000000000000000000000000..ae667b35ca4143d92d103b19ae4b0487912a434e GIT binary patch literal 33223 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 literal 0 HcmV?d00001 diff --git a/static/pic/delete.png b/static/pic/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..a83a40c5d6a962e364ff9e3065cff2227a6ba316 GIT binary patch literal 1484 zcmV;-1vC1IP)gJwQ4)^6Q8E{ssYRZ;$kz8N*Z2n@|uwyyUcbK75`gSEY_W#aFx_ntqW-|zm; z@0{N$;a?7~H*i-*qIJY*0B{?Cn;4i$fK-KP29N@92EZvM8j#8SW=~Ia@8!0r3gcN7 zMQNMG^7w}gUSB0-C9c0^!pr-5BS-Q|Re>u?%bhGsT>$Pb@NTWvSq26P{1-Esm5^Do zM6h_A44y}zc>o**Hb&T#p4zu(cO)xYsc}VVUTDg4oPgW2x{M)6*h(4f)b+@zO6?Vs z_xt^>vCK3L65a>%!kjClBnd0^p2*>fz*SXSlmYqx%+ER`Iw70f($^RHtyaL7+ffvy zo*mB5!B`_!I;qDa%WZ?ZeZhN)IS$|!vC>B!IUHkp?HXlRI{$@)~x@N;Zd~{;s_p_6kPEI9%DuqK-cF8>A+~6 z88{e?{#}l^K@BdD$ZT*;!`IPhbgZ1b^}f*;3_8dho-9Ka>U&h}M*t64AO8yQrd5HJ zhDi|uX68;j>_sLO(sg~<4unV5z60H;w`5#s({+7xGG(_{dxr>{ z#k(WJ=TASJOeV*RIhqvQqXwG*?f~EtiaqI+Yjq;ge!&*85DJIG^5D?O7hpUq9`z2N zmscl~6DRNXYFmh~F)PD3I_}7*2V$|oQogPLSA3xclg(}doIAQ}KLOBmYitmC!i_GWo_NQxTV z#^4u)Y=36d5tL^bn~3=h@vNepFag}7YP$fm3PaH|CtYpFkGH37fY}itMb$oK;1wZ! zGG8)OlM^O_d$mE46$huwnFaaJX@|ii3 z1}?o-X1m&sx7Ti~cvNj0fR_aHpBGDFprZY4=}!`zNanL70i84I_{mxXr$^Pc16Xf4 z%_lOJoo@knv(gjg3h>;6U?YROYIYok!?I^+WCs|}3BU=7%%cY01!z<59UU9RsCqCS zFI(4Fkbs6(ClZNj63|XCo)OTKCNjmRZDht4A@j4DHq`$9ZtK)3I<9KU_o%_`0KXu- zmrP`eSKGjZtwQ$KbjtN$sZ3oI+%j-^kp+-W#z?FEA}g2#co_qoE*r7pRs*jS=mV?B zGSkK#rB=Npcy7;!9tX@Q08!TBz-S%YDr>#o(0l{NvUzjrBkk?&hMlwC@<)a_uImvi zgO}PW#mm~fR--rcs06d?8ofx2mb|*TeSwFFDF)!iZ2SYsv6SIYB)ZSpS;<<<6kOeY zFMC;b`?UMP=q14FELo%C#8Hb0RCHO+J8WudUTjLT)t$J)?gjnL{vRkEawHj1ykzCk<1AdVi%~!JpC!oIs zcx^t;Dr&*yCy?!j6ZK79(~~!Wu_U|F)iymZZkrNqW&ne@7Te61;Qxn>{la~p-8!Ik mM78-Vg@Fr{{c5HEO8Ez9l*RFQKX|AB00006ZK?@N~1#M%|<3|GV^}>pO-f*!;*d2l6m34WuKT!*d?4u zz_rAG(Go(4eE>WF+e)eJSstpAmI%Y}v@zxzW9+V!@=j&oAP9~aV=iVC+|XKoAN|cD z!DoqRJq^qlyCtQ(R|~M`dHb8q=E*ehU@+L~^?E;R0WR8m3u_7A_s?+7Kc~To=(g7S zek~I2cDsUe{xBoy7gEaCwE!<&OSrLC;K-)B>Fii*wOS|A>KJ3TlGpFTrbK~2c9uAB z(d6>3t8Kzj6djJ^_*e2lvcT9O@l2J zoItOR!2S}^C9U zO2M;2hwJA)hvx;Gw2uS3gcAw4mT)bx>@D#R@q1i6Z$-!600000NkvXXu0mjfSsfrt literal 0 HcmV?d00001 diff --git a/static/pic/dot.png b/static/pic/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..695bf245911d5b0384a33ca120753a950d9d5d67 GIT binary patch literal 563 zcmV-30?hr1P)Px$?MXyIR7efQm%mHHKorN{yE-`OCMdYN+isdd2OWiig7{AeBG@&93JN0lPl%wP zIO$TZRZ#ra7_98@;{9}1KPVtqR-X%@O>bBf_D(hM)ToLjJ+y>HJC zf68f=55|NW8lA#ykB1sdChzRc0(5P_085SS=5TS^*5|D2)Vaxf@6ddGoF%9PB=4=f zUUK#0QdNf<+n{fY>I$}duV=DUFuAbd`?iUJf_+D;*(E{5_@DYUruJaK8mxk$96TGF z8wIOe@omCq1{z7Z9gpme)nx!mwY;IaYR3!Qma`lx`nBO8sg){Gh-hpjC zRG8^;q@i`cS?4&yG_0uWaf$#Vkz)r<--|f3eE?Q=yHP))F z7;OsD`k)ZnR9ad>pn;~fw6l#y&<1S5lq!`9RuB~HW@qk^+3BV`o7v5LY-(m+_F?Zm z_cv$GJ?DS#A%yIqkntiIaGFI-TT=oJ9>dtCf7z+XZ{KG72NtH-(CJp4ot-xbLlT};>vAnJ9o zvhg`$?9=OHa;%g7aBIu8hnq8cn*#a>xZAC9H{%$%Duvu~Izjv0jGqD6ph1&)8f3-Grw2%seZh?l8DXpkGUx9D1>Nfm*wd-m{6ge@`- zMU`x=So6T+a9Bll>j$ZJl2Is%&;jDZ0!-?G+Yg^+Dd8*v7(nYx5-oUe5@ z@cKe#_D~VIv^?d_0B-KmcQeEBbGTi!dp)6P5n=0q!ucz1XU!Z(jQ%q_BCnVJV*|D- zm@yfoDAY;dWTz~w@!1K5&rh*`Vju@0A1GkO=bgbUJRsK1+tTj^dXli zk0_@lT?x4H0pP=z1s2p36f-i16^>1~+c6C1knptW)-?fdw+IL# zOzDiyL4`9vIRh_U2z<2C^<=ce)-sr8S?0qvbK6V~qu^8;qW#3aM60 zON>k?tbCAgXM+XnTMRiD4*#Y3`9|O!6Iu|I;=*tF^Tla}{^K4!d))r z{DVUG5jOAG{65tMylJ)hU41uGup`pyM^LDQJx3YJKP+ZFBALLUJA@Xz9HwJ_G1x+N zkzzuJ?y9Pg=E8ItSPYF&UALAd&(K_GmqHg>28PkaT%(o&VV^GNsAW(J9-5}ijQU#A z_F~146VVc8+-qxl5q@Ll3nb{<|E=xiR~Xb{-mFcTS}ama8~*|3#vx0u27sji0000< KMNUMnLSTZb#}qCA literal 0 HcmV?d00001 diff --git a/static/pic/head.png b/static/pic/head.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bcdde86755b2287551056751a38b4691cfbae7 GIT binary patch literal 4734 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%0Ad~EZi}Fv{3>RGd_kWjNq_vzlKe$1 zMTOiC7HC)4XN*s8E8X}Pf*rx=yc2}L!f%&sJPb|!qriM6&m}GW#};3_IWHKff;{Iv z&|Ugm9PgOZ(6b}0&s=-lC)=BJ^X48y*Xx%DE$1t|pbDiJWe^<>x`vlzajbZ_wy`_j z$@Y2$DNFz^9Hr4b8wylGY)D{*LY*$*haki|n-KEkUJI{w)#bMilmh@Eb#ZYMqfRj7 zOXxM%t!U_e`z%jv-dOJ7=(*FzuD9ac?AXF!wr~syIZehKUs!&;k)2|9wguyroQLtR zwid6y5{^EkD-fCB$meD7mF7{XC?n=cz0WiD)@64LRYaoieAIo;ttU%D(Lu}T%Sl<= zG%$7^+g*KOW2#xl7$Y-?NS<2 zee4WI)P&*0cxmYWxm~8SIUPfOyRk!2V?O*hT$Bs-@_P>F>x_dOyzb#weR&dbvVaMn zx$;EQAj~+z%L*_Uz-&rpbWcYDRbYzZ^#h2F9SknUKX=*Lo3OP=`eBmVQEI}H4YcA`c&%H~&ePCA z!TFe9UD^>eGxt+wWFul35Y-4>$ znt%eY!2$Ub9)%OxQyAT5F#f=VLZ6Jn)`1g@%Ps4Jxwt{>=f8DB)Umu8CL^S;)IPNzwj<#_-V_S8N0MCpdlMLkmPl7SV33E8H~M6w;_HLQXI}5~ z4)lG?BBfoas98IP(y$AqMxqT??o20Fb^WLqjx_gc{lRDh^Mp~tA0IAB14n<07xo~4 z2ihXHrHZl@0V^;IQ&Kqc^kqoCBu-D){Mpz@b9}KV{OfeDFUdH4GiRze?QNhKw0UdM zW~0(N$Z`d~N`xWDwz5sXf?st#G<;LasI%qk3aU`Ag0?{q7SM-OC1~g+(SRz*Qw*%Y zEL_`4HynTg&V7X~{hsyo@!YT9f4$vZrX}R>;T)|k8)k2?Mq2~Lt{_k`sjbymuACH3 zLxzweN(n5#lb_-3`y6Yi=aPQ(V#x8aT>E1Ntf<(!EN`TEpN810sX=oN!jtQ;mYS_O>3pvq8hM* z0YZx%+wtl{EYCj!YeR6R7tu;JOcgqeTVeM2ds@f*A@SLt_N$`fE1{|a>udPvf4-5< zI$eJQBj@h{;xl~9)J#JKS(p;nz!`+UOZxGPe-uVDYU&eZPa3eILTI&=WydS436D2H zC$|RLb)Hxjt2=<_1Q&DymZcBT8tu-6AHC2WE7?-zOggZEhFRWzy%=Fw1LN=_Sn^s7 z-UAjBrGGf>X^~i%%96_vXoc?`$QQ{8(@)^x8*QffM%2HW_YU`LLcQLzjP(QB>hJK^M$cfm0L(R=KIbYcgz_O`W5l zUN*+6D=J5n3Sw6wxAz#}jPSU0fB`f=bw`vLX=s20&5pkGB-X<$Lk0cYkK^I`3N z_OFhh-z#o|e+90)QIrS-{YN=(((nMMG>@)03KI2j8Y(ZPrmig8(^V-fAC literal 0 HcmV?d00001 diff --git a/static/pic/history_click.png b/static/pic/history_click.png new file mode 100644 index 0000000000000000000000000000000000000000..b69c07ca145feea1e7ec168ddea8a7f76a477d64 GIT binary patch literal 1238 zcmV;{1S$K8P)Px(kV!;ARCodHnoUR*K^(y6X&5M(bV>31l#mg0hzjiaMVVy>`#6=*scScj%2W`7 zBI*!c#Ui1)MTa5+?bM+t%2G1YNP;3#iF)euZU6ssW?6^bc{B6ox$nUY{N0cL*X(cR zKfCTeLTs}HECEZv60ihh2}A^jn?YAE(3?=@nFu0?@fCD40=<+f3RX^zOTW~Wf>EYN zM7AHH+gT8F2sS7T#S5?iox`Avz^GrD|>zA@4bx;Q3 zCQ7Ujf?~Ki8Hg# z2<_7N@#YR${5@@Cs#Z2#HWDYDAle{)z8*6698uADiNK?BI@gi5uPqIV(1M^Kv`eF= z{RWBuo0FK5_##}~43@=v$kgV^_Sv&9+|>qARJv0bI3(q7$ooVmw=E4y&4QpHv`gc| z&_U_jXLqHt?HjMj3h_(}c7l4>bCW|UZtk;#!` zWNvEp27oZ?PCZhY83+NL_t2OK<2Xp*%+Ll=d-xX3VRnNvVPd3{%unH9t~Punr~re9 zfI&Jyj)EW%- z?mmNo3n<>g5yGEuFI_#|k%oZwp@NWwP}S0xyf!}=iFhn+2%&(wXuNh27w>$*=42YlOnC#;0-9u#%^y{-5KxbzTo)P%F11^l-H6bW& z5RA&^D|p-B?+*ARx8EZrL2;EqK%n8EV6x}8)OC>BBez|1SqRL5hf&o!0RPnW3^KjW zR(Y|+-yzUX@M--%qICCJ0&i?d?AIrl3D*Mq4j*^n*PaPiAIZy4?jsC*vjxWs718s9 z*e}<}@JwS|t`W|oFUmZKiZ7U_Zc#At)|bisCN4d$hAjRl zr{mX%R!)zVbYOB3L`F&@BSAH0|6cIHzM$ZLk?%lQtArgCyv3qSfFxf~!WJ98o@3X6 z=g09RZ56OZU)E6P^=0Sn))KG;ECEZv5>O!UAJVtAa6a@bH2?qr07*qoM6N<$f+N8` Ae*gdg literal 0 HcmV?d00001 diff --git a/static/pic/information.png b/static/pic/information.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8d0bd9713774637f2ec8cf3c9aa9544da038ae GIT binary patch literal 587 zcmV-R0<`^!P)xD$$$ZQ2?L6dVqhRLk)rrND1;1UU??wnE5zvDnUP3dQc7Xw zwG=Hqr_MRoz4tu(+|IMl$sX-JSo`vTuh2iJm0#@P`7PkZc#58Qh{lc&f`Q5mNub4F! z@J2kT3GgO7#5c_B1UOP=0p8 z$EuY4y=2aEIKZZ0DPH48FG-VDHgEyP7RkW`jy3pGX={^yRJ-*Pt;028ZNV6~a6GP= z!y6`YxUWld>GT-PRiZg1)?h#G;Z^~=vmBm|7*R%2d0v7yJ%-K#j{Y;6pDQ?o6?j%> z;9%Q>!?=y}J%$arEQbs5jglNp;8S>62YXX%8~Y^VmgbtUcHT?GNL^y!{FhNv)3n_2 z)Lh!_!Tjm|cWYhbRdz~j!2#S&dlOw~R|?Gno`H|4Q`?1Q1=i> Z{s3|dyDc*|hXMcq002ovPDHLkV1iw65-k7# literal 0 HcmV?d00001 diff --git a/static/pic/information_click.png b/static/pic/information_click.png new file mode 100644 index 0000000000000000000000000000000000000000..87fd3a81eb32cb97aa0ad0919f8c18c651965e16 GIT binary patch literal 1115 zcmV-h1f=_kP)Px(6-h)vRCodHTT4h4Q5c@N*H_t-jMQl1CO1)VTUfMc(F1xw8!e(zQYy7g(4tL5 zv?^K@ltHzSl7d`B_J(X>8+(w7(8GmNhLu`aO8LCrzMszA&OOeI_Y7z=$MehQ`Olg2 z&z%38|DQQ?X0Bmq(F|w?Y#1; zP5^&`xA0`7@D=FgTzwq+Y2Yz1%(VwmosU5m1ADo_AA;_fBHh?%v38j=Qbm2p`Pa!i z72+$<=W+GtoUV%cfOCZR)ewo``WaEaqKH1|%@@$PlrNc}%miyG*y*0#AlGp>lJGoG$^aTM*6N z8|(~@e*rMkt;^9Ga~0AJoA*cg*8WK!b@ z_DUqsOVmbSJ+KK-LS!Oh7W4QGN?OPznfphX!oS_##6DdHaeX_?`8A{50g4d%+)xQ|n^1`kzD5J3LoGm0rt~_HK0XbM;FBiD zvC2fmCG3ULf!=LUdQ<>!fxw7qiVxfWhAtBkqcAH44g$)&*s-XPi3rO^ITFY*HzLw4 z&s8bMM~56;5s9E>dP|gfi)A_VqrKizjd0qWxK4_Ajc7*OX4YdT%5LBWK$EDX<#+G9 zr29@s$LP>cqqn8T=zCumKU`*R#29IFURx#S=^mpzmhZatJFqwK8860w^Zms}O@^649$i^Zga!a7{Vt>GdXpa&z@D(WfF%bAxW|Gd z9QV77vQYi(}a=>Nm95uiV5%sPla}zU`fg%16#=!zttkOr2HypU8 z%{ggYAvJ*cO@PK<7l?V0RuTI?)8ZYG8uqoJu(MEI2k?3@)HI9%Kc1ag3I*c<`lK@fh()XI8JVAwOfA?$o8DX9g(yc8&+APU5l=;nf$x`M&mz_0<> z4?&wD`DXx9*pjoG%Q}u_+jxcz*n7-b#&$FV^c>jS@;MHo?L@puE010DgcKiu#&n-M-a)BLGhJ8VdkCXBSGa5jc zoDOtU5Y;uiqUP$itgh`=l?vq^Fh2^QiwLi3F5?SpOjlka#ts1OiG(a^t!zI({J;#V z4=YQV(ZoPWI-{qV@vi1Fb`ycSgRT!2-DV^46F`*!I)ojIn@f%T=D0cGPEw8om`=b( z&26OWI!DW?BpM>><4MT@X563ldl8IH1u#DHRlw|{|CuMG%m84n{JQ~Ml!U4lmtnRq z%e*0F4Fg+1xFE&&l9sZ+V>z-~kM#>&7c8n2Wb-qyFzxgTz+1S$9tf0NiuMlV39I*U zl7A$^6aZ(*&QEHku}JrGwGlW)QaK4=3K7<6E@SgRU^4>O=o6-mWBDF{XrTO*7j$|c%yXNOvHx_>r)bSA>{%AldSX;ev{I+EKqUjY$nh3VP&2am2afw3V~TlAUZeDpQnV@UL^?FrK%lM#R% zltn%c7`Xd|dR=`&GH(R%K^DDz$Vu;CID58A~Rln5Tzo zFb?@EjFiS0q-AYu^~aT`IEjrtTG|yN=;>=ogqr?Vd)=|3S!A~zH3d&D@-f>yvI2KI z@CKdFvLGKAvr}1x6ol&La$|RYK|CSFJUu*?adQXTLG>C@i{3R<(YOXPe?IO4+D~qc>#Vah+>755P&-Y zZ1ua1wY>v*!_KO~$j7_@n@-b5pgra;NP_12%cDoSgAGMK<_*|%?A6upnAtpG966;M zbH84KWa_?B%?z`ZwI>|1q;*E_@-eT#8~&I$H7OG2mR(H1TFq^29jbiHE3lQ#pz|Fj zdLMvcvv;{EpY3YtZs> zM1a!^?L%g~ZEb>rS7_yflaC_?oH}$S4ieLOhs#)y>F;AUplstgYl&=*MrwQvINzBb f%kWr+du8BXKI3Ccv~8or00000NkvXXu0mjf>P5)O literal 0 HcmV?d00001 diff --git a/static/pic/jump.png b/static/pic/jump.png new file mode 100644 index 0000000000000000000000000000000000000000..74acd964c3038de76a8912db0b272f535c743ba6 GIT binary patch literal 622 zcmV-!0+IcRP)KR76b9h`l|)drNHDOlFqEl^h)QDVTqzX`xKgKv4ax=*OsrKG7+_&xMd|`mhav_B zPz$VaT-$&ID;;5jp>zPp_mJ_mLscn~&nNjLXN#(Mey}f4N^V<8S&|2UO<@@m+fS&=F$leo?pCrwtUhmQ` z6KHL)Lf-`VIe>;jen}E|3k%&JWur?0XQ&{Em!-r8z$X>*+i1ksdOc^iOmu1B47IZp zFQzHK0x+2)>3gFgJ;!mrmW3`AoR>#<1)$dePAlY3B3crnGb{sLIym1wVj(5JCBhk% z^lu`*E<|@*7i|Qbp~CR<+-Q_;0enuO{}9oN5SL%-ppAj^q(9Cw^E-ggD`X1LJ=g85 z7eyNdXQ;s-zDUIH0bEc>258lFJ5P$Bjf0~onn@CTumWsVNel+z91(2+IQ-Kw^R4;$ z?q-ovI9Ow(B(iOd8E*hSt3GI-2>nWKYgRRm<6CpXbDVbdTJzDv4>NYtl&@Cu@Dl`| zZb+HFu;O?b1kr6NksaVqRQ>>e+=w(a)$F(16&#U#KU^c4c*M;Aw??Y^5Nh3+uVy)W z9;E2BSDm#+TC)yl+}avEE+O6Pb;7y{j$2((Xw5BHYmEohP;F#rGn07*qo IM6N<$f^+#3MF0Q* literal 0 HcmV?d00001 diff --git a/static/pic/level.png b/static/pic/level.png new file mode 100644 index 0000000000000000000000000000000000000000..46f592a6b3ed0822e2292caba20d25b4867a7a58 GIT binary patch literal 1760 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 C$iQ>} literal 0 HcmV?d00001 diff --git a/static/pic/me.png b/static/pic/me.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5ca93b9f714aecc98b1ed85b989e290684612c GIT binary patch literal 1803 zcmV+m2lV)fP)Px*#Ysd#RCodHTWf3-RTMsVc3PeRY@sb!nr^%8qR?)u5R5_7D5#(YLu{fzVqzrt z3i?C+r-GUoj6eLN1SBRV^^uT}5FTPe3{hev1=?1^+v zw!3?0XSQl)l4j1m_dLG)?VbBLGX?N3p8=l%p8=l%p8=l%MFyCnzH927a~2M-E@Y#8 z89C*7tgoZvT%0k+T??Y%D5pg1-o0CE`uy+~&S48M*aVy}l&~^(12~*u3=VI9X3JsJ zH>GwD3ppdAy0T`YVX_af^Q$uI4`V+EH2%h=&h~FI($7*UkfnWEa~cJ`J@NNV6ZWBU zQCfoug(4g|+X@Sc=j?jr#qUm^KJDovA>?LZRq z#5M-n+p+Gpcf>k3WzUGHtgN{k3}{BMLJZceGkvq20DFgskOWU0!O>DKv~dW)n$FJl z^Fp0#qUM?>yCakB#i}F;IJ|$)pObfQIughY>5wkj2yPkN@+nlgCnkZq=MtbgSRXNX zqE+-6(6sw5U1>Wb)}@oHD2*CJ0>dpAL*~uarQt2MrIV+ym3*hO z&$QhWA{g+c0swQ>stVjMIJ?GelUr?@Z)Z-YuyTE}q)k*PSUUln!APvDebyAQGp-5+ zYld-`nQs}yx}uufhciz`ga!D&boYrE|FwJ~d?Mrr*Yy!WlNcse{<6Z*Bo_*8bUay- ztvFGVZ?`8(!skv$;-^9nH$6yu49#IlM! z3g!k$-{xCt%c9^35lmypMNGK2*h!fxu`UytY{*vBwfh#^vXMPW)h%99(g!B&LSRH4N@eG?&HBZh+D~gYd)}-)KpSyLqs-~!Z+X;)=7k8&|k3Tpbl_q z9_06s%@B-~B><1_COn7f>N`b0D4T%*JmzI;-%}!}Ggal0ohI;)ap9YG6xcd#D>6d^ z_R{6m=4X0N|hvs2f0_$#Re8oWNxS-5!F zXN;S3aOST^>y&X(XB2mk`kcy9Pf^oq~sNA+vMuN^vc$PnvuCDUoOrMcrn{Bd3tW8(Sbp3B|QvtnH; zSvnP_QlvIhgQq1O2Iou53tpco5(o>$CJeZGNFR_)!YTouTu>qcpZo_U7h2#w{KyMW z&og_CVL&Vr3OiP*adJVGh*Hr7W2RE-O|*4eo`i*igf(3}H6ny#G)|BSr)zdPP)^zj z3t^hDRXg%45-}0x|0elFjQ^rO5l)D}M9PTuNZ=+$Te-4fzEz&-J7FPA77h`sRhR0n zw6nx*Ev3z@cNN<3P`nMlj&XFzNd?MD+wjmJydn$ thAn>%yX}Ya8SokK8SokK8JI~1{sC9e4kZH~UxWYv002ovPDHLkV1g@NS@Hk? literal 0 HcmV?d00001 diff --git a/static/pic/me_click.png b/static/pic/me_click.png new file mode 100644 index 0000000000000000000000000000000000000000..23e661b3fb6c304230f4e0fc50cd755a24710124 GIT binary patch literal 1489 zcmV;?1upuDP)$X?ji(cXK^y zA#2f|BP0q38rRdW@xUhpEEU<`0@1bz9Qp*NtwO5#)6Au(kSZvjDZ$GN`&+(7@0nUa z8PNGMX0Jt>W4QvLw!K|k)4G!)4-AgDflCYTy(1)se~KhJ zBJiD2hERJmI_oRI;eJ50AZN)Ti0OISpFC<&#f9!o6gJ2ke;qEdI^JVoLu7NILO$oK z)jmGp3fF=0;*9{B(mg-9^q_oNsNV0)deMNz~)`0IN9eA^{oxqi` z0(ZIBVZi^r{y1;N>B#IzUcA~^E$&VxFiBR22CQv@A>cVKWfwEQ7AtVKdmVzq05j;# zrVZi;6TsIhAXyz+EfoOXF9(|SsxX?uUG8@<;6JRdOWq34P)ghkg&|oT{{YAZa7+&P z=IbSGv$6x=HL;fVa(x9tf1QM2$;Py$$F4D>)r}j(kCT}aD6u+zWZ)5I^!5fR|Kde& zZ@EiZOU%ROB8U3WQ8yo~1Yypfh3rLphWLoFxM8E|P;!Bb9F}6 z7;bnb*_Z9jD6i}Qix(^knvC`iH#$pL;cFa{&1NqXR4iZ!`W1PmntMx7h8;~*gH?(Pj&837*^c=~ilwpoB1fYTU2+*aO@in(oVzRM$d7!_Eu zI=%t0SaZU_IRV(IGFpg8Z!hB=%q$3mQWaQDK=GiTZ{>jRsknh{Hv4^~(#Z%cpMlUf z*YEdt#S1yyJe$on1!|g`Kr{6?0?+pQn@`2e{gHxSchO{Zo_zl7590|N^(7VE{U}I? zv~LWTeBKwi+zvBFObMyT`8kNSE`_slQc^u0kKrS9EPt%5tjyeb>8kdAg21#_KJQ%~ z7qHFh_>zEU0aE0EcjTjYEQG_@N>*nWV3C1?{($ef+XGm#I`;#tbt`ICAjRTAl2QU? z=1%KX?Y)Em&;dE%eIZVTo$nKP-QeUuv@R>bm5((&6F^~P&ryv(;EmZIkG$z5XC4&x z0?1Di=#6eKLL{dwd$s%G*sFv#Lz3);P_TsoCxH^`A7Vi;SRud*5mmC>tgU3sG3rTo rlaw_aW&+r-RB;+kC>*D7hNt}pX1^v&$Bk5K00000NkvXXu0mjfaje0w literal 0 HcmV?d00001 diff --git a/static/pic/modify_password.png b/static/pic/modify_password.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6af948bb42f8f9d5b294ae79c0c0f2c4b7c499 GIT binary patch literal 1282 zcmV+d1^xPoP)o-m>26{zyGoI2(M{`W2tlxfPCEg9K5;N~VX1lYrbJ63U9SlFIe?lXp>u~T*lLDDzqBPscSv&j0o<1Bz`(zt zKtrci^^MYHu(tXTwe@U^xx!-bAp8vGd)>KQv=HSF8Vw0Vt&D4@m?`_D&OEtpyKxmIaVj6><9BE2Brj{T`p5UsGPJ-0-p8e zAo|GE)TZkK$E^|04VYr5)@r%s&tkyt*w(J}c9wDg1P@CD-PA(e*`QF|vU@=|0Pwh} z*KAx2*JO7CHoJz4CqP|9|8gl{^(qB>kGcn%hDKop&gZA+z_rQ{wk zmjkd#p(l;7`t@=P+n1DRwd`$7JOIX>02~q&Ga_nN4iigWY9^uNuxV0gml0OKSPtt| zynLNj8etF1?3OMM3sBtDRcmH}*}EaR7l0etQ6WTQM!Y{zqNoh!StvF@H^H2C9u zUrE6&345zTau7rwmWf(BH8nY%vzGldgO6vhe3^vOWJH2z=AxKlUFoyL{1}Lmrlv+` zUoRQh!+NC)o4qsuwHdma$W7LsvYQ--`#db;3MtBNBT_v$KZ32@W1Dz#>hJ9Lj;V(N zB?re-BU{+vK>}s4g4&G83^taun}~26;0gxDNd)$ok*ZG?OGiC9v^hY^AGvF$9-0%> zq9g2L;lPb-EkKTYYBY7VbEb6Jjm+qCu>dBZV4oQdeVlLY_zKpn;k(K}ZVq}_COXuq z1CUbdpvt!fuaN+JQA+@)-UAj z`?jaX9&ntg+(YP9QxCc4kmY0W+X@Kf2I7eV-bHNarp2jJH1T&GPv^mswwXlnF+ zA)T{esH*~9ILWvW^h8HQ{jwmi+bQ$5M!pK5p#-m63;W%KF)+>ui5EMfp#_ip>u=x- s3**Xrtw(s}u`6ukdV~v$)5?4O2X^VkOX|j|Q~&?~07*qoM6N<$f}0j$ng9R* literal 0 HcmV?d00001 diff --git a/static/pic/no.png b/static/pic/no.png new file mode 100644 index 0000000000000000000000000000000000000000..a9fd703b4730adce043aece0913cf21aaa23cb43 GIT binary patch literal 3478 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 U7vYiB(*OVf07*qoM6N<$g0*w9>Hq)$ literal 0 HcmV?d00001 diff --git a/static/pic/pointer2.png b/static/pic/pointer2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e128f20796ab862edf07db636f4d67f4a91d728 GIT binary patch literal 1497 zcmV;~1t$85P)Px)lSxEDRA>e5ThEIeMHH@A)zh;-+z28@G)8nyf*RwDA>`myka%}dB%nD&6ms-F ze}O+DIYbBu-ps*2K@T4F;zfvfk$CVR?pDq2?96o6^Ltf2v%72$BqTeT*{z1&?yc$F zu71@Y-}}DzhSZ#F7r%V}c+ac0Dpi}vw-r;1iBBp;>!jE*D~oeS#FiOH86$1+JI=|m zVjHhB81v4Mao)3C(2H)cY}~IOe>0quP^4+jX#{B2=FLFL`7bW7vM*Yt0=VM-hGIT` zkaH!XA?~rxiXtcja0S2uy>sIz%4!51{LnblV|Mhwa(xm=bHZa zd`94rg6-Y!JNX}f-+6@#ZY#|#7UojiLMT_}Gn{eO2xJF{K;!bN9rP#{Trtx7+g^i!}G02uuxZ7q5SCY?ZS-@pYHejt+BoWz_7xr3U9_V9xB~qQUu5cwygk)H3=y(t`004 zQ)cK~02QEw=EdjGx4zWQ7`8@dK^w2+$J~#f-q=jQofPN#@dtYONBYY1u z4qRW=KS~;%Y6O5tNq+-C$1JNVO)KUUSQcRQUYOTA*3p>K(7Yb$vZ2zI+_Vc>=`LM6 z)$LG682nIg_YAf@`U-9!Oap*x{`J+NUfp?mI8xn_cCB1xF{Xmf#Y+mXMt#d19cB-J z3ve}nTY`Oaq|rmY;7&dJj=R0K25)Wlwpy^gdF#qb_rKojm~PZpj3d#jNng$00;U=5 zj{sikt-!1RBT7EOj2fF&VB4T`r6e@cxxsOc%GRmE+FcR~Yzv)>l90)iEryvJm4vh(6aYABAm8ARu`Air zmLiZM5F?P|AbS(`UJjr&Y~sh3k48Ka+m&UOUwQcImPm^Wh5gr)@1eSwu=-l)oP#Wk_BNW;v5 ziQ}UN^bKXDT(Z2R)*oh_vleW1p%jDU&%f@x<`u)n55|Zb&%w@rtnT_WmLhOJ5s(fZ zX}JS9LU}<_H!(`UCKfw@Ams>+TB3CB#8l1$Aes%_O=-W&Tv3ue^Ze@itak9+GuY|^ zC)WRkuP&b+mPNGvr2~Xi3*%4KU7yAdSp-P+rF|`!5y51L1@|2`0dwfslNy}HP}f73 z42%hBam!F}_a$4kva)d$dQ%?=Y?EG{_Sf${!`moilen3ope<#B7gAAsQpBb=4j}Z9 zVuixBFvplpkYZWl1=GDjjrUUCK6u^;&;)sP$I(`q94E{Y^uonZSV!^|p z1ErslHv>ylqCDsifFvHPuLFhDt7SwHbf97rM zk%Fx*SRL-@A3p#6CA^dYd}>NM5MVFCw%w}W89=dzO?C-)f}179QUQ}NM@X>%7FfJ? zX=%y*eC1X*0i$?zhjr+njXoG@c^xFe30j{6|s$FN-*;00000NkvXXu0mjf_KVho literal 0 HcmV?d00001 diff --git a/static/pic/pointer3.png b/static/pic/pointer3.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3e25e7728c9632ff26adf6d45c9bf6f4201338 GIT binary patch literal 1359 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 br=t50Bw2gstvxiC00000NkvXXu0mjfP{U2K literal 0 HcmV?d00001 diff --git a/static/pic/pointerAC.png b/static/pic/pointerAC.png new file mode 100644 index 0000000000000000000000000000000000000000..4cfec3cdb91a797fe3f9a2b225274085473e39f0 GIT binary patch literal 2365 zcmV-D3BvY?P)Px-_en%SRCoc^o4t-4MG(iQXZL*PkHZKeKm=e1CUHdK%x^$s0w=tR9|asZu;qk+ zlm|eTZOnmBMx2B!IE0W8#yZ`{PE*}8-CI>%)!j2Y4!FSGGgJMWs{W||^z684D*wK@ zdUd>Gd@Yv%XVn&u7kskQIDfq^pb z-oJ6k)cy@UB)@;zb*RNl+)-G3VyE_|nXSMRM&Y1b2M@L6KY}1_07rq@l zwB3y1!ytJNZPUybzBQeP8Pm-d{-Wy#$Tl+$)M^OdbbU9Jrd8GCZ-?-$vGet5GlbvF z8GaYSw=;%shOlijWB4%Y{ZyKBnHn1>{e1JZ31QnA!*5I+pgBDqR+2FnOB3H+ubTWI z&;6vgcDv@8st$@g{CAkMIgg7_Cw3qu=K|!kLQ;xQE_PjWT3r7{Xd-r}aV7-kld=fq zVi%+(A)ymRXd-rISh5Jht3_xkcD=N45I!zLnb=udmXsn?5WC`1EkaYVD<_pAG!eUX z8pPd5>P4s^cAJNvh+T!E7CnWm&pexBo`$R+dTowAZJ5~AC~7f$aFB#==2)gN>kr}A zJWh`G6mGJ8|JJQV=whiXLy?pOz|pg3Z-=^6W}#l>z%$+uv?ZJUvrtXsPL7Ys;PIPg zp_<4o3gVZAY9d#f0a<9Hh}^2Mp~yltk!x2Q3=}L;c|h3G9W_u*qlsL8Ka~$(5xJ81 zWuXw37(R@?cs_JP0V<1J*jNMzFY{0}A?LL}57ojE$hpHkccS}I$p<(|NtV6lc zJXQO2gV9$-E^I7<=d8?zuZbMY)ARPu9ks1`!QDKU;_f|sc$qmE4^`;5H*YST$VE$5 zS-pO(N{R~o_3%*j#PhWb1{YOmN!+wt>u#t*OX6mm{#Bj#n*F0fOX6l$`dn3^xsi8{ zO$xsxZl=+*zv^j8+$MR-pG(u>5-JHpf?;i zLaRL;6MjzANEav%#iFM4qbPDq==K>m#YVQmB%6 z*BDk4oJgUHm@(A)&{Ql_c*h|=bge18mP(J{>Bto&IFUlf_NlO+N}!sU@u1^z%{behf{IOPqa`6hrwIyyJp zPm2+{X`kYcwIY;@SFMM^4u7l_pW*=M_V3>MGG5^t`GX}p;)v=gHVI85$XFB zi59XMT@C5eL$PR$CgBEyb3L^3ztiCMa=qV(cqq<=vT^0v;s2%do(})7q_U}MM*7s) z7Mz{$&wJV$^K2HRwLdtHhwd(y--D~L)!*#TE*6g+!9zdW-+u+KIbLjpH0IS8FJAl- zp&n)%f0wCXP>#otlzg<_QwM?*Po@H0JD|n(5!$rfMxM598{0?darS?}F8mbQMyNXh+8z5P7*v(k?tQ+ucM@y~6qZ@+mtas;8ai_bbYUk# zSvvx4m&-|>!nakV9f987-#>s(|EDVC!N@Idx6E-H0`)7xjvFi(hoAj2M^pm!=SL2f zTb_vLs{(XAiMg?K4AGUL?PA=@0%$U~6Hhed3ojC&IDVr_N4VDWtuyJi~PrS`tDmbO9Dh6@S>+!2;H(Bo?|5k@-K*gJ&rJRU-h^7(0Hw4S00000NkvXXu0mjfi{X6q literal 0 HcmV?d00001 diff --git a/static/pic/pointerKVA.png b/static/pic/pointerKVA.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef0d19975d9233fa0786df3e30b447f0ce71d50 GIT binary patch literal 1476 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 P00000NkvXXu0mjfmF3Ly literal 0 HcmV?d00001 diff --git a/static/pic/pointerKVC.png b/static/pic/pointerKVC.png new file mode 100644 index 0000000000000000000000000000000000000000..885383505631bdced401a1539d2c12120b182c90 GIT binary patch literal 1421 zcmV;81#Px)M@d9MRCodHTU~DxM--jA8-FF4O_1QBPkk{@@PhmY_!H!XO8qPRm{v&1OVmnz z?ISOR-2e$u1x2)Jm8wbv1mXB&W_s?-ZtPe#tYaJ2_N)|p*XM2yK$ z90bAB?_R!qKlOV}ctKCL2>~qPa9EJ)e@931BS=vK8FaU6Ee8{Wtp`Y9NkT%~cP5D- z1Ixlzgvo((+gEHFV^)f|#!t-&n;LwlS9p!t0uoVDt5#!Jz~fJin{}Hf+pH1JdHtUo zjn%W$Q>kD%uu&o-KoA9MflY4+1c9|+Qe^IxFiae{R?d>Z@_<0Xx?UTwB4N(kE>}0A ze@U1p*z^hTizx_VSin~xBOsgo;mLMIjPZ?6JGXDIwKQC)Rx8yXju@GHHOzAKyI1UP zSv|s}5hA$aRQ#|>5Fk1O3HCB8I7=P4RAe&`9t1xFXw3dUQLv$2a zcgnh2&do}Nx^=IZ5LT$C76s?{I$SFJCfU<-HFiJ;VqYW_hI^Chz`}2q?R)n^@%Zt& zf@_682=T6@F5E2E6xQ9c8pNK%RZlgCbFZxH<%BwfJH{BZK35OjPqr`!fG8I_5R*y- zT+nfK;7rIi7~*AOkmyDn;&tavm}ep0QI-RXV)tsbFo^q!cmxI!fDVMm69*g({frL0 zAX^sVEyKNPw^~tuh&NEehITo`3#r2H6GFPZ5U;f;oCisBB51D-&dLAp5m*`o26P|- zF-fgb*Z^I_isZCrw(g&Ap#=siv8gcm?8p1e<6Lt$?^n|>^Lav`2LI6Z}QxsaAeCf z>AZb7Q1j>U@kUl^WFwL`)IYq`D669A&xNrL1!>uhuI9b3?>GMlfEa9*en)c0RiPME zq10+mP=#`O)zvLD*{%x8uyHm8ad5EF(I4fgB3kPv_f>g7*Y=8N`8>6}0KEov>#-jO z^jG){526W6^_*S60M<%`I<8*-=IPd>N6l$Y$3O6CqM7qroLt}C-Hp!A&Lrm!F$`%D zX%TL-Vw)@8(LSVp(U>()+?>F>Zmh2oeAl65YqY)^>xwx$d$Q#Os;J$# zZ0yIIH*HO&b(c|e%vCX51i+-_su-@wx0U&bCI_74&(b!CFuST4m$pfh{)A>!n$a3 zni8^w+16b~I~Qp)VL7jBOYLk*2phHuOZCj)2c)yqSL3eL_xA`a38kz*=T2kMavS_W00000NkvXXu0mjfXceJ! literal 0 HcmV?d00001 diff --git a/static/pic/pull.png b/static/pic/pull.png new file mode 100644 index 0000000000000000000000000000000000000000..f6697241fd94f764368b5f8f858ebb639b1fd6a3 GIT binary patch literal 396 zcmV;70dxL|P)Px$MoC0LR9Fe^lfO&DKorLtizVsqAR*xBo`g&{6uKGd;_fW|9nQK5ZjOSBbSb4y zH*`sM!NnzHa5s<)@%vQ+0SUPj-QGd+?&W>okNX@MjbsS{As_^VfDrfx0>1Cx1wpVF zQkr_^ndI!5h@g3?>-qsjXC`{;sAryuerzJj^L*>Nu5DS?jpupmEX(q)yeNu%46uUs zI!)87E?xV()pq*!Kzxe^XV57$_;pGUI7UokfX5_BF8b;54Xm;c{j?!AcE2R#KqR^o9hS(`6Rj|fu@DQwwL8cgD zgQgR#MOl_l@Jsk}4Deyx{YNadk{Fs q0G)r#w_4spKnMr{As__)j=(1pKWKd4NKrEY0000;H literal 0 HcmV?d00001 diff --git a/static/pic/pull_up.png b/static/pic/pull_up.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea9cc95921f45b27d5ad8b1d92803c833dbdd1e GIT binary patch literal 260 zcmV+f0sH=mP)Px#zDYzuR5%f1U>F6XAuxhMz{JF)41|gGGBYs>jg5^{fa=_USYAp>iu?KV=jRCN zBWN(tmBEaRj45nvYyr&7%&Y(X`_~CH{L8av&#vP$9IwHqrlv0c|NpNA8sKy4)Tu8| zo;>*@DJi)D$e%7FBl7@g_&r>PGvbl}y3`CPHv{NO&yy!lzC>1MZf-9A_wV2BK(UN7 zXU?2LmV>dGU<@pDAqxvj5W1ltbs#a29FSRvMc=5^Rz7lHr) literal 0 HcmV?d00001 diff --git a/static/pic/report.png b/static/pic/report.png new file mode 100644 index 0000000000000000000000000000000000000000..f87fb3fac454679bacb018b0dd537995aba95283 GIT binary patch literal 946 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 literal 0 HcmV?d00001 diff --git a/static/pic/see_close.png b/static/pic/see_close.png new file mode 100644 index 0000000000000000000000000000000000000000..17fdc3e263748f161f587476e2db7e4c3622923b GIT binary patch literal 1310 zcmV+(1>yRMP)Px(*hxe|RCodHmR)GuRTRLRq^+dP(mI@iX2KkZ+k+_Llog%KJy@vXG{tGHHuPiY z%iNy&FoZE5CZaE*H2tEb>InKU21TaTDubZ|nW9q|9juF5JEV1NZQ3-=ekbIHyDm-c zzw6d*oIl+EIrr<_bAR{TkCGDolzNt4 zKndLR1Y)t+s;;iCJ8qVV;BRnnaPT%)fBh~EJ32aQCMG7v=jZ3g(O+@tvyyE(J3F`I z?|<=ld<=g#x%lD)0z)s8g6VWRfc&JlxA$%r<15joudi=43l`1#TZN3c_~8V?=kpC& z#wwG^ zcV`eyO--l#e*Zpe!qp6NsJpxScB^bfR3KD{FF?4{I6(dY(eS&;7n3H0inYts3vIT@ z7i6|u9gdZkm)8Pn(ki=dsw@Q2c^KcGGJ^tPu%)G?4moeiib>~)5JMPF2ZO;zu{I?ViJutfQERMG@vWhu;k;Gmq?S6hTF|Jvy80XsmQjlB!*VUFFwE9@ z7iadjwY4P|bX%4zFUG*+{6 znnJTqa_xmBq094lqXUEzqAG4f5W9>$B0iy>B#DpWtMlh6 zBE%}^L^%i1Y`ziL9_!g2r>wem^dqF#fU=EAK8WrFpZ0Rd{z;#&(Pc{>B)^U%(KAfg zKP`H`uaJ-V+Dn;d5Q`a-a>Da%#0R3|YzpT?tkge}mroA9si~>QsC$^h?=Iv^w7E~} z(9a;gB>yk+1nEcm{*TOj*xrk>PcpPkb4^yVAhN}l<-6=2zFLcf>=+X?W@0u3Da<}} zzCo2#!lAexkpY1`!7A^O@_Zl9_)cE1ZPdvb^>a8JzL>AwQp=pe)YUle`_Eae9kk!g zGk0gPeyo1NYE$su=lUH3Mh&nd^xG;?VfDRgby>HDS8s@jXPDF>>Bq#LCn7SD;?>SA z(Ow>Dl5UB~=p>YY5>Nt4KnW-TC7=Y9fD%vwNfj;Q#;t literal 0 HcmV?d00001 diff --git a/static/pic/set_new_message.png b/static/pic/set_new_message.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ed67086425ba1b987eae5a82167f27dedccd3e GIT binary patch literal 1113 zcmV-f1g86mP)sDx;E^vMSkCHmk;c@s4%iZ4>XYVfON?^F`h2q6}I z5b+~Md;$#mU>Xx2eB#jr1H2$=Fc@ruWoLG0cK80x3@+Vnr*!G=wyExYn{&@S=ePek zd+(hiSY|_(885oPoql6og_m4m4$?+Hj822hi2n<;j7gA`GqEHl)I?t|vU!r50jyqB z*y&{FDE!JppjN7tQ#JD}U~WI(TXviuNo-gm&>3k(@Kf6N?~->{U5qAX0hg8kwkBT{ z5t94@G{#}Dyr}S6(h$8-L>?z8hR8c<<-C>%94PM$h?_*@prxEg7ZtQ2S*ZLk%Yd#g%d#I}MbsgMywwt@Z@kg}`%$JxAdwmZwy&Z}e`z@7yb{ZxasOrk$`s69Y z++^nMBQ;x)_YMHqQs<+sNylltp|uPgB?$8VDS)@ul8MNmrJQ}W=hE=hZIVhI2Vnkd ztFT(VJ+rg#RLv*c;lDuP-pet76PBA>-*$y#;E}=|k}}3f_KWaP8oBMFq*9+OQ2u6+ z!?8_dr>&fW_48CT%kbVKWk4XOsZ-nRx9p!g0^Hn&)E=+4ltg<_nv2o}Zce9#d;K>R z4)cDMpdn&BZK>=h3)iRhm7ywbA@u=)Xv=kyFYu+jcUFKK8V`il(_ejrP!&HS^;QCZ zWZc}1@h&-g@AIQQcAJP)N$fTZ83&R05z4Ce(ifcLbM+9S*xbcyE9K&PXo(eSY6#L= zb0ff4;?Fh6KFf6m6M?Cwt}D|#M)2mQf&;%>-d61cyWD zp&r$9uI6>cW?G%CtWq;`Ubb_b7>hH`4j+UV+3Pw(S^g0Ty72 z#NQCCiBY5W63oX$+0m`7t)nf#bwnB>d#s7G!!mYDV)wCC`j&vpZgE6wJ$k7E@Vg<# z6X|^RhgPAkw7wWwDV6jU+$I^o-cSO=DWb1 fP_;hhvQzjUt&B!Xn%->r00000NkvXXu0mjfHX$F} literal 0 HcmV?d00001 diff --git a/static/pic/setting.png b/static/pic/setting.png new file mode 100644 index 0000000000000000000000000000000000000000..d83f4bf4c4d251be8addf3246d57ffa7577c9e7a GIT binary patch literal 2513 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 b>U-cH*WbR$IJ8P;00000NkvXXu0mjfu{_jc literal 0 HcmV?d00001 diff --git a/static/pic/steady.png b/static/pic/steady.png new file mode 100644 index 0000000000000000000000000000000000000000..0caa0b0155cd4798434ccd74bf20f993263b796a GIT binary patch literal 43196 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

PqiNa$~E4XJ#a8s%?nsx`&SiQ7Wz{CE9c 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 literal 0 HcmV?d00001 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-indexed-list/changelog.md b/uni_modules/uni-indexed-list/changelog.md new file mode 100644 index 0000000..08fa71c --- /dev/null +++ b/uni_modules/uni-indexed-list/changelog.md @@ -0,0 +1,17 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.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-indexed-list](https://uniapp.dcloud.io/component/uniui/uni-indexed-list) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.8(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue new file mode 100644 index 0000000..19284bd --- /dev/null +++ b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue new file mode 100644 index 0000000..ee3a7ec --- /dev/null +++ b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue @@ -0,0 +1,367 @@ + + + diff --git a/uni_modules/uni-indexed-list/package.json b/uni_modules/uni-indexed-list/package.json new file mode 100644 index 0000000..125c0e7 --- /dev/null +++ b/uni_modules/uni-indexed-list/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-indexed-list", + "displayName": "uni-indexed-list 索引列表", + "version": "1.2.1", + "description": "索引列表组件,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景", + "keywords": [ + "uni-ui", + "索引列表", + "索引", + "列表" +], + "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" + } + } + } + } +} diff --git a/uni_modules/uni-indexed-list/readme.md b/uni_modules/uni-indexed-list/readme.md new file mode 100644 index 0000000..44ad84b --- /dev/null +++ b/uni_modules/uni-indexed-list/readme.md @@ -0,0 +1,11 @@ + + +## IndexedList 索引列表 +> **组件名:uni-indexed-list** +> 代码块: `uIndexedList` + + +用于展示索引列表。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-indexed-list) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "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": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "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" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4);

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 Eg0rfAumAu6 literal 0 HcmV?d00001 diff --git a/static/pic/sys_introduce.png b/static/pic/sys_introduce.png new file mode 100644 index 0000000000000000000000000000000000000000..72306d7bfcf20f3dd89e2c8b491ecb9045308f32 GIT binary patch literal 913 zcmV;C18)3@P)Pb86FuWr5aQk>h!!p6uI@8j#S2HOz}&)^4;aLBCeMzjr?lNAt{d=~+%`h{GC8m|W8ol> z0S4&s-mSom+3ScscpOtt@Z$XgF3eKlyGg_ZW%a55;?Fj;dI$18`hNfqc4b(RI)ixX zKVBn+C?oGV^;{@64>&)yVU_St| zU`O!0u}ln;>ms7c2Tv**%&J7(0ZguM=la;u!Kd zVnJiTMgIqkO^7f_&RO|X&rO+m=@nXc{tw5J@S}O*6U0i)=7EIx4ftzTFtwf6QN2_~ zraI9<<%0p|E^)V^75uZndSHusgKwGvY{l$VOpgH@)Ek_hDM#Jm#}(M>v_Ppcsl~3A z0o#dOCyVVUW}Beqyjz8ojS}*f`br;9r*0kakpCv)KozLAf>VHz#ZB_T!s%+a4!GdI z1H2EM#N&gSwHIm;*k_gRo#pw;4*z@4IcZf5+v)61Jbegu9Tc7LS}S_EK3#cv^aPJ+ zTDxqW!l%|QBQtplW4S~3h+5-&$_KmWtcIh+7WL0_U5`^vr)GpMPyVfEhX0JSX_>+f zsydmpfgj47&S~%G`lg!=3Ht>C!){5BzraYc~kIi_SB^TUy1(Bw#=hYwoTD}v! z{&-o;?Zd*Ib*Hi9xKo~X0~=qZzTZb@3RNGt)Rp08`VAEQH_@aO+Bj*x(E8FZ^)l22 nt{0%y-`l{=R=llnvlYG#iFx5XJOJgB00000NkvXXu0mjfz@5XO literal 0 HcmV?d00001 diff --git a/static/pic/terminal.png b/static/pic/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..953276745bec157b0d0b013af1af7f7bdf1dfffb GIT binary patch literal 36318 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 literal 0 HcmV?d00001 diff --git a/static/pic/terminalStatus.png b/static/pic/terminalStatus.png new file mode 100644 index 0000000000000000000000000000000000000000..e14fb874705c8344d9de260ee297f51255d162bb GIT binary patch literal 374 zcmV-+0g3*JP)_8o00001b5ch_0Itp) z=>Px$FiAu~R7efQRxNYFKoH$`wKeE!Jk->bkD20;`~rRzzW`a^&NQK>2JqErOf6a7 zZgLr>1A|F&Yc|>3-FthtdoPeHrlaATs4hfhERZMq$1B6`hai8Pd*B+m0BdY^pZ_P} zGN9u@Uka=UKDmrH_6%eabcuZb8`rD}=;V1Mr{bNAd+}o{9&(h2Fh{oC*!oVO%v^q2 z2ag#Ui6Aew6TxG??JZ{>!Ohz)8zv22aD{%@OXn6a3tsJ=BUgazG!kH|r7~g%@AFgy zc*m4Qn2G>#?FbIZ@QH0lkS8NRY!bja9Rcctf$Qt=tF`<8R(8|{eD9`Z5mF#{6vta* z8;|={OiY>+aCM?UbV4GEQKg7=8@f7CAXpPw;~B>VU5+V2l@eOGmg6|ae3w5YXETjv U(0__i%m4rY07*qoM6N<$g3s5TApigX literal 0 HcmV?d00001 diff --git a/static/pic/time.png b/static/pic/time.png new file mode 100644 index 0000000000000000000000000000000000000000..e8aadd9ef5aaa2bd33ee4949f7eb3182f5768dbe GIT binary patch literal 1923 zcmV-}2YmR6P)Px+JxN4CRCodHn{Q}VRUF5+HB#qBW@FmaAjx6xf^CpWVo|~vX-I_z772zgd{Mm! zlJZZ*dMCaRDuW_?p_m9Rh9HrmIFmW>oseLnG2JK)rt{yJeZIHzdpJJad!PH<=Xv%A z?}5ADx##}Q@Av(EpL5PV_nfn;sw`y;WDH~sWDH~sBxRsFsbX5a6)RRu9~l{0IyN@; z5;mUaYI*SB!CYiRb#?U&^0&zklfQ=igX?@vP0h)=y1L%u$B*CPeq2&Ti0J6(m^L&t zw2I)?6X;4JnU*4&yVO5Q{k=_1P2ES19J!mqM&c@EC4yhSc6fMrBLQq9fH{d#6i~$8 zAog}NG&FoqD;X`Ip6YSgh-hnTdlRr-pjecT#0Aog?B^Pw=?~P_)?RIHZvJ~ob7c5AY>E7|O12zYlr1v$ON} z?c2AH`Oo9>=+^Y~^t_18)#$B5F7WlSd784d{r&xy{qj=sB@sa@SO%a&0BAB0fV@sw z7yWv7Ir_C5Z#H9h3wCFlALI~aYiJ#(yt35U)I>nS27rBo=f|D*djQ*2Utj+<{rKP1 zh$1R7{>-|0^X8}c{LuGFH`~b0^;NqjGb zj6+Y0KbTVpI0vZJC* z{DyPu4n5@GhJ+CVG+q)i>hN`dtJC>Z*L)@In30$W{R%kj;|c~w*AkXZ1PLziDv<$> zQ(ns$;#qr|)>&gl3rQUAN5@Fe1V`Or+*^W=Q~remY=f@6$>H?X66F)M2sc^!*;%|t ze|)*rfstSHJwWdykUyDRy>aHunZFVt4pGto%D8omM?sgx?pwu9x(c=kO`8GRW&Uxp zt5g!4tzFpFyr7jJHkR>I$!L+kFyQkceBiZhe5EVA_nc>zXGdF`PhWmgxZe zNz12|!XQarIlVB}rT(7tkfJ9zfWo^|;4nPEs-Z}~zpk_dGR zD!*n1FnZYXlUe#WX%#D790egq5~1ZaY6pD`g zLFVDj#Sw=+k_eiYmfVBHlzK`L;p6q=uz12`BoQb#SOpeWrxX!+cyn=BJYh1D2%6Un ztFUn4!hbA36{L^Xk0TCyNXYYRr%t@i%%i0Dqo3&ujPEIj0NEt~4HHNtYBKS;hCSNfku)P?-i;;;F`c=FdU!_7@ekJXbcx8&CV2bM+ z*Q_=UMMSyNjZzKLDxM9q;p0Uo7e|<`l|>SPf;MD>1pAdB;vFOhyK$^9fW4w&G!Uj`kwM3{18%w`Urxp$NZ=qae&kB3SXc1G7iX0%T}IcG4#w zr|>I|B%mXSP-Tqn^^B}5X6ehTH*Q&nZ=E^J!*9i*GL{GqX8Z!H!M8m|7qIkI(rR-k zf-)8gpK!{gaO{JadD=t?w$(7+*3#0lhw?;C=w z2eE6P2A`ZbaU$_zQf!M5*qJkD?m=8o9zteoYhL-umfVp6?UN{7&@rR`v&sHW*iKh6 zc*(TNvD1}^2*Kf_sFxP8M0xc;u6A~qf~9knO;ifmoIcHV-_m076zm#i5E9ms*KTvL zXTW{8cBAe2L`b(AuGRHma~e71a25?GF%jBorxmQh!##Pyp$=&rm?$!w-vbVZAnAO> z8sXGUu_-YTGOR-wOj$R1PC9XZ3Q#&bF>XozM7a%CdZRpA=PZpB z*Iys)leb2Oq&r^JMK(B8;y9uGMBO3~NnP%WLRN-Lu$!!1Uum( zRZ1ExLoMbNij=AFA3S-mv)hb;jDd`SjDd`SjDd`SjDcbq_zzsNUYt=6o8|xj002ov JPDHLkV1inkt(5=( literal 0 HcmV?d00001 diff --git a/static/pic/transient.png b/static/pic/transient.png new file mode 100644 index 0000000000000000000000000000000000000000..639c5f5cde3189e41d08235b0c25dcfa7a2c4ef9 GIT binary patch literal 24553 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 literal 0 HcmV?d00001 diff --git a/static/pic/voltage.png b/static/pic/voltage.png new file mode 100644 index 0000000000000000000000000000000000000000..c49ed23d87ba9851239f49f7da784875d7380f89 GIT binary patch literal 1633 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 literal 0 HcmV?d00001 diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..f0f426c --- /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:24upx; +$uni-font-size-base:28upx; +$uni-font-size-lg:32upx; + +/* 图片尺寸 */ +$uni-img-size-sm:40upx; +$uni-img-size-base:52upx; +$uni-img-size-lg:80upx; + +/* Border Radius */ +$uni-border-radius-sm: 4upx; +$uni-border-radius-base: 6upx; +$uni-border-radius-lg: 12upx; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 10px; +$uni-spacing-row-base: 20upx; +$uni-spacing-row-lg: 30upx; + +/* 垂直间距 */ +$uni-spacing-col-sm: 8upx; +$uni-spacing-col-base: 16upx; +$uni-spacing-col-lg: 24upx; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:40upx; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:36upx; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:30upx; \ No newline at end of file diff --git a/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 @@ + + + + + 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 0000000000000000000000000000000000000000..835f33bc9411461b8b9046b3fec742e921d6ce3a GIT binary patch literal 35760 zcmeFacbp?vl{Q?rN>WLsSXIigCAC7gI!S6tox^m`be^1}CwPJ>yxZ{uSzi{WC_=LI+*Wx!<-H!v})21fuKMZQ#fB2Fs zuEGwU_ZyDmuR3&e_s&PS@Be}0T=(JF$l;w=9Als0-iQ4lE^0cm^YDeWhnK#G<4!$@ z>-QZydhsP6Kl0Pv9Cw|EbP-?YO$@C;`+ zuKnR1zxV)MXnddfv56Dn_-W<%#_jZ^d%1f!hyI(6O8C!lXY}93nl=3f9^gzbYS03Jm0vJ;T)Z1IKntfUtypB#zx`e6wG3 zC5AhB&Me^QdH${3yL1otSUp#NN^cKN_yKnkm%XqxczWUgrT^Oo|6lL`SPy&+DZ_DX z1{?B^82rf|!cpSXHhg1*;kZecHy+MI*MqCu>g9T0eYieaf9edzAC9!tJL|pm0UQ~l zBQN;JaG!_sb8)VT%i=%By_I_#_ZIFh?(N(=xVtf?-^|^~y@`7RcMEqbcN=#*_eSmx z?)BVjxU0EqFm9T;Q`~9pTJAdTdhWH{>+qBtxEr~fxSP3Gb60T(xkKDx?g)33JH{R7 zPH-1465x0fg%5CGeb33>TxSiZCZa24wyO7(&Q z>$wfwMs5?gnVaOMxM^;NYvpFSIc_<(f-7(s&u0CxL#u8VbF$klItIryQ@x|5W z48lm`>dOtnnB(dz48rK+>MISxIOOW948n-y>Z=XH*yQSK48kbo>T3axcUVKK~8Y>od!W-aP?gVL3VKU-3CF5aP>U~L7s5+3k`x~;p%%0f{fwn z`wW7#;p+Phg52Ti2MmG);_4R}1X;w@scs-hC9Y0&13^AJNK#+l4o$3aH zH00`3HxT3^SEssxAR)Or)eQt$$+z7tkWDxWPSHIIBXb!IaW`m$ZxcXZRf;QpmZ#4*d zg{!~KAZQq_ewRVeHC+Ae20`m^^>-Kq{lnGoHVB%CtKVY~bP`v;*C1#ou700E&{JIf zeuJQ~xcWN{g6`t#?=lEljH|!fAm}r${tpI0vvKtY41$j1>hCcK+K#I~Xb|)sSAVZT z(12Y1eFi}na`pEc1g*%`|Ir}mN3Q+>gPp}tAE%avLosrF^GJG z`bQ0dZsqD9GYDFitAE@e=v%J-34@?{x%wv!f)3{DpE3yAn5#cz5cD!v|Fl8S&|Lj9 z20>SI_0JjvtVjlpxwFpV+N5QQ~$g{(D+>a3kE^= zbM-G81S^26f5{-&16=*f2Ej7m>R&MkHUd}wszKz<)E_qpb^}-cnn7g6)t@j3wggxI zxp1QBm2=klxXa|a&TVx+;Qp=WwVt{>D}O~9QXW)O>O0h5db_-@^8Ud$^pPT-1=NS-v_4k2r|_kM*0!vaW9xyNll~`AaKH zuPQxR4wv6t{%QC2?wh**v$DGKU?rS_5?F|crGafkiL7dNk-%Y_E4VmkSn6>Hb;SUukEx3l0# zej=BS$yT%Av8Uc*J`xpdRw>aQ5n{34Scli{%@0hjo|#!%t;CXMOO1~vM@By$$wu(0 z7+*JsbCF0c%-{dHFL+pQI~s3&zjaOf89{d%!`6o3fsCO(`6